我们在 C 语言中经常会遇到逻辑运算符.|| 是从左向右开始计算的, 当遇到为真的条件时停止计算, 整个表达式为真; 所有条件为假时表达式才为假. && 是从左向右开始计算, 当遇到为假的条件时停止计算, 整个表达式为假; 所有条件为真时表达式才为真.
我们先来看个经常会遇到的笔试题, 以此代码进行分析
- #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 语言的学习.
来源: http://www.bubuko.com/infodetail-2556731.html