séparer le C et le C++
les unir
les unir mais savoir différencier les deux "styles de programmation"
non mais t'as rien compris
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é.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 (typiquement
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"...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![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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![]()
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
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![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
Pour mettre mon grain de sel, je ne suis pas sûr que NULL soit du C++![]()
an faite pour un if oui mais pour un for...
je préfère cette écriture
j'utilise pas NULL car ce n'est pas du C++
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part for (...;p!=0 && p->test();...) {...}![]()
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![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
à 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...
Compile sans problème avec gcc (mingw ou unix)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 #include <iostream> int main() { int * i = NULL; return 0; }
Non, la norme C++ spécifie que NULL doit être une constante entière de valeur zéro. Donc NULL est bien du C++ et ne peut pas être definie parmais par exemple par
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL ((void*)0)
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL 0
Code : Sélectionner tout - Visualiser dans une fenêtre à part #define NULL __null_ptr
Partager