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

运算符与指针优先级疑问:++*--p与++*p--的区别

C语言指针操作表达式疑问

原问题代码

int main()
{
    int a[4] = { 10, 21, 32, 43};
    int *p = a + 3;
    ++*--p;
    ++*p--;

    p[2] += p[1];

    for (int i = 0; i < 4; ++i)
        printf("%d\t", a[i]);

    return 0;
}

输出结果

10 21 34 77

疑问点

我大部分内容都理解了,但有一点困惑:
++*--p 和 ++*p-- 之间有什么区别?
这两个表达式难道不应该得到相同结果吗?因为在我使用的Code::Blocks编译器中,*p-- 和 *--p 的结果是相同的。


解析

要搞懂这两个表达式的区别,得拆解运算符的优先级和执行顺序:

1. 表达式 ++*--p 的执行步骤

运算符优先级:前缀-- > 解引用* > 前缀++,结合性从右到左:

  • 第一步:--p:指针p先向左移动一位(指向数组的前一个元素),返回移动后的指针
  • 第二步:*--p:解引用移动后的指针,得到对应元素的值
  • 第三步:++*--p:对这个值做前缀自增,元素值加1
  • 执行后,p停在移动后的位置

2. 表达式 ++*p-- 的执行步骤

运算符优先级:后缀-- > 解引用* > 前缀++:

  • 第一步:p--:先返回p当前指向的指针(不移动),然后再把p向左移动一位
  • 第二步:*p--:解引用原本的指针,得到当前元素的值
  • 第三步:++*p--:对这个值做前缀自增,元素值加1
  • 执行后,p停在移动后的位置

结合原代码的具体执行

初始状态:p指向a[3](值43)

  • 执行++*--p:
    • p先移到a[2](值32),解引用得到32,自增后a[2]变成33,此时p指向a[2]
  • 执行++*p--:
    • 先解引用p当前指向的a[2](值33),自增后a[2]变成34,然后p移到a[1]

你觉得*p--和*--p结果相同,大概率是测试场景的巧合——比如你测试时,p指向的元素和它前一个元素的值刚好相等,导致取值结果看起来一致,但本质上:

  • *--p是先移指针再取值,取的是前一个元素的值
  • *p--是先取当前值再移指针,取的是原本指向的元素的值

内容的提问来源于stack exchange,提问作者Baran Kanat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:10:17