输出流中的运算符优先级C++

C++ operator precedence in output stream

本文关键字:优先级 C++ 运算符 输出流      更新时间:2023-10-16
int a = 1, b = 2;
int c = a*b + b==0; // c = 0
cout << a*b + b==0; // outputs 4

c的计算结果为 0,因为*运算符的运算符优先级高于== +运算符,因此c的计算结果实质上是(a*b+b)==0为假。

为什么在 cout 语句中放置相同的表达式会输出 4?

因为这些运算符的优先级是operator*> operator+> operator<<> operator== .那么cout << a*b + b==0;等同于(cout << ((a*b) + b)) == 0;.

那么((a*b) + b))的结果,即 4将被打印出来,则返回值 (cout << ((a*b) + b)) ,即 cout0进行比较。在 C++11 之前,cout可以通过运算符 void* 隐式转换为 void*,当 steram 有任何错误时,它会返回一个空指针。因此,这里将其与0(即空指针)进行比较,并且对结果没有进一步的作用。

answr by @songyuanyao 已经解释了代码的行为。

我想回应 OP 说,编写易于遵循的代码会好得多。

如果您看不清表达式的逻辑,请简化它。使用括号使其更易于理解。除非你正在为混淆代码竞赛编写代码,否则没有理由编写这样的代码。

转换这些线

int c = a*b + b==0; // c = 0

int c = (a*b) + (b==0);

或到

int c = ((a*b + b) == 0);

取决于您的意图。