27 votes

Ce qui ne l' ++ (ou -) de l'opérateur de retour?

Tout en jouant avec l' ++ opérateur, j'ai essayé d'écrire ce qui suit:

++i++;

Je m'attendais à cette compilation au premier, mais j'ai une erreur de compilation:

L'opérande d'une incrémentation ou de décrémentation de l'opérateur doit être une variable, propriété ou d'indexation.

J'ai ensuite essayé d'écrire ++(i++) pour aider le compilateur à comprendre ce que je voulais dire mais aussi (sans surprise) n'a pas fonctionné.

Donc, je suis sorti en me demandant ce qui ne l' ++ opérateur de retour ? Avec le compilateur erreur que je reçois, je m'attendais ++i de ne pas retourner un int représentant la valeur de i incrémenté, mais ce n'est pas le cas puisque je n' i = (++i) + 1 avec le succès...

Quelqu'un a une idée de pourquoi l' ++ opérateur ne peut pas être enchaînés ?

Aussi, (++i).GetType() n'retour System.Int32.

45voto

D Stanley Points 54768

En C# Le ++ de l'opérateur renvoie la valeur avant (pour i++) ou après (pour ++i) incrémentation.

L'erreur que vous voyez n'est parce que l'opérateur ne peut être utilisé sur une variable, d'une propriété, ou d'indexation. La raison est parce que l'intention de l'opérateur est d'incrémenter la variable qui est référencé. Vous ne pouvez pas l'utiliser sur une expression ou d'un autre type. Que serait - (9++) faire?

Vous vous attendez (i++)++ équivalent à i++; i++. Mais i++ renvoie une valeur et, en interne, par incréments i. Puisque vous ne pouvez pas appliquer l'opérateur ++ pour une valeur de chaînage n'est pas possible.

La différence de C++, c'est que le ++ préfixe opérateur prend une référence en entrée et renvoie une référence à la valeur d'origine, de sorte que vous pouvez de la chaîne de l'opérateur, car il est juste d'utiliser le pointeur au lieu d'une valeur. Le postfix opérateur renvoie une valeur et ne peut donc pas être enchaînés.

17voto

p.s.w.g Points 81433

Le résultat de l' ++ ou -- de l'opérateur est la valeur de la variable, de propriété, ou d'indexation, et pas la variable, des biens, ou d'indexation elle-même.

Vous ne pouvez pas double-incrémenter une variable comme (i++)++ pour la même raison que vous ne pouvez incrémenter une valeur par elle-même, comme 100++.

4voto

zneak Points 45458

Si je peux emprunter la terminologie de C ou C++, l'opérateur ++ ici renvoie à une "valeur " r". Une valeur de r ne correspondent pas à un type de langue, c'est une syntaxe astuce pour distinguer ce qui est assignable (modifiable) et ce qui ne l'est pas.

Quelque chose que vous pouvez trouver sur le côté gauche d'une opération d'affectation est appelé l-valeur (à gauche de la valeur), et les choses que vous pouvez trouver sur le côté droit d'une affectation sont "des valeurs r" (droite des valeurs). Le ++ opérateur doit fonctionner sur une l-value, parce qu'il faut lui attribuer. Cependant, le retour de l'expression doit être une valeur r, parce qu'il ne serait pas logique de faire n' i++ = 4 en C#, tout comme il ne serait pas logique de faire n' foo.Bar() = 4 ou 1 = 5.

C# n'a pas lvalues ou rvalues en soi, mais il les limites de ce qui peut être trouvé sur le côté gauche d'une affectation de variables, propriétés et d'indexation des opérations. Ce n'est pas par coïncidence, également que vous pouvez utiliser l'opérateur ++ sur.

1voto

Jaider Points 2366

J'ai réalisé que vous ne pouvez pas utiliser ++ avant ou après une expression.

Lorsque vous utilisez:

++(i++);

vous faites quelque chose comme:

++(<expression>)

Le compilateur résoudre l'expression en premier et ensuite il va incrémenter le résultat de l'expression et que son fou. L'opérande ++ travaux par incrément immédiate d'un variable non le résultat d'une expression.

Comment la programmation expressions sont évaluées? La grammaire de la Langue (BNF) http://people.cis.ksu.edu/~schmidt/301s11/Lectures/bnfT.html

Voici un autre exemple de l'utilisation correcte de cet opérande ++

int i = 0, j = 0;
int sum = i++ + j++;
//result sum = 0, i = 1, j = 1

Cet opérande ++ est en désordre, depuis 3 chose à la fois (lecture, l'accroissement, l'affectation). Personnellement je ne l'utilise pas dans les grandes expressions, comme dans l'exemple ci-dessus: i++ + j++. Mais j'ai toujours l'utiliser dans la boucle for ou while boucle par lui-même.

Même une courte expression tels que i = j++; est un gâchis. Gardez votre code simple et facile à comprendre. De la même expression peut être écrire comme:

i = j;
j++; //or j+=1;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X