为什么在C++中true && false等于1?

9

我在玩布尔型变量时尝试了以下代码:

std::cout << true && false;

出乎意料的是,这段代码输出了1。如果 && 需要两边都为真才能输出1,那么这怎么可能呢?


5
因为编译器实际上会将其视为 (std::cout << true) ,然后函数结果与 false 进行逻辑与操作,并且结果被丢弃。使用括号以避免运算符优先级问题 https://en.cppreference.com/w/cpp/language/operator_precedence,例如 std::cout<< (true && false)。 - Dr Deo
2
在我看来,关于 C++ 中 << 和 >> 运算符优先级的设计决策是一个令人遗憾的错误。 - user1196549
1
@YvesDaoust -- 在C语言中,运算符优先级按预期工作。而在C++中的问题是,<<>> 这两个运算符被重载用于流操作,而在混合算术/逻辑表达式中有效的优先级对于流操作来说并不适用。 - Pete Becker
1
@PeteBecker:不,你没理解。a << b + c 应该表示 (a << b) + c,而不是 a << (b + c)。这是 K&R 的错误。 - user1196549
1
@Caleth:重点不在于你会做什么(比如拒绝几个世纪以来的数学符号表示法)。重点是K&R犯了一个设计错误。 - user1196549
显示剩余3条评论
2个回答

13
因为operator<<operator&&precedence更高,所以std::cout << true && false;(std::cout << true) && false;是相同的(即首先打印出true,然后将返回的std::cout转换为bool,它与false一起用作operator&&的操作数,最后将结果丢弃)。

请注意,std::cout可以通过operator bool转换为bool,即使它被标记为explicit,也可以在contextual conversions(包括作为内置operator&&的操作数)中使用。

如果流没有错误并准备好进行I/O操作,则返回true。具体来说,返回!fail()

您可以通过添加括号来指定优先级。

std::cout << (true && false);

6
由于运算符优先级,首先会打印true,然后返回operator<<(即std::cout)与false&&
(std::cout << true) && false; // Equivalent 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接