打印以相反顺序写入的表达式时获得不同的结果

时间:2016-01-14 17:17:57

标签: c++ operator-precedence

为什么我在第3行得到不同的结果? 输出是:

1
1
0
1

我不应该在第一行收到。 3输出1而不是0?它具有与其他行相同的语法。

#include <iostream>
using namespace std;

int main()
{
    int x = -3;
    bool a = (x % 2 == 1) || (x < 0);
    bool b = (x < 0) || (x % 2 == 1);
    cout << a << "\n";                              // line 1
    cout << b << "\n";                              // line 2
    cout << (x % 2 == 1) || (x < 0); cout << "\n";  // line 3
    cout << (x < 0) || (x % 2 == 1); cout << "\n";  // line 4
}    

1 个答案:

答案 0 :(得分:10)

由于operator precedence operator<<高于operator||,只有<{p>}

(x % 2 == 1)

部分已打印。剩下的就像做cout || (x < 0);一样。 (请注意,std::cout与任何其他std::basic_ios派生流一样,可以隐式转换为bool

使用括号,它看起来像这样:

(cout << (x % 2 == 1)) || (x < 0);

第4行打印1,因为(x < 0)是真的并且您切换了操作数 - 现在应该很清楚了。

解决方案:operator||电话加上括号:

cout << (x % 2 == 1 || x < 0);

另一方面,围绕operator||的操作数的括号是多余的。