布尔表达式的奇怪评估

时间:2018-01-21 15:47:02

标签: c++ boolean operators operator-precedence

为什么以下表达式的值为false?

bool a = false;
bool b= true;
std::cout<< a || !b && !a || b;

为什么在添加括号时值会发生变化

bool a = false;
bool b= true;

std::cout<< (a || !b && !a || b);

不应该像这样推出括号:

a || (!b && !a) || b

,结果为falsefalsetrue等于true

1 个答案:

答案 0 :(得分:0)

正如评论中已经提到的,在第一种情况下,表达式归因于operator precedence被评估为

(std::cout << a) || !b && !a || b;

std::cout << a的结果是std::cout对象本身的引用,它在C ++ 03中可转换为从bool继承的operator void*()std::basic_ios 。在C ++ 11中,有operator bool()代替,它允许所谓的上下文转换

因此,其余部分只是一个布尔表达式,其结果将被丢弃。