40 votes

Pourquoi le retour 0 ou break 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). Il serait bon que vous me disiez ce qu'il en est.

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

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

Il en va de même pour for boucles :

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

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

60voto

Rakete1111 Points 10248

C'est parce que return y break sont des déclarations 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 similaires.

Ce que vous pouvez faire cependant, c'est réécrire votre expression (pour return ) afin qu'il ne soit pas imbriqué dans une expression - non pas que je recommande d'écrire du code comme ça :

return x++, 0;

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

11voto

Yunnosch Points 11189

L'opérateur virgule est destiné aux expressions.

El return et les autres déclarations pures ne sont pas des expressions.

3voto

David Dubois Points 3614

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

2 + 5 a une valeur 7

2 * 5 a une valeur 10

2 , 5 a une valeur 5 Il s'agit simplement de l'opérande à 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 break est une déclaration, pas une valeur.

A quoi sert un opérateur binaire qui ignore l'un de ses opérandes ? L'opérateur virgule ignore la valeur de l'opérande de gauche, mais l'expression est quand même évaluée. Tous les effets secondaires de cette expression sont toujours réalisés. Réfléchissez :

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

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

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