C语言中定义int *p;p指向a[0]; 这个表达式是什么意思 *p++; 与*(p++)一样吗?

教材上说是一样的,先引用p的值,实现*p的运算,然后再使p自加1;
我的问题是,*(p++)这个式子中带括号了啊,有括号在,不是应该先计算括号里面的吗?所以我感觉这两个式子不一样!
我的想法对吗?这个括号有影响吗?
我上机操作了一下,这两个 是一样的,例如:a=*p++;b=*(p++);输出的a和b是一样的,都是a[0]的值;
我想知道为什么加上括号和不加一样?括号在这里没有作用吗?在我的意识里面,有小括号了,要先算小括号里面的,也就是让p先自加,然后再取值;可是上机操作的结果和我想的不一样!
我错在哪里了?
最新回答
浮华沧桑

2024-09-21 13:44:07

*p++和*(p++)是一样的
*p++逻辑上等价于

*p;
p+=1;

*(p++)逻辑上等价于
*(p);
p+=1;
追问
那这个括号有啥用?
有括号不是要先算括号里面的吗?
追答
这个和优先级无关
因为++优先于*,所以*p++就是*(p++),括号只是强调了++是p的而不是*p的
*p++; 这个 ++执行的时间点是分号以后

后++就相当于当前表达式里没有++,当这个表达式求值完成后才自加
追问
“你说的没错,两个表达式不一样
*p++; 是先取值,再指针偏移
*(p++)是指针偏移,再取值。

不过对于优先级不清楚地时候,最好就别这么写给自己找麻烦。大多数公司里面的编码规范是要求分成两句写的

那你就是说这位楼主的回答错了?还有一点,不太理解你说的和优先级无关,有小括号了,为什么不是先让p自加,再*运算?
追答
为什么不是先让p自加,再*运算?  这是C语法规定的,而不是自然规律
往事輕如煙

2024-09-21 08:41:05

*p++; 表示p当前指向位置a[0]的值,然后p移动int类型4个字节,指向a中下一个元素,也就是a[1].
*(p++)表示a[1]的值 。
追问
不是这样的,这俩都是指向a[0]的,我上机试验了!
秋雨绵绵

2024-09-21 05:34:05

你说的没错,两个表达式不一样
*p++; 是先取值,再指针偏移
*(p++)是指针偏移,再取值。

不过对于优先级不清楚地时候,最好就别这么写给自己找麻烦。大多数公司里面的编码规范是要求分成两句写的
;單人旁┍

2024-09-21 10:51:16

对于p值来说*p++和*(p++)当然是一样的,但是你获得的值就会不同:
例如
int a = *p++;
int b = *(p++);
a和b不同,但是p的值一样。
璎婲

2024-09-21 14:17:44

我试验了一下,结果一样,说明这两个等价,实际结合理论,比如int a[5]={1,4,5,6,7,8} *p=a *p++的意思是先求*p是a[0]=1 然后*p++的值是1,p=2; 如果是*(p++)的话,p++的值没变,p的值加1,然而*(p++)的值就不变了,所以结果一样 不知道朋友能否明白
追问
“然后*p++的值是1,p=2;  ”            p=2怎么来的?什么意思?
我就是想问,为什么加上小括号后,输出的值没有变化?
追答
设int a=2;b=a++;a=?说下
浅夏凉眸

2024-09-21 10:38:23

很简单啊,p++是在执行本语句以后p再加1的,以后建议使用++p。可以避免一些疑惑!仔细看看i++与++i的区别就知道了。