【问题标题】:"lvalue required as left operand of assignment" error - ternary operator [duplicate]“需要左值作为赋值的左操作数”错误 - 三元运算符[重复]
【发布时间】:2016-08-15 04:56:14
【问题描述】:

在编译下面的代码时,我收到错误“需要左值作为赋值的左操作数”

for (i = 1; i < 2 n; i++) {
    for (((i<= n)?j=1:j=n-i);j<=i&&j>0;((i<=n)?j++:j--)) {
        printf("*");
    }
    printf("\n");
}

其实我只是尝试使用两个 for 循环来打印下面的模式

*
**
***
****
*****
****
***
**
*

我得到的错误是

pra.c:5:20: error: lvalue required as left operand of assignment for(((i<=5)?j=1:j=i);j<=i&&j>0;((i<=5)?j++:j--)){ ^
谁能帮帮我。

【问题讨论】:

  • 你应该把((i&lt;=5)?j=1:j=i)改成(j=((i&lt;=5)?1:i))
  • 在 C 编程中,不幸的是,在一行中使用该语言中的每个运算符并没有得到任何奖励...改为编写可读代码。

标签: c


【解决方案1】:

在 C 语言中,条件运算符的语法和语义不同于 C++。您的代码将在 C++ 中编译,因为在 C++ 中表达式

<condition> ? a = b : c = d

会被解析为

<condition> ? (a = b) : (c = d)

在 C 中,同样的表达式被解析为

(<condition> ? (a = b) : c) = d

这是一个完全不同的故事。 ?: 在 C 中的结果永远不是左值,这就是为什么后面的解析不能编译的原因。

您的代码遇到了完全相同的错误。

更迂腐的是,正如 Johannes 在 cmets 中指出的那样,?: 没有资格作为赋值运算符的左侧,原因与左值或右值无关。语法只是立即禁止它。该表达式根本不应该是可解析的。但是,从您引用的错误消息来看,您的编译器对问题的看法不同(或者至少以一种可以被视为“轻度误导”的方式报告它)。

这是 C 和 C++ 语言之间众所周知的区别之一:

Errors using ternary operator in c

Conditional operator differences between C and C++

【讨论】:

  • 在我写这篇文章的时候,这个答案是唯一正确的。
  • 我总是倾向于忘记这一点。我认为 C 中赋值的左侧是“一元表达式”。那么它如何适合那里的条件表达式呢?
  • 您能否给出&lt;condition&gt; ? a = b : c = d 的推导作为C 中的赋值表达式?我还看不到它,因为&lt;condition&gt; ? a = b : c 根本不是一元表达式。为什么他们会故意在语法上使其成为非左值表达式?我认为这个表达式在语法上是错误的,在 C 中都没有解析它。
  • @Johannes Schaub - litb:您究竟在哪里看到了问题?语言语法说conditional-expressionlogical-OR-expressionlogical-OR-expression ? expression : conditional-expression。第二个操作数是expression,可以涉及赋值运算符。第三个操作数是logical-OR-expression,它(如果您跟踪整个树)归结为unary-expression,并且不能包含赋值运算符。因此,尾随分配位于?: 之外。
  • 至于它是非左值...这只是 C 的基本属性之一(同样,不同于 C++)。 C 中绝大多数的表达式都会产生右值、右值和右值。 C 中唯一的左值基本上是直接变量名和一元 * 的结果。
猜你喜欢
  • 1970-01-01
  • 2017-03-16
  • 2013-08-21
  • 2011-12-20
  • 2011-03-04
  • 2018-02-04
  • 1970-01-01
  • 2017-01-10
相关资源
最近更新 更多