【问题标题】:Strange evaluation of boolean expression布尔表达式的奇怪求值
【发布时间】:2018-01-21 15:47:01
【问题描述】:

为什么下面的表达式的值是假的?

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

【问题讨论】:

  • any good beginners book 中了解operator precedence。请记住,&lt;&lt; 确实是 左移 运算符。
  • 查看compiler warnings,您将获得该代码。
  • && 的优先级高于 ||,因此该值应为 true。
  • 看来您要么没有阅读或不了解 cmets。 &lt;&lt; 的优先级更高,所以第一个代码被解释为(std::cout&lt;&lt; a) || !b &amp;&amp; !a || b
  • 好的,我知道了,谢谢

标签: c++ boolean operators operator-precedence


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2010-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多