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.