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

时间:2012-08-22 07:20:50

标签: c ternary-operator

  

可能重复:
  Error: lvalue required in this simple C code? (Ternary with assignment?)

在下面的代码中,我收到了类似“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;
}

5 个答案:

答案 0 :(得分:3)

如果没有你的额外(),我认为运算符优先级是将其分组为

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

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

修复它

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

答案 1 :(得分:2)

很明显,这种情况可以更好地重写,但由于=?:运营商的优先权,您的问题得到了解决。

赋值运算符?:的优先级高于=,因此表达式

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

相当于

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

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

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

答案 2 :(得分:1)

这样写作怎么样。

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

答案 3 :(得分:0)

相反:

k = i > j ? i : j;

答案 4 :(得分:0)

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

result = condition ? first_expression : second_expression;  

你在代码中遗漏了.. 所以你可以简单地把它说成跟随......

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