【问题标题】:lvalue required as left operand of assignment in conditional operator [duplicate]条件运算符中赋值的左操作数需要左值[重复]
【发布时间】:2013-08-21 04:14:49
【问题描述】:
#include <stdio.h>
int main()
{
        int a = 1, b;
        a ? b = 3 : b = 4;
        printf("%d, %d", a, b);
        return 0;
}

[user@localhost programs]$ gcc -Wall vol.c
vol.c: In function ‘main’:
vol.c:5:16: error: lvalue required as left operand of assignment
  a ? b = 3 : b = 4;
                ^

我已将左值设为b,那么为什么gcc 显示错误以及如何解决?

【问题讨论】:

    标签: c++ c gcc compiler-errors conditional-operator


    【解决方案1】:

    这与运算符排序有关。编译器认为你在​​做什么是

    (a ? b = 3 : b) = 4
    

    这显然是不正确的。

    相反,为什么不把b放在左边,只用条件表达式获取要赋值的值,比如

    b = a ? 3 : 4;
    

    【讨论】:

      【解决方案2】:

      以下编译:

      #include <stdio.h>
      int main()
      {
          int a = 1, b;
          a ? ( b = 3 ) : ( b = 4 );
          printf("%d, %d", a, b);
          return 0;
      }
      

      我会给你一个很长的故事,关于没有明确地为你的依赖加上括号会如何导致代码中的致命问题。但这就像在汽车上系安全带一样——很多人只是在发生非常混乱的事故之前拒绝相信这是值得的。

      【讨论】:

      • @hacks 为什么没用?
      • @hacks - 这就是 OP 想要的。或者可能不是。 OP 从未指定他们想要更改变量a。事实上,你怎么能假设 OP 想要一个存储在a 中的结果?在声明期间a 被分配了一个值而b 没有被分配,因此OP 更有可能想要分配b 一个值,而不是a(已经分配)。这是简短的if .. then .. else 语句的常见模式。仅仅因为它不像b = a ? 3 : 4 那样常见并不意味着它是不正确的,并且有时这种模式的副作用是可取的。
      • 我想你误解了我的回答。我从未告诉过 OP 想要更改变量 a
      • @hacks 你甚至不明白?: 操作员在我的回答中做了什么!我的意思是,来吧。如果你连 C 都不懂,你怎么能想象你知道 OP 想要什么?
      • @hacks 现在你想破坏我的帖子?用美式拼写?如果您坚持这种滥用行为,我将向版主举报您。
      【解决方案3】:

      条件运算符(?:)总是在某个条件变为真或假的基础上返回一个值。换句话说,可以说?: 总是返回一个 r 值。并且 r 值永远不会放在赋值表达式的左侧。声明

      a ? b = 3 : b = 4;
      

      被编译器解释为

      (a ? b = 3 : b) = 4;
      

      类似于等价

      3 = 4;
      

      这是错误的。
      您声称 我已将左值作为 b,这是错误的! b 将绑定到 ?: 运算符并通过语句参与评估 r-value

       a ? b = 3 : b;
      

      因此您将 r 值 (3) 分配给 r 值 (4)!
      要将b 用作左值,您可以这样做

      b = a ? 3 : 4;
      

      这个answer也可以帮助你理解运算符与操作数?:的绑定。

      【讨论】:

      • 从技术上讲,您的答案是正确的,但您误解了 OP 的问题。
      • @PP.; OP 想使用b 作为左值,正如他在问题中所说的那样:I have given lvalue as b
      猜你喜欢
      • 2017-03-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2011-09-03
      相关资源
      最近更新 更多