我们先来看个经常会遇到的笔试题,以此代码进行分析
#include <stdio.h> int main() { int i = 0; int j = 0; int k = 0; ++i || ++j && ++k; printf("i = %d\n", i); printf("j = %d\n", j); printf("k = %d\n", k); return 0; }
那么在第 9 行,我们经常会认为先执行 && 运算然后进行 || 运算。那么我们想着就是先执行 ++j && ++k,执行完之后 j 和 k 就分别为 1 了,那么整个表达式的值也就为真了。++i 就不执行了,当然 i 就为 0 了,下来我们来看看结果是否如此
结果刚好跟我们分析的相反。那么我们忽略了一个问题,那就是程序中的短路。在逻辑表达式中, && 比 || 具有更高的优先级。在 && 和 || 混合运算时,整个表达式被看做 || 表达式,编译器从左向右开始计算 && 表达式,当某个 && 表达式的值为真时,停止计算,整个表达式的值为真。那么我们的第9行可以这样看:++i || ++j && ++k ==> ++i || (++j && ++k) ==> (true && ++i) || (++j && ++k)。那么这样分析后,++i 就为 1 了,整个表达式的值就为真了。自然也就不会向后执行了,所以结果应该是1、0、0。
我们下来来看下这个运算符"!"。C语言中的逻辑非 "!" 只认得0,只知道见了0就返回1,其他就都为0。我们来看下示例代码。
#include <stdio.h> int main() { printf("%d\n", !0); printf("%d\n", !1); printf("%d\n", !100); printf("%d\n", !-1000); return 0; }
由上面可知,第一个为1,其他全为0。编译后结果如图
结果也确实如此。我们今天学习了逻辑运算符相关的知识,总结如下:1、程序中的逻辑表达式遵从短路规则;2、在 && 与 || 混合运算时:整个表达式被看做 || 表达式;从左向右先计算 && 表达式;最后计算 || 表达式;3、逻辑非 "!" 运算符只认得 0 碰见 0 返回 1,否则则返回1。只有 0 才代表假,其余所有值均代表真。后面我们会继续对 C 语言的学习。
欢迎大家一起来学习 C 语言,可以加我QQ:243343083。
原文地址:http://blog.51cto.com/12810168/2096301