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 语言进阶课程》。
如有错漏之处,恳请斧正。