putain de syntaxe incomprehensible..
Par eau le jeudi 21 février 2008, 22:04 - geeking - Lien permanent
Alors, je faisais des trucs avec solaris 11 et sunstudio etc... et je suis tombe sur une erreur bizarre en compilant un joli desktop convivial etc..
en recuperant la sortie du preprocesseur j arrive a des macros imbriques les unes dans les autres et dont le statement final ressemble a la simplification faite en dessous :
#include <stdio.h>
#include <unistd.h>
#include <string.h>
void inc(int * value)
{
(*value)++;
}
int main(int argc, char ** argv)
{
char * path = (char *) strdup("proutprout");
char * toto = strdup ("glopglop");
int i = 0;
printf("i: %d path: %s\n", i, path);
path = ( inc(&i), toto );
printf("i: %d path: %s\n", i, path);
return 0;
}
qqun peut m'expliquer la ligne avec path = ( , ) et me dire POURQUOI ca marche et D OU CA VIENT cette syntaxe ?!?
a l'exec :
$ ./te i: 0 path: proutprout i: 1 path: glopglop
pkoi ca marche ?!?!?! en tout cas sunstudio 11 il aime TROP PAS cette syntaxe, a bon entendeur et si qqun a des reponses, je suis prenneur.
++

Commentaires
En C, plusieurs expressions séparées par des virgules sont évaluées dans leur ordre d'apparition. La plupart du temps c'est utilisé dans l'initialisation des boucles for : for(i = 0, j = 2; ; ). Pour ton exemple, inc(&i) est évalué, puis toto est évalué. La dernière expression évaluée est ensuite assignée à la variable path.
Par contre, il faut absolument des parenthèses. Sinon la ligne suivante :
path = inc(&i), toto;
aurait été évaluée comme :
(path = inc(&i)), (toto);
Bref, ça n'a aucune utilité en pratique à part dans les boucles for.
Salut,
C'est vrai que cette syntaxe n'est pas très claire ...
Pour comprendre son fonctionnement tu peux aller lire le lien suivant: http://publications.gbdirect.co.uk/...
section "3.4.2. The comma operator", section qui commence par "This wins the prize for ‘most obscure operator’." ...
C'est super utile pour perdre le relecteur, avec les classiques :
int i = 42; "// uh ??!??/
printf("i = %d\n");
et j'en passe !