You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用*(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:28:15