int a[]={1,2,3,4},y,*p=a;执行语句y=(*p++)--后,a中元素的值为什么会是{1,1,3,4 },请详细解答

2025-04-03 10:48:37
推荐回答(4个)
回答1:

y=(*p++)--
根据运算符的优先级,这句话你可以让它变个更直观的形式:
y=(*(p++))--

现在就清晰了,首先计算的是p++,p++之后实际p指向的不是第一个元素了,实际指向的是数组的第二个元素

再来*(p++) 实际就是取得数组的第二个元素的值。

再来(*(p++))-- 实际就是对取得的数组的第二个元素的值进行-1运算。又因为是后--,所以直接将第二个元素的值-1了。

回答2:

不对啊,我觉得是a[0]被改了,然后我试了一下,确实是只有a[0]被改了
因为后++返回的是p未加一之前的值,所以*的是p,也就是a中的第一个元素
这样再--,修改的就是a[0]了。
后面三个还是保持原来的值,y=(*p++)--这句话只影响了第一个值

回答3:

y=(*p++)-- 并不是数组里的每一个元素都变化的,只变化了一个的
一开始p =a[0]的地址
p++ = a[1]的地址
*p++也就是a[1]
a[1]--
数组就变成1 1 3 4

这是我个人看法,请参考~~

回答4:

指针p初始化后指向a[0]
执行语句y=(*p++)--的时候分两步,先(*p++)运算后将p的指向调整到了a[1],取值2,然后赋值给y,最后a[1]执行--操作,结果就是a[2] = 1了,a[2] 和a[3]没参与运算,所以不变

c语言里++的优先级高于*,并且运算优先不能用()来表明,(*p)++ 会将存储内容自增,*(p++)则会先自增后取值,所以指针的自增自减操作不会和*运算同时进行,会先*运算取值后再自增自减操作