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

Yug*_*dle 11 c ternary-operator conditional-operator

我有 :

#include<stdio.h>

int main()
{
 int a=5,b=6;
 (a>b)?b=a:b=b;    // Here is the error
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

但如果我更换:

(a>b)?b=a:b=b;       // Error
with   
(a>b)?(b=a):(b=b);   // No-Error
Run Code Online (Sandbox Code Playgroud)

我理解这lvalue是一个可以分配某些东西的价值,它与它有什么不同rvalue,但为什么会extra parenthesis产生不同.

Naw*_*waz 20

实际上,在C中,这段代码

(a>b)?b=a:b=b; 
Run Code Online (Sandbox Code Playgroud)

由许多编译器解析为

((a>b)?b=a:b)=b;
Run Code Online (Sandbox Code Playgroud)

这是一个错误,因为表达式((a>b)?b=a:b)求值为您尝试分配的右值b导致错误.尝试分配右值是一个错误.如果没有这样解析,那么它只是一个语法错误.但是不允许C编译器将其解析为:

((a>b)?b=a:(b=b)); //not allowed to parse by C language
Run Code Online (Sandbox Code Playgroud)

因为C的语法不允许编译器解析上面的代码.

但你所写的(原始代码)是正确的C++.

这里C和C++的语法差别很大.由于存在这种差异,您会看到两种语言对表达的区别对待.也就是说,the conditional expression in C++不同the conditional expression in C.

维基百科对此有非常好的正确解释:

C和C++中的运算符绑定是通过因式语言语法(而不是优先级表)指定的(在相应的标准中).这会产生一些微妙的冲突.例如,在C中,条件表达式的语法是:

逻辑OR表达?表达式:条件表达式

而在C++中它是:

逻辑OR表达?表达式:赋值表达式

因此,表达式:

e = a <d?a ++:a = d

两种语言的解析方式不同.在C中,此表达式是语法错误,但许多编译器将其解析为:

e =((a <d?a ++:a)= d)

这是一个语义错误,因为条件表达式(可能是++)的结果不是左值.在C++中,它被解析为:

e =(a <d?a ++ :( a = d))

这是一个有效的表达.

  • @约翰内斯:什么不是真的?请具体点。 (2认同)

Sco*_*gan 9

赋值的优先级低于三元运算符,因此该行的计算结果如下:

((a>b)?b=a:b)=b;
Run Code Online (Sandbox Code Playgroud)

使用:

b=(a>b)?a:b;
Run Code Online (Sandbox Code Playgroud)

  • -1,不是真的.请参阅http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Notes上的维基百科解释 (2认同)