bonjour,
que pensez-vous de ce livre:
Programmer en langage C++ 9e édition: Couvre les versions C++11, C++14 et C++17 de la norme Broché – 19 octobre 2017
bonjour,
que pensez-vous de ce livre:
Programmer en langage C++ 9e édition: Couvre les versions C++11, C++14 et C++17 de la norme Broché – 19 octobre 2017
Les delannoy sont décriés depuis des années pour les mauvaises pratiques qu'il donne (approche historique du C). Les nouvelles normes semblent etre un ajout en annexes, ce n'est pas une réécriture. Donc a eviter a mon avis.
Lors d'un meetup C++, j'ai montré sans dire d'où ils venaient des codes extraits de la dernière édition de ce livre, en en proposant un revue de code. Les critiques se sont mises à pleuvoir dans tous les sens (et ce n'était pas que stylistique, certains étaient de vrais bugs), et quand à la fin j'ai indiqué que ces exemples venaient d'un livre, j'ai lu des spasmes nerveux sur les visages de ceux qui connaissaient cet auteur, et de la consternation sur ceux qui le découvraient ainsi.
Et je n'ai pas cherché longtemps ces exemples, c'étaient littéralement les premiers exemples de code que j'ai ouverts.
J'ai aussi lu un peu du contenu de ce livre (édition 8, disponible à mon travail, mais le sommaire de la 9 est identique). Dire que le livre couvre les normes récentes est à la limite de l'escroquerie. Ajouter 10 pages en fin d'un bouquin qui parle mal du C++98 n'est fera pas un bouquin à jour sur la norme C++11 ou 17...
La manière de programmer a totalement changé, et l'approche de ce bouquin ne permettra pas de devenir un bon développeur C++. Je déconseille très fortement ce livre.
Un petit exemple, issu d'un autre livre du même auteur, mais qui je pense devrait parler même à quelqu'un ne connaissant pas encore le C++ (code consultable là):
Il s'agit du premier exemple en C++du bouquin, et on peut citer en vrac :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include <iostream> using namespace std ; main() { int nombre, carre ; cout << "donnez un nombre : " ; cin >> nombre ; carre = 2 * nombre ; cout << "voici son carre : " << carre ; }
- Déclaration de la fonction main incorrecte (il manque un type de retour int)
- Utilisation de variable non initialisées totalement déconseillée (il aurait mieux valu écrire directement int carre = 2 * nombre; qui initialise la variable au moment de sa déclaration)
- Confusion entre nombre*nombre et nombre*2 !
- Manque un retour charriot à la fin
Ça fait beaucoup pour un si petit programme...
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Une petite parenthèse --n'ayant rien à rajouter à l'intervention de Loic, hormis peut-être : "les archives sont vos amies"
Je suis bien sûr totalement d'accord pour la définition retardée.
Pour ce qui est de ne pas initialiser, attention de ne pas tomber dans le travers fort trop répandu de
C'est une recommandation assez classique qui accompagne la transposition des pratiques héritées du Pascal, Fortran... et autres langages similaires au monde du C++: on déclare tout, puis on initialise par précaution, puis on travaille pour de vrai.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int carre = 0; du code... carre = 2 * expression
Je suis, aujourd'hui, persuadé que cette pratique est la pire du lot.
Le problème est que si dans "du code...", la valeur de "carré" venait à être utilisée, on utiliserait une valeur qui n'aura certainement pas le moindre sens. En n'initialisant pas, deux familles d'outils peuvent nous assister pour trouver le bug: les outils type valgrind (et autre memory sanitizers) qui peuvent détecter que l'on lit une donnée non initialisée, et les outils d'analyse statique de code (à commencer par "clang -wall") qui vont émettre un warning comme quoi un chemin du code consomme une donnée non initialisée. C'est juste énorme.
Si par malheur on initialise à une valeur bidon par défaut, aucun outil ne pourra plus nous assister -- ou pourquoi je pense que cette vieille pratique de programmation défensive est aujourd'hui une mauvaise pratique grâce à notre écosystème qui progresse, mais qu'elle (la pratique) neutralise.
Bien évidemment, en retardant la définition, là c'est le compilateur qui ne se gênera pas de nous signaler que l'on écrit de grosses bêtises, ou que l'on refactore un peu trop vite. Et c'est ce qu'il faut préférer!
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
merci pour vos contributions
et ce livre "Programming: Principles and Practice Using C++, 2nd edition"?
Je ne sais pas où vous avez trouvé ce code qui n'est pas celui qui figure dans l'ouvrage, que je reproduis ci-dessous :
Quant à l'initialisation de la variable carre, je vous renvoie au commentaire de Mr Luc Hermite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include <iostream> using namespace std ; int main() { int nombre, carre ; cout << "donnez un nombre : " ; /* pas de changement de ligne après écriture */ cin >> nombre ; carre = nombre * nombre ; cout << nombre << " a pour carre : " << carre ; }
Je ne vois pas en quoi l'absence de endl nuit ici au code.
De surcroît, je vous rappelle que nous avons ici affaire à un ouvrage d'initialisation à la programmation qui compare les différentes façons d'exprimer une notion dans différents langages. Ce serait plutôt mieux de lire le bouquin plutôt que de se contenter de chercher à tout prix à trouver des anomalies. Pendant qu'on y est, je vous souffle votre prochaine critique : il serait mieux d'ajouter un return 0 à la fin du main (ou, peut-être un return -1, voire return -9999 puisque le programme ne vous plaît pas...)
Pour info, l'annexe C++11/C++14/C++17 de Programmmer en langage C++ fait 50 pages et pas 10 !
Toujours pour info, je signale aux lecteurs de ce forum que vous avez publié le même jour (21/2/2018) trois critiques virulentes de mes ouvrages (une ici et deux sur Amazon). J'ai du mal à croire que ce soit un hasard, d'autant plus que ce sont les deux seules que vous ayez réalisées concernant des livres chez Amazon... Par ailleurs, pourriez nous expliquer pourquoi votre nom figure dans la traduction 2010 de "Programming principles and practice using C++" de 2010 et plus dans celle de 2012. Auriez-vous du mal à supporter que certains (mauvais selon vous) ouvrages soient populaires (juste avant vos critiques, l'ouvrage était "meilleure vente C++" depuis pas mal de temps). Pour info, voici les deux liens correspondants aux ouvrages évoqués :
https://www.amazon.fr/Programmation-...ct_top?ie=UTF8
https://www.amazon.fr/Programmation-.../dp/2744077186
Je n'ose ajouter cordialement
- J'ai indiqué dans le message où je l'ai trouvé (il suffit de cliquer sur le mot "là" dans la phrase "code consultable là"). Et je ne cherche pas à tout prix des problèmes, c'est littéralement le premier exemple disponible en téléchargement.
- Pour l'initialisation, avez-vous bien lu le message de Luc ?
- Non, je ne compte rien dire sur le return, c'est du code correct, et c'est un détail stylistique de second ordre, contrairement aux autres remarques que j'ai faites.
- L'absence du endl n'est pas le plus grave, j'en parle en dernier. C'est juste que quand on lance le programme, la sortie n'est pas lisible. Et que les version "équivalentes" Java et C# du code ont un saut de ligne.
- J'ai en effet commencer à publier une critique ici, suite à la question de ce post. Puis je me suis demandé pourquoi ce livre était encore régulièrement cité, depuis le temps qu'il est régulièrement décrié. Je suis donc allé voir sur Amazon où il n'y avait pas une seule critique écrite par quelqu'un qui ne soit pas débutant dans le langage. J'ai donc décidé d'en écrire. Voilà, pas de grand mystères, d'agenda caché ni de conspiration sur la simultanéité des critiques.
- Le fait que mon nom soit sur Amazon, dans une édition de la traduction du livre et pas dans l'autre, je n'en sais rien (et je m'en moque un peu en fait). Je ne sais pas trop pour quelle raison vous vous focalisez là dessus ? Dans un cas, ils ont nommé les traductrices, dans l'autre, Michel Michaud et moi qui avons effectué une relecture technique de la traduction. Je ne suis pas au courant de différences entre les deux en terme de contenu, et mon nom est en quatrième de couverture des deux. Et pour info, le but de ma démarche n'est pas de "vendre le mien au dépend du votre". Déjà, ce n'est pas mon style, mais ça vous n'êtes pas obligé de me croire sur parole. Peut-être comprendrez vous mieux l'argument que ce livre n'est plus vendu depuis plusieurs années, et que la version français a globalement été un flop, le public français préférant la version US ? Donc que je n'ai aucun intérêt dans la vente de cette traduction ? En outre, et même quand je gagnais quelques centimes par exemplaire, j'ai toujours recommandé plutôt la version US à ceux que l'anglais ne gêne pas trop, elle est plus complète, et a bénéficié d'une seconde édition. Voilà, j'ai répondu à l'attaque personnelle. Pourrait-on désormais se concentrer sur le contenu technique des livre, plutôt ?
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.
Après vérification, Loïc a raison le code sur le site d'Eyrolles est bien:
Le gag!carre = 2 * expression![]()
Partager