Error: lvalue requerido en este simple código C? (Ternario con asignación?)

Yo tengo :

#include int main() { int a=5,b=6; (a>b)?b=a:b=b; // Here is the error return 0; } 

Pero si reemplazo:

 (a>b)?b=a:b=b; // Error with (a>b)?(b=a):(b=b); // No-Error 

Entiendo que lvalue es un valor al que se le puede asignar algo y cómo es diferente de rvalue , pero ¿por qué los extra parenthesis rvalue la diferencia?

La tarea tiene una prioridad menor que el operador ternario, por lo que la línea se evalúa como:

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

utilizar:

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

En realidad, en C, este código

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

es analizado por muchos comstackdores como

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

que es un error, ya que la expresión ((a>b)?b=a:b) evalúa como un valor r que intenta asignar con b que da como resultado un error. Intentar asignar un valor r es un error. Si no se analiza de esa manera, entonces es simplemente un error de syntax . Pero un comstackdor de C no puede analizarlo como:

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

Porque la gramática de C no permite que un comstackdor analice el código como se indicó anteriormente.

Pero lo que has escrito (el código original) es correcto como C ++.

Aquí las gramáticas de C y C ++ difieren mucho. Y debido a esa diferencia, puede ver que ambos lenguajes tratan la expresión de manera diferente. Es decir, the conditional expression in C++ es diferente de the conditional expression in C

Wikipedia tiene una explicación muy buena y correcta para esto:

La vinculación de los operadores en C y C ++ se especifica (en los estándares correspondientes) mediante una gramática de lenguaje factorizada, en lugar de una tabla de precedencia. Esto crea algunos conflictos sutiles. Por ejemplo, en C, la syntax para una expresión condicional es:

¿lógica-O-expresión? expresión: expresión condicional

mientras que en C ++ es:

¿lógica-O-expresión? expresión: expresión-asignación

Por lo tanto, la expresión:

e = a

se analiza de manera diferente en los dos idiomas. En C, esta expresión es un error de syntax, pero muchos comstackdores lo analizan como:

e = ((a

que es un error semántico, ya que el resultado de la expresión condicional (que podría ser un ++) no es un valor l. En C ++, se analiza como:

e = (a

que es una expresión válida.

Es realmente:

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

Nota: usted debería simplemente

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

Cuando ponemos una ecuación entre paréntesis, se trata como una expresión. Y devuelve un valor que proporciona solución al error.