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?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top