我查看运算符优先级表,++运算符在=运算符之前。但要计算这个表达式, B = A ++; 首先,将a分配给b,然后增加a。 这令人困惑。首先是哪一个,++或=?
答案 0 :(得分:2)
是的,++
的{{3}}高于=
。但是你需要将++
后增量运算符视为2个运算 - 增加变量并产生旧值 - 在优先级较低的运算符=
之前发生。
以下是发生的事情:
++
:增量a
。++
:产生旧值a
。=
:将a
的旧值分配给b
。它等同于此代码。
int resultOfPostIncrement = a;
a = a + 1;
b = resultOfPostIncrement;
答案 1 :(得分:1)
与许多人似乎认为的相反,在我们撰写b
时,在递增a
之前未分配int b = a++;
。在时间轴中为a
分配了以前值,但以后的值为a
的实际增量。
因此,它与优先权告诉你的内容并不矛盾。
为了说服你,这是一个让我信服的小例子:
int a = 1;
int b = a++ + a++;
最后,b
等于3,而不是2,而a
也是3.因为优先权而发生的事情是:
a++
,递增a
,但仍然根据运算符的定义评估为前值1 a++
,读取新值2(证明第一个增量已经发生),将其递增到3,但仍然评估为2 1 + 2
,并已分配给b
这是因为您应该将a++
视为指令和表达式。
a
a
它与b = a
中的内容相同,也是一个指令和表达:
a
的值分配给b
答案 2 :(得分:0)
您可以阅读,例如this tutorial,其中增量/减量运算符具有最高优先级,而赋值运算符具有最低优先级。因此,在您的示例中,首先会执行a++
,然后将a
的先前值分配给b
。
请注意,即使使用括号,也无法更改案例的优先级:(b=a)++
是编译错误。