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

标签 c++ operator-precedence

为什么我在第 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 precedence ,这operator<<高于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||另一方面,'s 的操作数是多余的。

关于c++ - 以相反顺序打印表达式时得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34795721/

相关文章:

c++ - 返回一个字符指针(内存泄漏)

c++ - 列表初始化中元素的评估顺序

c++ - 静态全局变量初始化顺序

c++ - 以 cv::Point 为键的 std::map

c++ - 如何将 FBO 的文本附件绘制到默认帧缓冲区?

powershell - 即使分配了新值,变量也会保留先前的值

c++ - 评估顺序示例

c++ - if 语句中运算符优先级的解释

c++ - 从文件中读取 double

c++ - 是否可以调用 std::invoke 使其可以使用函数指针?