三元运算符中使用指针异常:条件为真却执行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
相关产品推荐
相关产品推荐

