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

时间:2011-08-06 10:51:27

标签: 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;
}

但如果我更换:

(a>b)?b=a:b=b;       // Error
with   
(a>b)?(b=a):(b=b);   // No-Error

我理解lvalue是可以分配某些内容的值,它与rvalue有什么不同,但为什么extra parenthesis会产生差异。

4 个答案:

答案 0 :(得分:18)

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

(a>b)?b=a:b=b; 

被许多编译器解析为

((a>b)?b=a:b)=b;

这是一个错误,因为表达式((a>b)?b=a:b)计算为 rvalue ,您尝试使用b进行分配,这会导致错误。尝试分配 rvalue 是一个错误。如果没有这样解析,那么它只是一个语法错误。但是不允许C编译器将其解析为:

((a>b)?b=a:(b=b)); //not allowed to parse by C language

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

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

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

维基百科对此有very good and correct explanation

  

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

     

logical-OR-expression?表达:   条件表达式

     

在C ++中它是:

     

logical-OR-expression?表达:   赋值表达式

     

因此,表达式:

     

e = a&lt; d? a ++:a = d

     

在两者中的解析方式不同   语言。在C中,这个表达式是一个   语法错误,但许多编译器解析   它为:

     

e =((&lt; d?a ++:a)= d)

     

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

     

e =(a      

这是一个有效的表达。

答案 1 :(得分:9)

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

((a>b)?b=a:b)=b;

使用:

b=(a>b)?a:b;

答案 2 :(得分:2)

确实如此:

((a>b)?b=a:b)=b; 

注意:你应该只是

b = (a>b)?a:b;

答案 3 :(得分:0)

当我们在括号中加上一个方程时,它被视为一个表达式。它返回一些值,为错误提供解决方案。