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中放置相同的表达式?
答案 0 :(得分:4)
因为这些运营商的precedence是operator*
&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);
取决于你的意图。