Summary
1)&&表达式从左向右计算
,当遇到条件为假时,整个表达式为假,后面的表达式都不再执行,是为短路规则
;
2) ||表达式从左向右计算
,当遇到条件为真时,整个表达式为真,后面的表达式都不再执行,是为短路规则
;
3)逻辑表达式中&&比||的优先级更高,表现为:当&&和||在同一个表达式中出现时,整个表达式被看作一个||表达式
。先计算&&表达式,最后计算整个的||表达式,某个表达式为真的时候,整个||表达式就短路了。
4)C语言中的逻辑非"!"
只认识0(假)
,其他的任何值都是非0(真)
。
"!"常用于if语句
中判断表达式是否为假;也可用于将一个整数变为1,如!!100;
逻辑运算符的隐蔽知识点
1、&& 和 || 中的短路规则
||
从左向右
开始计算:当遇到条件为真时停止计算,整个表达式为真;所有条件都为假时表达式才为假int LogicFunc(int i) { printf("LogicFunc(int i) : %d\n", i); return i; } int main() { if(LogicFunc(1) || LogicFunc(0)) { printf("Logic expression is true"); } else { printf("Logic expression is false"); } } 输出: LogicFunc(int i) : 1 Logic expression is true 原因:逻辑||表达式的短路规则,第1个表达式LogicFunc(1)返回1,为true,第二个表达式由于短路规则并未执行
&&
从左向右
开始计算:当遇到条件为假时停止计算,整个表达式为假;所有条件都为真时表达式才为真int LogicFunc(int i) { printf("LogicFunc(int i) : %d\n", i); return i; } int main() { if(LogicFunc(0) && LogicFunc(1)) { printf("Logic expression is true"); } else { printf("Logic expression is false"); } } 输出: LogicFunc(int i) : 0 Logic expression is false 原因:逻辑&&表达式的短路规则,第1个表达式LogicFunc(0)返回0,false,第二个表达式由于短路规则并未执行
2、&& 和 || 混合运算时的规则
逻辑表达式中&&比||的优先级更高,表现为:当&&和||在同一个表达式中出现时,整个表达式被看作一个||表达式
。先计算&&,最后计算||。
代码阅读
// 以下代码的输出是? int i = 0; int j = 0; int k = 0; int t = ++i || ++j && ++k; printf("t = %d\n", t); printf("i = %d\n", i); printf("j = %d\n", j); printf("k = %d\n", k);
代码分析
输出: t = 1 i = 1 j = 0 k = 0 分析: ++i || ++j && ++k; ==> 等价于一个逻辑或表达式 (1 && ++i) || (++j && ++k); 左边的逻辑与表示,1为真,继续计算++i,i自增1,然后取值,所以左侧表达式也为真 这时候遇到了逻辑或表达式的短路规则:左侧表达式已经为真,右侧的表达式不再计算。 因此,j和k仍然为0
3、"!"究竟是神马
C语言中的逻辑非运算符只认得0,碰见0就返回1;否则就返回0;
printf("%d\n", !0); // 1
printf("%d\n", !-1); // 0
printf("%d\n", !100); // 0
printf("%d\n", !!100); // 1
本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。