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

时间:2017-02-01 06:04:19

标签: c++ cout evaluation operator-precedence

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中放置相同的表达式?

2 个答案:

答案 0 :(得分:4)

因为这些运营商的precedenceoperator*&gt; operator+&gt; operator<<&gt; operator==。然后cout << a*b + b==0;(cout << ((a*b) + b)) == 0;等效。

然后将打印((a*b) + b))的结果,即4,然后将(cout << ((a*b) + b))的返回值(即cout)与0进行比较。在C ++ 11之前,cout可以通过operator void*隐式转换为void*,当steram有任何错误时返回空指针。所以在这里将它与0(即空指针)进行比较,并且对结果不再做任何其他事情。

答案 1 :(得分:-2)

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

我想回答OP,说编写易于理解的代码要好得多。

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

转换那些

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

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

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

取决于你的意图。