C语言之逻辑运算符&&和||
前言:伍弟子最近在刷剑指offer的面试题21的时候给||逻辑运算符坑的惨惨滴,足足浪费了我好些时间,耽误了我西行的脚步;所以今天索性在此做一个小总结给自己警醒一哈;
1 &&和 2 ||这两个逻辑运算符应该是做开发以来最常用的两个运算符了,平常使用那是顺手拈来,怎么会有坑给人掉呢?可能也只能怪伍弟子水平不够了,咱话不多说,开整!
首先我们从概念上重新梳理一下&&和||:当我们在表达式之间使用&&和||的时候,程序是从左到右运行这些表达式的,并且在这个过程中只要有足够条件判断最后结果是对是错,程序则停止继续运行整个表达式,直接去运行下一个语句。看懂了吗,光说不练假把式,直接整两个例子:
// != 和 == 优先级都比 = 高
// !=, == 等关系运算符优先级比逻辑运算符高
// 所以此处我没有加括号()
bool a = 1 != 2 && 1 == 1 && 2 == 2; // a的初始化值为false
bool b = 1 == 1 || 1 != 2; // b的初始化值为true
从上面两个例子我们知道,当初始化a的时候,第一个表达式的结果就是false,后面的逻辑运算符又都是&&,所以我们已经知道了整个表达式的最后结果为false;所以后面两个表达式都不会执行,程序直接执行下一条语句去了;
初始化b的时候,第一个表达式的结果就是true,而且后面的逻辑运算符都是||,所以同上,最终的结果为true;所以后面一个表达式也不会执行,程序直接跳过;
听起来很简单是吧,嗯我也是这么觉得的,为啥说会给坑呢?那就看看:
// 掉坑题目的简化版
bool test() {
printf("555\n");
return true;
}
bool a = true;
a = a || test();
简单吧,也简单,就是一开始没想到,因为在我刷题的时候test()是一个必须要执行的函数,但是第一个表达式是true,又因为逻辑运算符||,test()根本没有执行, 所以最后出现了意想不到的结果,就掉坑了;
顺便贴上解决办法吧,总结一下:
// method 1
bool a = true, b = test();
a = a || b;
// method 2
bool a = true;
a = test() || b;
勿以恶小而为之 --《三国志·蜀志传》
欢迎赞赏评论指出不当之处;
更新日志
25/05/2020 updated version 1.0.0
本文介绍了C语言中逻辑运算符&&和||的用法,特别是它们的短路特性,通过实例说明了如何可能导致意料之外的结果,并提供了一个导致问题的代码示例,强调在编程时需要注意的细节。最后,提出了解决问题的方法。
1034

被折叠的 条评论
为什么被折叠?



