印象中的逻辑运算符:
---学生:老师,在我的印象中,逻辑运算符用在条件判断的时候,真挺简单的,还有必要深究吗?
---老师:逻辑运算符确实在条件判断的时候用的比较多,但是并不能说简单。。。
请思考下面的示例:
1 #include <stdio.h> 2 3 int main() 4 { 5 int i = 0; 6 int j = 0; 7 int k = 0; 8 9 ++i || ++j && ++k; 10 11 printf("%d ", i); 12 printf("%d ", j); 13 printf("%d ", k); 14 15 return 0; 16 }
我们分析一下第九行的代码,逻辑与&&的优先级更高,应该限制性++j和++k,然后根据短路原则,++i不用执行,但是真的是这样吗?
运行结果和我们分析的完全相反,为什么呢,逻辑与的优先级是更高啊!
程序中的短路:
--- || 从左向右开始计算:
- 当遇到为真的条件时停止计算,整个表达式为真
- 当所有条件为假的时候表达式才为假
--- && 从左往右开始计算:
- 当遇到条件为假的时候停止计算,整个表达式为假
- 当所有条件为真时表达式才为真
咦?短路原则需要遵循从左往右开始计算,那么是不是与我们认可的优先级原则矛盾呢?
其实没有:逻辑表达式中,毫无疑问 && 比 || 具有更高的优先级
其实上面例子中的第九行代码可以稍微改变一下结构 ++i || ++j && ++k; >>>>> (++i) || (++j && ++k); >>>>> (true&& ++i) || (++j && ++k);
在 && 和 || 混合运算的时候,整个表达式被看做 || 表达式,编译器从左向右开始计算每一个 && 表达式(遵循了优先级原则),当某个 && 表达式的值为真的时候,停止计算,整个表达式的值为真。
理解完了上面的代码可以尝试着看一下这段代码:
1 #include <stdio.h> 2 3 int g = 0; 4 5 int f() 6 { 7 printf("In f()... "); 8 9 return g++; 10 } 11 12 int main() 13 { 14 if( g || f() && f() ) 15 { 16 printf("In if statement: %d ", g); 17 } 18 19 printf("In main(): %d ", g); 20 21 return 0; 22 }
具体的分析思路和上面一样!
还有一种逻辑运算符 “!” 它究竟是什么呢?
C预言中的逻辑非 !只认得0,只知道见了0就返回1.因此当其碰见的值不是0时,其结果为0.
示例:
1 #include <stdio.h> 2 3 int main() 4 { 5 printf("%d ", !0); 6 printf("%d ", !1); 7 printf("%d ", !100); 8 printf("%d ", !-1000); 9 10 return 0; 11 }
这段代码的运行结果就很好的说明了逻辑非!运算符只认得0。
小结:
- 程序中的逻辑表达式遵从短路规则
- 在 && 与 || 和混合运算时:
- --真个整个表达式被看做 || 表达式
- --从左向右先计算 && 表达式
- --最后计算 || 表达式
- 逻辑非!运算符只认得0
- --碰见0返回1,否则统统返回0,也就是说在C语言中只有0才代表假,其余的所有值均代表真。