Error: lvalue required in this simple C code? (Ternary with assignment?)

Actually, in C, this code

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

is parsed by many compilers as

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

which is an error, as the expression ((a>b)?b=a:b) evaluates to an rvalue which you try to assign with b which results in an error. Trying to assign an rvalue is an error. If it is not parsed that way, then its simply a syntax error. But a C compiler is NOT allowed to parse it as:

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

Because the grammar of C does not allow a compiler to parse the code as above.

But what you’ve written (the original code) is correct as C++.

Here the grammars of C and C++ differ a lot. And because of that difference you see both languages treat the expression differently. That is, the conditional expression in C++ is different from the conditional expression in C .

Wikipedia has very good and correct explanation for this:

The binding of operators in C and C++
is specified (in the corresponding
Standards) by a factored language
grammar, rather than a precedence
table.
This creates some subtle
conflicts. For example, in C, the
syntax for a conditional expression
is:

logical-OR-expression ? expression :
conditional-expression

while in C++ it is:

logical-OR-expression ? expression :
assignment-expression

Hence, the expression:

e = a < d ? a++ : a = d

is parsed differently in the two
languages. In C, this expression is a
syntax error, but many compilers parse
it as:

e = ((a < d ? a++ : a) = d)

which is a semantic error, since the
result of the conditional-expression
(which might be a++) is not an lvalue.
In C++, it is parsed as:

e = (a < d ? a++ : (a = d))

which is a valid expression.

Leave a Comment