为何执行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++;的执行逻辑
这行代码的核心是搞清楚运算符的优先级和执行顺序:
- 后缀
++的优先级最高:p++属于后缀自增运算符,它的规则是先返回当前p的地址值,再把p的地址往后移一位(也就是指向i[1])。不过这个地址自增的副作用会在表达式求值的某个时间点完成,但不影响当前*p的取值。 - 间接寻址
*的操作:拿到p++返回的原地址(也就是&i[0])后,通过*操作取出该地址对应的值——也就是3。 - 前缀
--的操作:前缀自减运算符--会直接对这个取出的值做减1操作,把3变成2,同时这个操作会修改原数组的i[0]的值(现在i[0]变成2了)。 - 赋值给j:最后把减1后的结果2赋值给变量
j。
简单来说,这行代码从逻辑上可以拆分为(并非严格等价的C代码,仅用于理解流程):
// 先取当前p指向的值,减1后赋值给j j = *p - 1; // 修改原数组对应位置的值 *p = j; // 再把指针p向后移动一位 p++;
所以最终printf输出j = 2就完全说得通啦。
内容的提问来源于stack exchange,提问作者Xannie21
相关产品推荐
相关产品推荐

