Le but est uniquement de montrer le problème pas de faire compliquer.
Ce que j'ai écrit est indéterminé, par ce que tu as réécrit
Version imprimable
Eh bien, j'ai pas suivi ce topic depuis un moment, et ya du monde dessus maintenant !
Mais effectivement, quand j'ai lu le messagde de mongaulois, j'avais bien compris le principe du comportement indéterminé (méconnu par la plupart des développeurs). Et ton message, doccpu m'a fait marrer... Et tous les autres aussi, car tu survoles souvent les messages, et du coup, tu réponds... à côté :lol:.
Du coup, ça pollue ce topic, AMHA, depuis au moins une page.
C'est une remarque en passant.
Sinon, j'ai bien aimé le fait que le code :
Le fait que Visual et GCC ne donnent pas le même résultat est symptomatique des problèmes que l'expérience seule ne peut résoudre.Code:
1
2
3
4
5
6
7
8
9
10 void TestArray2(void) { int tab[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; size_t i = 0; int res1 = tab[++i] + tab[++i] + tab[++i] + tab[++i] + tab[++i]; i = 0; int res2 = tab[i++] + tab[i++] + tab[i++] + tab[i++] + tab[i++]; printf("resultat 1: %d - resultat 2: %d\n", res1, res2); }
Attention, ce n'est pas parce que tu n'écrit pas quelque chose qu'il ne le fait pas...
Crées un simple code du genre de
Demande au compilateur de te sortir le code assembleur (typiquementCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 class maclass { public: maclass(int a=0):a(a){} void add1(){a++;} bool ok(){return a==0;} private: int a; }; int main() { maclass *obj=new maclass() if( obj && obj->ok()) obj->add1(); return 0; }
gcc test.cpp -S)
Modifie le test en if(obj!=0 && obj->ok()) et compare le code assembleur fournis.
Tu remarquera que, selon les options d'optimisations fournies, mais en fournissant les même options d'optimisation à chaque fois, tu obtiendra un code assembleur identique à la virgule près.
Et c'est normal:
Même si tu ne précise pas le !=0, il doit quand même vérifier si obj (dans le cas du code fournis ici) existe ou non... Mais tu ne le dis pas
Même pour les "non débutants"...Citation:
mais comme tu l'a dit ca peux aider les débutant et comme ca change rien au shmilblic faites ce que vous prefferez
Tous les fichiers, entre leurs modifications sont "write once, read ever" (écrit une fois, lu souvent), et un code source ne fait pas exception.
Si tu maîtrise parfaitement l'état dans lequel tu es lors de l'écriture du code ou de sa modification, tu ne peux absolument pas préjuger de l'état dans lequel sera n'importe qui susceptible de le lire lorsqu'il le lira:
C'est peut etre quelqu'un de peu habitué au raccourcis C ou C++, il/elle est peut être creuvé(e) parce que son gosse a eu de la fièvre toute la nuit, il pense peut être à sa femme qui a eu un accident de voiture ou...
Ecrire !=0 (ou !=NULL) va prendre, à tout casser, 2,5 secondes... et le temps gagné par le fait de l'avoir explicité pour la personne qui le lit sera bien souvent largement supérieur à cela ;)...
Moralité, perdons un peu de temps à l'écriture et assurons nous que la lecture et la compréhension seront rapide :D
moi j'ai une approche differente sur le (if p && p->test()) :
je prefere ne pas mettre le test.
en effet pour moi cela alourdit en
qui est plus dur a lire du fait que je dois mettre moi meme les operateurs dans le bon sens.Code:
1
2 if( p != NULL && p->test() )
J'ai pris la gymnastique if(p) et if (p && p->test()) et desormais je passe plus de temps sur les expressions avec != 0.
http://emmanuel-delahaye.developpez.com/goret.htm
Goret Force 2, ça va :mouarf:
Je dirais que, tant que ton code n'est destiné à être lu que par toi, tu est tout à fait libre de faire strictement comme bon te semble.
Le problème se pose quand... ton code est destiné à être lu par une personne qui n'a pas forcément écrit le code :P
Et les occasions sont nombreuses: le travail collaboratif se décline en plusieurs mise en oeuvres réelles ;)
Et dans ce cas, il faut au minimum que tout le monde soit d'accord pour adapter des conventions de codages identiques... Sinon, cela devient la foire aux chapeaux ;):P
Pour mettre mon grain de sel, je ne suis pas sûr que NULL soit du C++ 8-)
NULL n'est jamais qu'un #define qui prend différentes versions selon le compilateur (allant de #define NULL 0 à #define NULL (void*)0 )
Il est apparut dans le C, mais il reste tout à fait correct de l'utiliser en C++, d'autant plus que, l'inclusion en cascade aidant, on le retrouve en incluant la grande majorité des en-têtes standards ;)
à moins d'ajouter l'include de windows.h dans VC, il ne veut pas de mon NULL. Je doute au contraire que ce soit bien de l'utiliser dans du code portable à moins de le définir soi-même...