布尔表达式求值异常:为何结果为false?加括号后结果为何变化?
问题解答
1. 原表达式输出false的原因
你这里踩了运算符优先级的大坑!C++里,流插入运算符<<的优先级比逻辑或||、逻辑与&&都要高。所以你的代码:
bool a = false; bool b= true; std::cout<< a || !b && !a || b;
会被编译器偷偷解析成:
(std::cout << a) || (!b && !a) || b;
咱们一步步拆解开看:
- 首先执行
std::cout << a:把a的值(也就是false)打印到控制台,这个表达式返回的是std::cout对象本身。 - 在逻辑判断里,
std::cout对象会被自动转成bool值——只要流没出问题,就会变成true。 - 接下来是
true || (!b && !a) || b:逻辑或||是短路求值,只要第一个操作数是true,后面的代码根本不会跑,所以整个逻辑表达式的结果是true。 - 但你看到的输出是
false,这是因为控制台打印的是a的值,而不是整个逻辑表达式的结果!你误以为输出的是表达式最终值,但实际上是cout << a的输出内容。
2. 添加括号后值变化的原因
当你给整个逻辑表达式加上括号:
std::cout<< (a || !b && !a || b);
括号直接改变了运算顺序——编译器会先算括号里的逻辑表达式,再把结果传给cout输出。
先算括号里的内容,记住逻辑与&&的优先级比逻辑或||高,所以括号内的表达式和你说的a || (!b && !a) || b是完全等价的,计算步骤如下:
!b是false(因为b是true),!a是true(因为a是false),所以!b && !a的结果是false && true = false。- 然后依次算逻辑或:
false || false = false,再false || true = true。 - 最后
cout输出的是这个逻辑表达式的结果true,和之前输出false的情况天差地别——这就是括号改变运算顺序带来的差异。
至于你问的是否应该写成a || (!b && !a) || b:
完全可以!这种写法只是把C++默认的运算符优先级显式写出来,让代码可读性更高,避免像第一个问题那样的优先级误解,而且计算结果确实是true,和原括号内的表达式结果一致。
内容的提问来源于stack exchange,提问作者Pablito Escobar
相关产品推荐
相关产品推荐

