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

Getting different result when printing expression written in reverse order

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

1
1
0
1

我不应该在第 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
}    

因为operator precedenceoperator<<operator||高,只有

(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|| 操作数周围的括号是多余的。