C 两个不同事物之间比较的语法

C 两个不同事物之间比较的语法,c,operators,C,Operators,下面的程序给出了错误 #include<stdio.h> int main () { int a=10,b; a>=5?b=100:b=200; printf("\n%d",b); } 现在,如果我更换线路 a>=5?b=100:b=200; 借 然后编译,然后就没有错误了。 所以我想知道这是怎么回事 a>=5?b=100:b=200; 三元运算符(?:)比赋值运算符(=)具有更高的精度。因此,您的原始声明被解释为: ((a >= 5) ? (b = 1

下面的程序给出了错误

#include<stdio.h>
int main ()
{
int a=10,b;
a>=5?b=100:b=200;
printf("\n%d",b);
}
现在,如果我更换线路

a>=5?b=100:b=200;

然后编译,然后就没有错误了。 所以我想知道这是怎么回事

a>=5?b=100:b=200;
三元运算符(
?:
)比赋值运算符(
=
)具有更高的精度。因此,您的原始声明被解释为:

((a >= 5) ? (b = 100) : b) = 200;
改为这样写:

b = (a >= 5) ? 100 : 200;

这是惯用的C(条件周围的括号实际上不是必需的,但它们有助于可读性。)

因为它试图做到:
(a>=5?b=100:b)=200

但是括号中的东西不是左值。

您错误地使用了三元运算符。你的两个例子都是错误的,即使其中一个是编译的。该表达式根据第一个子表达式的真值计算为第二个子表达式或第三个子表达式

那么
a?b:c
b
相同,如果
a
为真,或者
c
如果
a
为假

使用此运算符的正确方法是将结果分配给变量:

b = a>= 5 ? 100 : 200;

它被解析为
(a>=5?b=100:b)=200在我看来。操作员优先?我猜第一个例子对于编译器来说是这样的:(a>=5?b=100:b)=200为什么第二个例子是错误的?好吧,它和你的例子做了同样的事情(虽然是以一种有趣的方式)。你在妄想中的lvaue是什么意思?
b = (a >= 5) ? 100 : 200;
b = a>= 5 ? 100 : 200;