Erreur: lvalue requirejs dans ce code C simple? (Ternary avec assignation?)

J’ai :

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

Mais si je remplace:

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

Je comprends que lvalue est une valeur à laquelle on peut atsortingbuer quelque chose et en quoi elle est différente de rvalue , mais pourquoi la extra parenthesis fait-elle la différence?

L’affectation a une priorité inférieure à celle de l’opérateur ternaire. La ligne est ainsi évaluée:

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

utilisation:

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

En fait, en C, ce code

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

est analysé par de nombreux compilateurs comme

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

qui est une erreur, car l’expression ((a>b)?b=a:b) à une valeur rvalue que vous essayez d’affecter à b ce qui entraîne une erreur. Essayer d’atsortingbuer une valeur rvalue est une erreur. S’il n’est pas analysé de cette façon, c’est simplement une erreur de syntaxe . Mais un compilateur C n’est PAS autorisé à l’parsingr comme suit:

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

Parce que la grammaire de C ne permet pas à un compilateur d’parsingr le code comme ci-dessus.

Mais ce que vous avez écrit (le code d’origine) est correct en C ++.

Ici les grammaires de C et C ++ diffèrent beaucoup. Et à cause de cette différence, vous voyez que les deux langues traitent l’expression différemment. En d’autres termes, the conditional expression in C++ est différente de the conditional expression in C

Wikipedia a une explication très bonne et correcte pour cela:

La liaison des opérateurs en C et C ++ est spécifiée (dans les normes correspondantes) par une grammaire de langage factorisé, plutôt que par un tableau de priorité. Cela crée des conflits subtils. Par exemple, en C, la syntaxe d’une expression conditionnelle est la suivante:

expression-OU-logique? expression: expression conditionnelle

en C ++ c’est:

expression-OU-logique? expression: assignation-expression

D’où l’expression:

e = a

est analysé différemment dans les deux langues. En C, cette expression est une erreur de syntaxe, mais de nombreux compilateurs l’parsingnt comme suit:

e = ((a

ce qui est une erreur sémantique, puisque le résultat de l’expression conditionnelle (qui pourrait être un ++) n’est pas une lvalue. En C ++, il est analysé comme suit:

e = (a

ce qui est une expression valide.

C’est vraiment:

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

Note: vous devriez simplement

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

Lorsque nous mettons une équation entre parenthèses, elle est traitée comme une expression. Et cela retourne une valeur qui apporte une solution à l’erreur.