错误:在这个简单的C代码中需要左值?(三元赋值?)

错误:在这个简单的C代码中需要左值?(三元赋值?),c,ternary-operator,conditional-operator,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; 注意:您只需 b = (a>b)?a:b; 当我们把一个方程放在括号里时,它被当作一个表达式来处理。它返回一些值,为错误提供解决方案。

我有:

#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; 
注意:您只需

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

当我们把一个方程放在括号里时,它被当作一个表达式来处理。它返回一些值,为错误提供解决方案。

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

(a>b)?b=a:b=b; 
被许多编译器解析为

((a>b)?b=a:b)=b;
这是一个错误,因为表达式
((a>b)?b=a:b)
的计算结果是一个右值,您尝试用
b
指定该右值会导致错误。尝试分配右值是一个错误。如果不是这样解析的,那么它只是一个语法错误。但不允许C编译器将其解析为:

((a>b)?b=a:(b=b)); //not allowed to parse by C language
因为C的语法不允许编译器像上面那样解析代码

<>但是你写的(原代码)是正确的,如C+++< /P> 这里C和C++的文法差别很大。由于这种差异,你可以看到两种语言对表达式的处理方式不同。也就是说,C++中的条件表达式与C中的条件表达式不同

Wikipedia为此提供了:

C和C++中的算子绑定 已指定(在相应的 (标准)通过一种考虑因素的语言 语法,而不是优先顺序 桌子这造成了一些微妙的变化 冲突。例如,在C语言中 条件表达式的语法 是:

逻辑还是表达式?表达方式: 条件表达式

在C++中,它是:

逻辑还是表达式?表达方式: 赋值表达式

因此,表达:

e=a 在这两种语言中的解析是不同的 语言。在C语言中,这个表达式是 语法错误,但许多编译器解析 它是:

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

e=(a 这是一个有效的表达式


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

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


C和C++不是同一种语言。你的问题是问C.Ya。。。我知道。。但是,在收回my+1的C和C++中,确切的代码表现相同,因为您添加的文本不正确。奇怪,因为你应该知道得更清楚,因为维基百科的解释很好。@Johannes:什么是不正确的?请具体点,谢谢。我修正了一些打字错误,这样我可以再次向上投票(所以说需要修改投票)。-1,不是真的。看到维基百科的解释了吗?对不起,我没有看到,它们显示
e=a
被解析为
e=((a
,这似乎与我所写的内容类似。你是说它说不应该被解析的部分吗?
((a>b)?b=a:b)=b;
b=(a>b)?a:b;