我有:
#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
会产生差异。
答案 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)
当我们在括号中加上一个方程时,它被视为一个表达式。它返回一些值,为错误提供解决方案。