解释
//我出现问题的格式为a<b? b :a = b;这种,此时c语言会提示
lvalue required as left operand of assignment,也就是,左操作数必须为左值。
左操作数 称为“ 左值 ”, 必须 放在内存中可以访问且可以合法修改值的存储单元中,通常只能是变量名;右 操作数 称为“右值”,可以是常量、变量或者表达式,但一定能取得确定的值。
证明
在惯性思想里 a = b是一个整体。因此左操作数为a,没有问题。但是事实上a<b? b :a才是一个整体。因此这串代码实际上是 (a<b? b :a) = b;由于(a<b? b :a)结果是一个返回值,是一个值是右操作数,而把b赋值给一个值,而非一个变量显然就是错误的。
a>b? a=b : a;
这串代码显然就可以很好地验证并非是三目运算符的每一部分都是值,其中的变量仍然是变量,在将=放在中间时,由于没有其他可能,=仍发挥了正常的功能。
a=a<b?a : b;
这是三目运算符接收返回值的一种形式。
解决:本质是优先级问题,用优先级的解决方法
可以像 a>b? a=b : a;把=移到中间解决
也可以 a<b? b :(a = b);将赋值优先级拉满