++ I Différence de l'opérateur en C # et C ++
-
14-11-2019 - |
Question
J'ai le code suivant écrit en C ++ et C #
int i=0;
++i = 11;
Après ce compilateur C #, apporte une erreur
The left-hand side of an assignment must be a variable, property or indexer
Mais le compilateur C ++ génère ce code sans erreur et j'ai obtenu un résultat 11
pour la valeur de i
. Quelle est la raison de cette différence?
La solution
La différence est que l'opérateur pré-incrément est se répercuter en C ++, et n'est pas en C #.
En C ++ ++i
Renvoie une référence à la variable incrémentée. En C # ++i
Renvoie la valeur incrémentée de la variable i.
Donc dans ce cas ++i
est se répercuter en C ++ et réalité en C #.
À partir de la spécification C ++ sur l'opérateur d'incrément préfixe
Le type de l'opérande doit être un type arithmétique ou un pointeur vers un type d'objet complètement défini. La valeur est la nouvelle valeur de l'opérande; c'est un se répercuter.
Ps L'opérateur d'incrément PostFix I ++ n'est pas LVALUE en C # et C ++, donc ces lignes de code apporteront une erreur dans les deux langues.
int i=0;
i++ = 11;
Autres conseils
Notez que ++i = 11
invoque indéfini dans C ++ 03 parce que vous modifiez i
deux fois sans point de séquence intermédiaire. Il est bien défini dans C ++ 11, cependant: d'abord l'incrément, puis l'affectation.
C # et C ++ sont 2 langues et concepts totalement différents. Ils ne partagent le nom que parce que leur syntaxe est basée sur C. donc en fait "pourquoi cela fonctionne sur C # mais pas sur C ++" n'a aucun sens en tant que question. C'est la même chose que de dire pourquoi une table est appelée "table" en anglais, mais "Mesa" en espagnol. Parce qu'il a été décidé d'être comme ça.
C # ne permet tout simplement pas une telle syntaxe.
En C ++, vous êtes autorisé à: d'abord ++i
est calculé, ce qui fait i = 1
, puis 11 est affecté à i
, ce qui rend i = 11
.
La sémantique est très différente. En C ++, la sémantique est que vous attribuez la valeur 11 à l'emplacement de stockage identifié par i. En C #, la sémantique est égale à la sémantique de la déclaration ci-dessous
1=11
C'est-à-dire qu'il est égal à essayer d'attribuer la valeur 11 à la valeur 1 que le compilateur C # ne permet pas. (Les compilateurs de Fortran permettent en fait cela et cela peut créer des scénarios de débogage infernal)