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

C++ operator precedence in output stream

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?

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

然后打印出((a*b) + b))的结果,即4,然后将(cout << ((a*b) + b))的返回值,即cout与[=20=进行比较].在 C++11 之前,cout 可以通过 operator void* 隐式转换为 void*,当 steram 有任何错误时,returns 是一个空指针。所以在这里它与 0 (即空指针)进行比较,并且对结果没有做更多的事情。

已经解释了代码的行为。

我想通过说编写易于理解的代码会更好来回应 OP。

如果看不清楚表达式的逻辑,就简化一下。使用括号使它们更容易理解。除非您正在为混淆代码竞赛编写代码,否则没有理由编写此类代码。

转换那些行

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

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

或到

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

取决于您的意图。