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

Why is true && false equal to 1 in C++?

提问人:Oleksandr Novik 提问时间:8/3/2021 最后编辑:songyuanyaoOleksandr Novik 更新时间:8/28/2021 访问量:653

问:

我正在玩布尔值,最后得到了这行代码:

std::cout << true && false;

出于某种原因,这会产生.如果要求双方都为真,这怎么可能产生?1&&1

C++ 运算符 优先级布尔 逻辑

评论

5赞 Dr Deo 8/3/2021
因为它实际上被编译器视为 (std::cout << true ),所以函数结果被 AND 和 false 并丢弃结果。使用括号来避免运算符优先级问题 en.cppreference.com/w/cpp/language/operator_precedence 例如 std::cout<< (true & false)
2赞 8/3/2021
IMO,关于 C << 和 >> 运算符优先级的设计决策是一个可悲的错误。
1赞 Pete Becker 8/3/2021
@YvesDaoust -- 在 C 语言中,优先级执行预期的操作。C++ 中的问题是 和 被重载用于流,并且在混合算术/逻辑表达式中工作的优先级不适用于流操作。<<>>
1赞 8/3/2021
@PeteBecker:不,你不明白。a << b + c 应该表示 (a << b) + c,而不是 a << (b + c)。这是K&R的错误。
1赞 8/4/2021
@Caleth:重点不在于你会做什么(比如拒绝几个世纪以来的数学符号)。关键是K&R犯了一个设计错误。

答:

6赞 rawrex 8/3/2021 #1

由于运算符的优先级,打印 ,然后 (the ) 的返回值与 .trueoperator<<std::cout&&false

(std::cout << true) && false; // Equivalent 
13赞 songyuanyao 8/3/2021 #2

因为 的优先级高于 ,所以与 相同(即先打印出来,然后将返回的转换为 ,用作 的操作数,最后丢弃结果)。operator<<operator&&std::cout << true && false;(std::cout << true) && false;truestd::coutboolfalseoperator&&

请注意,可以通过运算符 bool 转换为,即使它被标记为 .std::coutbooloperator&&explicit

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

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

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