In C the ternary operator is defined like
logical-OR-expression ? expression : conditional-expression
where conditional expression is defined like
logical-OR-expression
The assignment operator has a lower priority than the OR operator. Thus you have to write
a >= 5 ? b = 100 : ( b = 200 );
Otherwise the compiler consideres the expression like
( a >= 5 ? b = 100 : b ) = 200;
As the result of the ternary operator in C is not an lvalue then the above expression is invalid and the compiler issues an error.
From the C Standard:
the result is the value of the second or third operand (whichever
is evaluated), converted to the type described below
and footnote:
110) A conditional expression does not yield an lvalue.
Take into account that there is an essential difference between the operator definition in C and C++. In C++ it is defined as
logical-or-expression ? expression : assignment-expression
In C++ the same GCC compiles the code successfully
#include <iostream>
int main()
{
int a = 10, b;
a >= 5 ? b = 100 : b = 200;
std::cout << "b = " << b << std::endl;
return 0;
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…