web-dev-qa-db-fra.com

Pourquoi retourne 0 ou la pause ne fonctionne pas avec l'opérateur virgule?

Je peux écrire le code if(1) x++, y++; au lieu de if(1) {x++; y++;}, mais dans certains cas, cela ne fonctionne pas (voir ci-dessous). Ce serait bien si vous m'en parliez.

int x = 5, y = 10;    
if (x == 5) x++, y++;  // It works

if (x == 5) x++, return 0; // It shows an error

La même chose s'applique aux boucles for:

for (int i = 0; i < 1; i++) y++, y += 5; // It works

for (int i = 0; i < 1; i++) y++, break; // Does not work
41
Nayem

En effet, return et break sont des instructions et non des expressions. En tant que tel, vous ne pouvez en aucun cas l'utiliser dans une autre expression. if et les autres sont également des déclarations.

Cependant, vous pouvez réécrire votre expression (pour return) afin qu'elle ne soit pas imbriquée dans une expression - bien que je ne recommande pas d'écrire du code comme celui-ci:

return x++, 0;

Vous ne pouvez pas faire cela pour break car il n'accepte pas d'expression.

60
Rakete1111

L'opérateur virgule est pour les expressions.

L'instruction return et les autres instructions pures ne sont pas des expressions.

11
Yunnosch

L'opérateur virgule est un opérateur binaire qui prend deux valeurs. De cette façon, c'est pareil que + ou *. Tandis que + ajoute deux valeurs et renvoie le résultat, et * multiplie deux valeurs et renvoie le résultat, l'opérateur de virgule ignore simplement la valeur à gauche et renvoie la valeur à droite.

2 + 5 a la valeur 7

2 * 5 a la valeur 10

2 , 5 a la valeur 5, simplement l'opérande situé à droite de l'opérateur.

Et donc vous ne pouvez pas écrire 2,break pour la même raison que vous ne pouvez pas écrire 2+break. Parce que la pause est une déclaration, pas une valeur.

Quelle est l'utilisation d'un opérateur binaire qui ignore l'un de ses opérandes? L'opérateur de virgule ignore la valeur de l'opérande gauche, mais l'expression est toujours évaluée. Tous les effets secondaires de cette expression sont toujours réalisés. Considérer:

i = 2;
j = 5;
i++, j++;

D'abord, les deux expressions sont évaluées. i++ renvoie la valeur 2, puis incrémente i. j++ renvoie la valeur 5, puis incrémente j. Enfin, l'opérateur de virgule est appliqué à ces deux valeurs: 2,5 qui ignore le 2 et retourne le 5.

3
David Dubois