post自增和post自减运算符在c语言运算符优先级规则中有什么位置
What place does post increment and post decrement operators have in the rules of operator precedence in c language
根据此 link, post increment and decrement operators have first place. And this link 中的信息,“举个例子:
foo = *p++;
这里 p 作为表达式的副作用递增,但 foo 取 *(p++) 的值而不是 (*p)++,因为一元运算符将右绑定到左 "。
但是按照这些链接中提到的信息,执行后几乎没有任何反应。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 1;
int *iptr;
iptr = &i;
int num = *iptr++;//1) In this expression the value of 'i' is assigned to num. And an attempt of post incrementing the address stored in *iptr is done as side effect.
printf("Num value: %d\n",num);
printf("Pointer: %d\n",*iptr);//2) The address of *iptr is not incremented. If it was then the value of 'i' would not be printed instead it would print the incremented address itself.
printf("Post increment: %d\n",*iptr++);//3) The address of *iptr will be post incremented (which didn't happen in case of num). But for now the value of 'i' will be printed.
printf("After increment: %d\n",*iptr);//4) Now the incremented address stored in *iptr will be displayed as there is no value assigned to that address.
return 0;
}
在上面的实验中,只有在语句终止符之后才能看到post增量的效果。但是,如果对赋值运算符的右操作数进行 post 增量,即使在语句终止符之后也看不到任何效果。 E.G int num = *iptr++; (如上述实验中所述)。那么 post 递增和递减运算符在运算符优先级规则中究竟有什么位置。
您的代码的问题在于它具有未定义的行为:当您将指针指向单个局部变量时,取消引用递增的指针会产生未定义的行为。
解引用递增指针对于指向数组的指针是明确定义的。
int array[] = {1, 2, 3};
int *iptr = &array[0];
int num = *iptr++;
此外,使用 %d
和取消引用运算符打印 iptr
是不正确的:在将 iptr
转换为 [=16= 之后,您需要使用 %p
打印它], 不取消引用:
printf("Pointer: %p\n", (void*)iptr);
// No asterisk here -----------^
现在一切正常(demo)。
根据此 link, post increment and decrement operators have first place. And this link 中的信息,“举个例子:
foo = *p++;
这里 p 作为表达式的副作用递增,但 foo 取 *(p++) 的值而不是 (*p)++,因为一元运算符将右绑定到左 "。
但是按照这些链接中提到的信息,执行后几乎没有任何反应。
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i = 1;
int *iptr;
iptr = &i;
int num = *iptr++;//1) In this expression the value of 'i' is assigned to num. And an attempt of post incrementing the address stored in *iptr is done as side effect.
printf("Num value: %d\n",num);
printf("Pointer: %d\n",*iptr);//2) The address of *iptr is not incremented. If it was then the value of 'i' would not be printed instead it would print the incremented address itself.
printf("Post increment: %d\n",*iptr++);//3) The address of *iptr will be post incremented (which didn't happen in case of num). But for now the value of 'i' will be printed.
printf("After increment: %d\n",*iptr);//4) Now the incremented address stored in *iptr will be displayed as there is no value assigned to that address.
return 0;
}
在上面的实验中,只有在语句终止符之后才能看到post增量的效果。但是,如果对赋值运算符的右操作数进行 post 增量,即使在语句终止符之后也看不到任何效果。 E.G int num = *iptr++; (如上述实验中所述)。那么 post 递增和递减运算符在运算符优先级规则中究竟有什么位置。
您的代码的问题在于它具有未定义的行为:当您将指针指向单个局部变量时,取消引用递增的指针会产生未定义的行为。
解引用递增指针对于指向数组的指针是明确定义的。
int array[] = {1, 2, 3};
int *iptr = &array[0];
int num = *iptr++;
此外,使用 %d
和取消引用运算符打印 iptr
是不正确的:在将 iptr
转换为 [=16= 之后,您需要使用 %p
打印它], 不取消引用:
printf("Pointer: %p\n", (void*)iptr);
// No asterisk here -----------^
现在一切正常(demo)。