我们在 C 语言中经常会遇到逻辑运算符。|| 是从左向右开始计算的,当遇到为真的条件时停止计算,整个表达式为真;所有条件为假时表达式才为假。 && 是从左向右开始计算,当遇到为假的条件时停止计算,整个表达式为假;所有条件为真时表达式才为真。
创新互联拥有网站维护技术和项目管理团队,建立的售前、实施和售后服务体系,为客户提供定制化的成都做网站、成都网站制作、网站维护、德阳机房托管解决方案。为客户网站安全和日常运维提供整体管家式外包优质服务。我们的网站维护服务覆盖集团企业、上市公司、外企网站、商城网站开发、政府网站等各类型客户群体,为全球千余家企业提供全方位网站维护、服务器维护解决方案。
我们先来看个经常会遇到的笔试题,以此代码进行分析
#includeint 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。
我们再来看一哥示例代码,比较有迷惑性,代码如下
#includeint g = 0; int f() { printf("In f()...\n"); return g++; } int main() { if( g || f() && f() ) { printf("In if statement: %d\n", g); } printf("In main(): %d\n", g); return 0; }
我们来分析下这个代码,第14行表达式便可以看成 (true && g) || (f() && f()),那么由于 g 为0,前面为假,继续向后执行。这是便调用到 f() 了,便会打印出 In f()... 这条语句,它在内部返回的 g++,就是先返回 0 再进行++操作。由于 f() 已经返回 0 了,所以后面的 && 表达式为假,因而 main 函数中的 if 中的打印语句得不到执行。但是由于上面已经 g++ 了,所以这时 g 的值就为 1 啦。我们来看看编译结果
我们下来来看下这个运算符"!"。C语言中的逻辑非 "!" 只认得0,只知道见了0就返回1,其他就都为0。我们来看下示例代码。
#includeint 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。