-8

如果您有以下代码:

j=3;   // Line 1
i=6;   // Line 2
i+=5;  // Line 3
j=i--; // Line 4

...据我所知, 的值j将变为 6。如果是--i,则为 5 等等。

但是如果我打印出第i4 行之后的值,我会得到 10 而不是第 3 行的 11。

为什么会这样?这是否意味着如果我声明i为一个数字,然后我返回代码并将另一个变量设置为i--,在我的大部分i's代码之前,它会更改i全局的值?

4

3 回答 3

4

在您的代码中,请参阅以下步骤。

j=3;   //Line 1, j ==3
i=6;   //Line 2, i == 6
i+=5;  //Line 3, i == i + 5 == 11
j=i--; // line 4, j == 11, i == 10, after this line.

详细地说,x += y可以分解为x = x + y,就是这样。

并且关于后减量,副作用(减量)将在计算表达式后发生。因此,无论如何,在下一条语句之前, 的值i将递减。

要添加一些参考,来自C11第 §6.5.2.4 章,

后缀++运算符的结果是操作数的值。作为副作用,操作数对象的值会递增(即,将相应类型的值 1 添加到其中)。 [....]

后缀--运算符类似于后缀++运算符,不同之处在于操作数的值是递减的(即从它减去相应类型的值 1)。

请注意,前减量和后减量的差异仅使用它们的表达式中可见。从使用变量的下一条指令的角度来看,它们都会给你相同的结果(效果)。

于 2015-12-16T13:41:30.673 回答
2

首先,您设置ibecome的值11,然后将此值分配给j然后减少i发生。最后一行相当于

j = i;
i -= 1;

如果你这样做了,j = --i;那么最后一行将相当于

i -= 1;
j = i;

并且j会变成10.

于 2015-12-16T13:45:13.453 回答
1

减法运算符与--减一不同。它们修改了使用它们的左值,因此任何时间i--i将被修改。

于 2015-12-16T13:44:22.387 回答