为何使用*(p)++会报表达式未使用警告,且未实现预期递增?
C++问题解析:表达式警告与自增操作误区
1. 「expression result unused」警告的原因
单独写*(p)++;时,这个表达式会返回*p自增前的旧值,但你没用到这个结果,编译器就会弹出警告。把它赋值给ans时,结果被使用了,警告自然就消失了。
2. 为什么数值没按预期递增?优先级搞反了
你混淆了指针自增和指向值的自增:
后置++的优先级比解引用*更高,哪怕加了括号*(p)++,实际等价于*(p++)——先把指针p向后移动一个int的内存位置,再返回移动前指针指向的旧值。
看你的代码流程:
- 执行
*q = &second;后,p已经指向second(值为20)。 int ans = *(p)++;:先把p当前指向的20赋值给ans,然后指针p向后跳(指向second后面的非法内存)。- 后续的
*(p)++;操作的是非法内存,根本碰不到first或second,所以打印时两者的值都没变,ans是20。
如果要让指针指向的数值递增,必须用括号把*p括起来:(*p)++——先解引用拿到变量值,再对数值做后置自增,这样才会修改p指向的变量。
修正后的代码
{ int first = 10; int *p = &first; int **q = &p; int second = 20; *q = &second; int ans = (*p)++; // 先取second的值20给ans,再让second变成21 (*p)++; // 让second再增1,变成22 cout<<first<<" "<<second; // 输出:10 22 cout<<ans; // 输出:20 }
内容的提问来源于stack exchange,提问作者Vaibhav Agarwal
相关产品推荐
相关产品推荐

