将增量运算符与指针取消引用结合使用时出现意外行为

Unexpected behavior when combining increment operator with pointer dereferencing

对于我目前正在开发的程序,我使用的代码包含此操作:

 *(a+++5) = 5; //increments a and adds 5 to it, then dereference that address

这表现出乎意料。值 5 似乎存储在位置 (a+4) 中,这很奇怪,因为没有任何东西向后移动指针。我发现造成这种情况的原因是 a++:

*(a++) = 5;
printf("%d\n" *(a-1)); //outputs 5

使用 ++a 而不是 a++ 会产生更合乎逻辑的结果:

*(++a) = 5;
printf("%d\n" *a); //outputs 5

任何人都可以向我解释为什么当我使用 a++ 时代码会这样吗?

操作顺序示例:

b = 5 + a++; // same as:   b = 5 + a;   a = a + 1;

b = 5 + ++a; // same as:   a = a + 1;   b = 5 + a;

为什么?...因为:

a++ // adds after the line command.

++a // adds before th line command. 

希望对您有所帮助。

这是预期的结果,因为您使用的是 post 递增运算符,它仅在到达序列点(在本例中为语句末尾)后递增。

*(a+++5) = 5;

相同
*(a + 5) = 5;
a++;

因此,*( a + 5 ) = 5 将值 5 存储在 a[5]。但在 a++ 之后,a 现在将实际指向 a[1],因此 a[4] 将具有先前存储在 a[5] 中的值,从而解释了行为你得到了。

让我们看看 C 标准

6.5.2.4

2 The result of the postfix ++ operator is the value of the operand. As a side effect, the value of the operand object is incremented (that is, the value 1 of the appropriate type is added to it).

我们来看一个例子

int x = 5 , y;
y = x++;
printf("y : %d  ,  x : %d\n",y,x);
y = ++x;
printf("y : %d  ,  x : %d\n",y,x);

你得到的输出是

y : 5  ,  x : 6
y : 7  ,  x : 7

所以,按照标准中的规定,y = x++;之后的y的值将是x的原始值,作为后遗症,[=23的值=] 递增。

第一个代码 (y = x++;) 首先将 x ( 5 ) 的值赋给 y,然后递增 x。那就是 post固定增量运算符。

第二个(y = ++x;)首先将x递增到7,然后将其分配给y。这就是预增量运算符的工作原理。

这正是您应该期望的行为。

假设 a 指向数组的第一个元素,a = &array [0]。

a++ 递增 a,但是 returns 之前的值,所以现在 a = &array [1],但是你得到的值是 &array [0]。

a++ + 5 因此是 &array [5],这就是你存储值 5 的地方。

因为 a 现在等于 &array [1],所以 5 被存储在 a 的新位置之后的 4。

*(a+++5)=5 这样做

 *(a+5)=5 //so a[5]=5
 a=a+1 //that gives a[4]=5

同样 *(a++)=5 :

 *a=5 //so a[0]=5
 a=a+1//incrementation on address => a[-1]=5
 //*a=content at address "a" and a is an address that you incremented

令牌首先提取为最长的字符串。
尾随 ++ 是事后完成的,

因此,语句(您应该使用括号来阐明您真正想要的)变为:*(a+5) = 5; a++;