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

为何执行j = --*p++后j的值为2?附C语言代码示例

解析这段C代码的输出结果:j = 2

嘿,这个问题问得好!咱们一步步拆解这段代码,搞清楚为啥最终输出是j = 2。首先先把代码贴出来方便对照:

#include <stdio.h>
int main() {
    int i[] = {3, 5};
    int *p = i;
    int j = --*p++;
    printf("j = %d\n\n", j);
    return 0;
}

第一步:初始化阶段

  • 数组i被初始化为{3, 5},所以i[0] = 3,i[1] = 5,数组的首地址就是&i[0]。
  • 指针p被赋值为i,这意味着p现在指向数组的第一个元素i[0],此时*p的取值就是3。

第二步:关键语句int j = --*p++;的执行逻辑

这行代码的核心是搞清楚运算符的优先级和执行顺序:

  1. 后缀++的优先级最高:p++属于后缀自增运算符,它的规则是先返回当前p的地址值,再把p的地址往后移一位(也就是指向i[1])。不过这个地址自增的副作用会在表达式求值的某个时间点完成,但不影响当前*p的取值。
  2. 间接寻址*的操作:拿到p++返回的原地址(也就是&i[0])后,通过*操作取出该地址对应的值——也就是3。
  3. 前缀--的操作:前缀自减运算符--会直接对这个取出的值做减1操作,把3变成2,同时这个操作会修改原数组的i[0]的值(现在i[0]变成2了)。
  4. 赋值给j:最后把减1后的结果2赋值给变量j。

简单来说,这行代码从逻辑上可以拆分为(并非严格等价的C代码,仅用于理解流程):

// 先取当前p指向的值,减1后赋值给j
j = *p - 1;
// 修改原数组对应位置的值
*p = j;
// 再把指针p向后移动一位
p++;

所以最终printf输出j = 2就完全说得通啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:20