在表达式中使用括号,包括三元运算符

可能重复:
错误:这个简单的C代码需要左值? (三元有任务吗?)

在下面的代码中,我得到了一个错误,例如“ lvalue required as left operand of assignment ”。 我无法理解为什么会报告这样的错误。 但是当我在表达式中使用括号如(i>j)?(k=i):(k=j)它没有报告错误。 请解释。

 int main() { int i = 2; int j = 9; int k; (i>j) ? k=i : k=j; printf("%d\n",k); return 0; } 

很明显,这种情况可以用更好的方式重写,但是由于=?:运算符的优先级,可以观察到你的问题。

赋值运算符?:具有比=更高的优先级,因此表达式

 ( i > j ) ? k = i : k = j; 

相当于

 (( i > j ) ? k = i : k) = j; 

哪个不正确,因为您无法分配表达式结果。

实际上,这种情况类似于(( i > j ) : i : j) = 10; 这也不正确。

没有你的extra()s,我认为运算符优先级是将其分组为

((i>j)?k=i:k)=j;

这显然不是你想要的,并且确实有左值问题。

修复它

k= (i>j) ? i : j;

写这样的怎么样

 int main() { int i,j,k; i=2;j=9; k = (i > j) ? i : j; printf("%d\n",k); return 0; } 

相反:

 k = i > j ? i : j; 

您需要指定此运算符的返回值。 三元运算符的语法如下:

 result = condition ? first_expression : second_expression; 

你在代码中遗漏了..所以你可以简单地把它放在下面..

 int k = (i > j) ? i : j;