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

三元运算符中使用指针异常:条件为真却执行exp3

问题分析:三元运算符中指针操作导致的异常行为

核心原因:未定义行为

你代码里的(*ptr++) > (*ptr)属于C语言中的未定义行为。在同一个表达式中,对同一个指针ptr同时进行了修改(ptr++)和读取(*ptr),且这两个操作之间没有序列点(sequence point)。C标准没有规定这两个操作的求值顺序,编译器可以自由选择先计算左边的*ptr++还是右边的*ptr,这直接导致运行结果不可控,出现条件逻辑和实际执行分支不匹配的诡异情况。

具体执行逻辑拆解

假设ptr初始指向变量b:

  • 如果编译器先计算右边的*ptr,得到b的值,再计算左边的*ptr++(取值后指针自增,指向b之后的内存,可能是a或其他随机地址),此时比较的是b和后续内存的随机值,结果完全不可预测。
  • 如果编译器先计算左边的*ptr++,得到b的值,指针自增后再计算右边的*ptr,此时比较的是b和ptr新指向的内存值(比如a或垃圾值),同样不符合你原本想比较a和b的意图。

修复方案

你原本的需求是比较a和b的大小,完全没必要用指针自增这种复杂且危险的写法,直接用变量比较最安全清晰:

b > a ? printf("\n%d is the maximum number", b) : printf("\n%d is the maximum number", a);

如果一定要用指针操作,必须拆分操作确保序列点,比如:

int val1 = *ptr;
ptr++;
int val2 = *ptr;
val1 > val2 ? printf("\n%d is the maximum number", b) : printf("\n%d is the maximum number", a);

但这种写法完全多余,直接使用变量a和b进行比较才是最优解。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 15:55:25