整理c语言指针的时候发现几个很有意思的东西,直接先上代码在解释。
背景条件
GCC 版本7.4.0
i++:先使用i,再递增
++i:先递增,再使用i
优先级表:
同一优先级的运算符,运算次序由结合方向所决定。
*p++
#include <stdlib.h>int buf[]={1,3,5};int main(){int *p = buf;printf("%d\r\n",*p++);printf("%d",*p);return(0);}
结果:
解析
根据优先级表看出*和++在同一优先级。然后看方向,从右向左。所以p++,然后*。
再看i++的性质,先使用i,再递增。第一遍打印的时候先打印的*p是buf[0]=1,打印结束后,再执行*(p++),此时p指向buf[1]。所以第二次打印出的是3.
*++p
#include <stdlib.h>int buf[]={1,3,5};int main(){int *p = buf;printf("%d\r\n",*++p);printf("%d",*p);return(0);}
结果:
解析
这个很简单 前面和上一题一样。先++p然后*.
++p是先运算再执行。所以两个都是指向buf[1]=3
++*p
#include <stdlib.h>int buf[]={1,3,5};int main(){int *p= buf;printf("%d\r\n",++*p);printf("%d",*p);return(0);}
结果:
解析
先*p,然后++,因为*p=1,然后++(*p),是先运算再执行,所以结果都是2。
(*p)++
#include <stdlib.h>int buf[]={1,3,5};int main(){int *p= buf;printf("%d\r\n",(*p)++);printf("%d",*p);return(0);}
结果:
解析
先小括号里的*p=1,然后再++。
第一次打印因为先执行在递增,所以结果是1
第二次打印因为递增结束了然后是2