【发布时间】:2017-05-10 01:09:07
【问题描述】:
根据此link 中的信息,后自增和自减运算符位于首位。而这个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;
}
在上面的实验中,只有在语句终止符之后才能看到后置增量的效果。但是,如果在赋值运算符的右操作数上完成后递增,即使在语句终止符之后也看不到任何效果。例如 int num = *iptr++; (如上述实验所述)。那么在运算符优先级规则中,后自增和自减运算符到底处于什么位置。
【问题讨论】:
-
你怎么知道没有看到效果?这对你有什么作用?看到或没有看到的效果与运算符优先级有什么关系?
-
在 (1) 中增加的是
iptr,而不是*iptr
标签: c operators operator-precedence