@Purpose
2016-08-24T03:50:14.000000Z
字数 1035
阅读 1051
蛋协
double arr[]={21.1,32.8,23.4,45.2,37.4};double *pt=arr;
pt++;代表什么意思?
double *pt=arr;中,pt指向了arr【0】
pt++;每次往后面指一个数,即指针往后移位
所以现在指针指向arr[1]
即pt = &arr[1]
double x=*++ptx的值是多少?在指向arr【1】的基础上,不给这个提示你
因为前缀的自增运算符++和*是同样的优先级
而且他们为第二个优先级,所以从右到左执行
科普时间——运算符的优先级
所以double x=*++pt 等价于*double x =*(++pt)
系统先++再右结合再取值
即先执行++pt,再执行double x = *pt
执行++pt后,此时pt = &arr[2]
所以x的值是23.4
x = ++*ptx的值是多少?pt = &arr【2】了喔,删了不告诉你
首先看两个运算符的优先级,前缀的自增++和*是同一优先级的
而且为第二优先级,所以从右往左执行
和上面一样的链接
似曾相识的一段话( ╯□╰ )
所以double x = ++*pt 等价于*double x =++(*pt)
所以先执行*pt,再把*pt的值+1,然后把值赋给x
So, x的值是24.4
x = (*pt)++x的值是多少?*pt = 24.4了喔,看你肯定忘了
由于有括号的存在,所以先运行*pt,
然后再把*pt的值+1
That is the reason why x = 25.4
x = *pt++x的值是多少?pt还是指向arr[2],*pt = 25.4,没注意到吧,哈哈
后缀的自增运算符比*的优先级高,所以先执行后缀的自增运算符
这个时候可能很多童鞋就一脸懵逼了:
后缀的自增运算符不是在赋值之后再+1吗?那么不就是先执行*先???
这个时候大家就要理解一下这个优先级的问题,我就按照我的理解说一下
(说错了装逼失败的话,求别打脸T-T)
这个后缀的自增运算符优先级高的结果是它作用的对象不是*pt,而是pt
这是因为我们编译器先用这个后缀的++对数据进行处理,而这个数据不是
*pt,而是pt,所以后缀的++会让pt指向arr[3],
然而让pt指向arr[3]的时间点是赋值之后,
所以该语句的执行顺序是把*pt的值赋给x,再把pt+1
这时x=25.4,pt = &arr[3]
PS:说的有错漏敬请指出改正,蟹蟹