阿弥陀佛,工作以后又回来补这些知识了,果然时间久了就容易忘,记录在这里以后好翻阅:
首先来看看一个比较简单的自增运算的例子:
a=i++;
b=++i;
相信这个大家都比较清楚吧
对于 a来说,先赋值i的值给a,然后i自己加1;
对于b来说,i自己先加1,然后赋值给b;
好了,来背口诀,i++先赋值再运算;++i先运算再赋值;
上面这个例子比较简单,只含有自增运算的表达式,但当自增运算符和指针结合在一起时,我们就可能有点懵了
举例如下:
int a[]={1,2,3,4,5,6,7};
int *p=a; //此时*p=1; 即指向数组a的首地址
q=*p++; //等价于 q=*p; p++;
q=*(p++); //等价于 q=*p; p++;
以上对q的两个赋值运算操作结果是一样的;为啥??
*和++的优先级是相同的,运算符的结合都是自右向左的,因此 ++只对 p 产生作用,而不是*p,再结合我们的口诀,i++先赋值再运算
而对于 q=*++p //p地址先加1 然后再取p地址的值
同理 对于 ++i 是先运算 再赋值,实在不能理解,拿下面这段代码一运行就知道了:
#include<stdio.h>
int main(){
//int a[]={1,2,3,4,5,6,7};
//int *p=a;
//printf("%d\n",*p);
//printf("%d\n",*p++);
//printf("%d\n",*(p++));
//printf("%d\n",*++p);
//printf("%d\n",(*p)++);
//printf("%d\n",++*p);
int i=1;
int a=i++;
printf("a=%d\n",a);
printf("i=%d\n",i);
int a1=2*(i++);
printf("a1=%d\n",a1);
printf("i1=%d\n",i);
int a2=2*(++i);
printf("a2=%d\n",a2);
printf("i2=%d\n",i);
}