C语言条件表达式求值顺序疑问:printf输出为何为3?
关于C语言while循环中指针递增与比较顺序的问题解析
你完全说到点子上了——问题的核心就是后置自增运算符++的求值顺序,你之前对执行顺序的判断搞反了,实际是先拿当前指针指向的值做比较,再把指针地址递增。
先还原一下符合你描述的典型代码(应该和你测试的版本一致):
#include <stdio.h> int main() { int a[] = {0, 1, 2, 3}; int *a_p = a; // 初始指向数组第一个元素a[0] while (*a_p++ < 1.5) { // 循环体无实际操作 } printf("%d\n", *a_p); return 0; }
我们一步步拆解执行流程,你就能明白为什么输出是3:
- 初始状态:
a_p指向a[0](值为0) - 第一次判断while条件:
- 先读取
a_p当前指向的值:0 - 立刻将
a_p的地址递增,现在指向a[1] - 比较0 < 1.5 → 结果为真,进入循环体(无操作)
- 先读取
- 第二次判断while条件:
- 读取
a_p当前指向的值:1 - 再次将
a_p地址递增,现在指向a[2] - 比较1 < 1.5 → 结果为真,进入循环体(无操作)
- 读取
- 第三次判断while条件:
- 读取
a_p当前指向的值:2 - 将
a_p地址递增,现在指向a[3] - 比较2 < 1.5 → 结果为假,退出循环
- 读取
- 此时
a_p已经指向a[3],所以printf输出的值就是3
你之前的错误在于,误以为*a_p++是先把指针递增,再解引用取值,但实际上后置++的规则是:先返回变量的当前值,再对变量执行自增操作。在*a_p++这个表达式里,编译器会先解引用当前指针的地址拿到值,再把指针往后挪一位,最后才用拿到的值去做比较。
总结一下关键知识点:
- 后置自增
x++的优先级高于解引用*,但求值顺序是先返回x的当前值,再自增 - 整个
*a_p++ < 1.5的执行顺序是:取当前指针值 → 指针递增 → 比较值是否满足条件
内容的提问来源于stack exchange,提问作者Adi S.
相关产品推荐
相关产品推荐

