Bonjour
j'ai trouvé ce code qui compile:
et j'avoue ne pas comprendre le but de la virgule dans le test.Code:
1
2
3
4
5
6
7
8 void test (long long d) { int b = 7; if (b==7, 1) { b = 8; } }
Bonne journée
Version imprimable
Bonjour
j'ai trouvé ce code qui compile:
et j'avoue ne pas comprendre le but de la virgule dans le test.Code:
1
2
3
4
5
6
7
8 void test (long long d) { int b = 7; if (b==7, 1) { b = 8; } }
Bonne journée
La virgule est en réalité un opérateur :mrgreen: elle permet d'évaluer 1 par 1 des expressions, de gauche à droite (<- :koi: par contre je ne sais plus si le sens est spécifié dans la norme ou c'est dépendent du compilateur)
Mais surtout, il retournera toujours le résultat de la dernière expression.
Il faut penser à la boucle for, pour l'enchaînement des initialisations et/ ou des pas (si plus de 2 sont nécessaire)
Donc ici tu as 2 expressions b==7 et 1 et elle retourne la valeur 1 :mrgreen: donc ta condition sera toujours vrai.
D'ailleurs mon compilateur gcc semble assez malin pour détecter la tautologie :wow: : main.c:XXX.XXX: warning: l'opérande à gauche de la virgule n'a pas d'effet [-Wunused-value]
Tu peux tester ces codes :whistle:
Résultat : b: 8Code:
1
2
3
4 int b = 4; if (b ==7, 1) { b = 8; } printf("b: %d\n", b);
Résultat : b: 4Code:
1
2
3
4 int b = 4; if (b ==7, 0) { b = 8; } printf("b: %d\n", b);
Merci M'sieur !
Il y a la page wiki en anglais :mrgreen: qui permet de signaler plusieurs choses :
- Pour le passage de paramètres ce n'est pas l'opérateur. Donc des fois c'est l'opérateur, des fois non
- On peut mettre dans l'expression qui n'est pas la + à droite, tout ce qui peut être pertinent comme des chaînes de caractères, des affectations ou un appel de fonction pour ensuite tester son retour.
- On ne peut pas assigner le retour
- La précédence la + faible
Bonjour
C'est l'opérateur séquentiel. De fait, vu son nom, il y a fort à parier que le sens d'évaluation sera toujours de la gauche vers la droite. C'est d'ailleurs en général ce que disent la majorité des docs et tutos C et c'est aussi décrit ainsi dans cette doc développez.
Oui enfin tous les exemples de cette page sont quand-même des exemples bien foireux, presque écris "exprès" pour intégrer une virgule là où on n'en a pas besoin. Parce que partout où la virgule est mise on peut écrire la même chose sans. Ca fait bien longtemps qu'on sait que c'est pas difficile d'écrire du code dégueu en C ;)
Le seul moment où la virgule est vraiment incontournable c'est quand on veut faire évoluer plusieurs variables en parallèle dans un for (i.e for (i=0, j=15; i < 10; i++, j+=2)).
Ou alors on met tout ça dans une autre instruction
Ca j'ai pas vu où c'était dans la page. Mais si c'est un truc style if (x=fct(), x != 0) (ce qui là encore laisse supposer une évaluation nécessairement allant de la gauche vers la droite) alors je préfère encore la version habituelle if ((x=fct()) != 0).