【问题标题】:Use of brackets in expression that include ternary operator [duplicate]在包含三元运算符的表达式中使用括号[重复]
【发布时间】:2012-08-22 07:20:50
【问题描述】:

可能重复:
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;
}

【问题讨论】:

标签: c ternary-operator


【解决方案1】:

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

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

这显然不是您想要的,并且确实存在左值问题。

修复它

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

【讨论】:

    【解决方案2】:

    很明显,可以以更好的方式重写此条件,但是由于=?: 运算符的优先级,您的问题被观察到了。

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

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

    相当于

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

    这是不正确的,因为您不能分配给表达式结果。

    其实这种情况和(( i > j ) : i : j) = 10;类似,也是不正确的。

    【讨论】:

      【解决方案3】:

      这样写怎么样。

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

      【讨论】:

        【解决方案4】:

        而是:

        k = i > j ? i : j;
        

        【讨论】:

          【解决方案5】:

          你需要分配这个操作符的返回值。 三元运算符的语法如下..

          result = condition ? first_expression : second_expression;  
          

          您在代码中遗漏了.. 所以你可以简单地说如下..

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-11-13
            • 2022-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-09-28
            相关资源
            最近更新 更多