将增量运算符与指针取消引用结合使用时出现意外行为
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++;
对于我目前正在开发的程序,我使用的代码包含此操作:
*(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++;