输出流中的 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?
因为这些运算符的precedence是operator*
> 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);
取决于您的意图。
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?
因为这些运算符的precedence是operator*
> 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);
取决于您的意图。