Donc, tu essaies d'appeler avec l'ancien my_bar qui n'est pas encore initialisé.
Qui n'est /peut être/ ("MAY be undefined") pas encore initialisé.
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre d'execution entre les "," et le compilateur peut évaluer la partie droite avant d'executer la gauche, si j'ai bien tout pigé.
C'est un effet de bord, "normalement" (s'il n'y avait pas cette affectation), my_bar ne devrait pas être initialisé, et je ne sais pas ce qu'en dit le standard.
C'est donc le même problème qu'avec l'évaluation des arguments d'une fonction (qui peut se faire dans un ordre totalement arbitraire), hélas.
Je pense que oui, il ne faut jamais faire mumuse avec les effets de bords ;-)
Xavier Roche wrote:
Donc, tu essaies d'appeler avec l'ancien my_bar qui n'est
pas encore initialisé.
Qui n'est /peut être/ ("MAY be undefined") pas encore initialisé.
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre
d'execution entre les "," et le compilateur peut évaluer la partie
droite avant d'executer la gauche, si j'ai bien tout pigé.
C'est un effet de bord, "normalement" (s'il n'y avait pas
cette affectation), my_bar ne devrait pas être initialisé,
et je ne sais pas ce qu'en dit le standard.
C'est donc le même problème qu'avec l'évaluation des arguments d'une
fonction (qui peut se faire dans un ordre totalement arbitraire), hélas.
Je pense que oui, il ne faut jamais faire mumuse avec
les effets de bords ;-)
Donc, tu essaies d'appeler avec l'ancien my_bar qui n'est pas encore initialisé.
Qui n'est /peut être/ ("MAY be undefined") pas encore initialisé.
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre d'execution entre les "," et le compilateur peut évaluer la partie droite avant d'executer la gauche, si j'ai bien tout pigé.
C'est un effet de bord, "normalement" (s'il n'y avait pas cette affectation), my_bar ne devrait pas être initialisé, et je ne sais pas ce qu'en dit le standard.
C'est donc le même problème qu'avec l'évaluation des arguments d'une fonction (qui peut se faire dans un ordre totalement arbitraire), hélas.
Je pense que oui, il ne faut jamais faire mumuse avec les effets de bords ;-)
Côme Desplats
Xavier Roche wrote:
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre d'execution entre les ","
Bon en fait ce n'est pas ça, l'opérateur "séquentiel" (le ",") est bien.. séquentiel, donc pas de problème d'ordre. Je n'ai pas trouvé la spec exacte, mais il semble bien qu'il n'y ait pas de problème avec l'ordre d'évaluation. (1)
D'ailleurs, le code: char foo[42] = "foo!"; char *bar; *(bar = foo, bar) = 0; ne pose pas de problème .
Et donc pas normal que l'exemple plus haut donne des boutons à gcc. Il y aurait-il une subtilité lié au pointeur de fonction ?
Il est indiqué dans cette doc que "The result of a comma expression is not an lvalue." Le warning est peut-être lié à ceci.
Xavier Roche wrote:
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre
d'execution entre les ","
Bon en fait ce n'est pas ça, l'opérateur "séquentiel" (le ",") est
bien.. séquentiel, donc pas de problème d'ordre. Je n'ai pas trouvé la
spec exacte, mais il semble bien qu'il n'y ait pas de problème avec
l'ordre d'évaluation. (1)
D'ailleurs, le code:
char foo[42] = "foo!";
char *bar;
*(bar = foo, bar) = 0;
ne pose pas de problème .
Et donc pas normal que l'exemple plus haut donne des boutons à gcc. Il y
aurait-il une subtilité lié au pointeur de fonction ?
Bon, apparamment POSIX/ANSI ne standardise pas non plus l'ordre d'execution entre les ","
Bon en fait ce n'est pas ça, l'opérateur "séquentiel" (le ",") est bien.. séquentiel, donc pas de problème d'ordre. Je n'ai pas trouvé la spec exacte, mais il semble bien qu'il n'y ait pas de problème avec l'ordre d'évaluation. (1)
D'ailleurs, le code: char foo[42] = "foo!"; char *bar; *(bar = foo, bar) = 0; ne pose pas de problème .
Et donc pas normal que l'exemple plus haut donne des boutons à gcc. Il y aurait-il une subtilité lié au pointeur de fonction ?