为何三元运算符结合指针使用会报‘左操作数需为可修改值’错误?
三元运算符优先级导致的“左赋值操作数需为可修改值”错误分析
错误根源:运算符优先级问题
C语言中,三元条件运算符?:的优先级高于赋值运算符=,你的代码会被编译器按照错误的优先级规则解析,进而触发报错。
代码段1的解析逻辑
原代码:
*p_a < *p_b ? *p_b = *p_a : *p_a = *p_b;
会被编译器强制解析为:
(*p_a < *p_b ? (*p_b = *p_a) : *p_a) = *p_b;
当*p_a < *p_b为真时,三元表达式的结果是*p_b = *p_a的返回值(即*p_a的数值,属于右值),而右值无法作为赋值操作的左操作数,因此触发“左赋值操作数需为可修改值”的错误。
代码段2的解析逻辑
原代码:
*p_a < *p_b ? l = *p_a : l = *p_b;
被解析为:
(*p_a < *p_b ? (l = *p_a) : l) = *p_b;
同理,当条件为真时,三元表达式返回的是l = *p_a的右值,后续对这个右值赋值*p_b会触发相同错误。
修正方案
方案1:给赋值表达式加括号
通过括号强制改变运算优先级,让赋值操作成为三元运算符的分支:
代码段1修正后:
#include <stdio.h> int main() { int a = 5, b = 7; int * p_a = &a, *p_b = &b; *p_a < *p_b ? (*p_b = *p_a) : (*p_a = *p_b); printf("%d %d", *p_a, *p_b); return 0; }
代码段2修正后:
#include <stdio.h> int main() { int a = 5, b = 7; int * p_a = &a, *p_b = &b; int l; *p_a < *p_b ? (l = *p_a) : (l = *p_b); printf("%d", l); return 0; }
方案2:改用if-else语句(更直观)
如果追求代码可读性,直接用if-else替代三元运算符,彻底规避优先级陷阱:
#include <stdio.h> int main() { int a = 5, b = 7; int * p_a = &a, *p_b = &b; if (*p_a < *p_b) { *p_b = *p_a; } else { *p_a = *p_b; } printf("%d %d", *p_a, *p_b); return 0; }
内容的提问来源于stack exchange,提问作者kikjoan
相关产品推荐
相关产品推荐

