Meuh si. Parce que c'est "préféré par le staff de l'école" qu'il faut lire :)
Même sans variable compteur :Citation:
S'il y a une variable qui sert naturellement de compteur à la boucle (elle s'incrémente une fois et une seule à chaque itération de la boucle), je trouve que la boucle for est plus claire à lire. Ne serait-ce que parce qu'il y a séparation plus claire entre le code de l'itération et le code décrivant ce qui a lieu pendant l'itération.
Sont deux formes de boucle idiomatiques et très lisibles. Les cas sont rares où une boucle while apporte vraiment en lecture ou en écriture de code. findfirst/findnext (parcours de répertoire) couvre un cas typique ;Code:
1
2
3 for (iterator i= v.begin(); v != end(); ++v) { } // pour le C++ for (llnode* node = list->start; node != NULL; node = node->next) { } // pour le C
Personnellement, j'ai généralement 85% de boucles for, 10% de boucles while, et 5% de boucles do/while, donc tu n'as pas à me convaincre. Dans mon prohet actuel (5000 lignes de code de pur C++) :
26 boucles for
2 boucles while
1 boucle do/while
Je crois que c'est assez parlant :)
(et la boucle do/while est en fait une protection pour encadre une macro :
Les deux autres boucles while sont :Code:
1
2
3
4
5
6
7
8 #define ACCEPT_VISITOR(type, v) \ do { \ type* __visitor = dynamic_cast<type*>((v)); \ if (__visitor) { \ __visitor->accept(this); \ } \ } while (0)
* parcours de répertoire
(parce que dans une boucle for, ça fait pas naturel du tout).Code:while ((entry = ::readdir(directory)) != NULL)
* recherche répéte de la position d'un caractère particulier dans une chaine
(même remarque).Code:while ((pos = out.find(L'\\', pos)) != std::wstring::npos)
Les boucles for (en direct live d'une sortie grep):
Parcours de collection en utilisant un index ou un itérateur, et parcours de la liste des children d'un noeud XML (merci libxml2 pour ton interface si jolie... hum).Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 compiler_generator_restriction_builder.cpp: for (n_type i = node.first_child(); i != node.last_child(); ++i) compiler_generator_restriction.cpp: for (std::size_t i = 0; i < m_conditions.size(); ++i) compiler_generator_restriction.cpp: for (std::size_t i=0; i<m_conditions.size(); ++i) compiler_generator_simple_type_builder.cpp: for (n_type i = node.first_child(); i != node.last_child(); ++i) compiler_generator_simple_type.cpp: for (std::size_t i=0; i<m_subgens.size(); ++i) compiler_schema_xsd_builder.cpp: for (a_type i = n.first_attribute(); i != n.last_attribute(); ++i) compiler_schema_xsd_builder.cpp: for (n_type i = root.first_child(); i != root.last_child(); ++i) tpl_template_engine.cpp: for (std::size_t i=0; i<m_files.size(); ++i) tpl_template_generator.cpp: for (std::size_t i = 0; i < m_iterations.size(); ++i) tpl_template_generator.cpp: for (variable_iterator i = m_variables.begin(); i != m_variables.end(); ++i) tpl_template_generator.cpp: for (std::size_t i=0; i<m_conditions.size(); ++i) tpl_template_generator.cpp: for (std::size_t i = 0; i < m_variable->size(); ++i) tpl_template_generator.cpp: for (block_iterator i = m_blocks.begin(); i != m_blocks.end(); ++i) tpl_template_generator.cpp: for (block_iterator i = m_blocks.begin(); i != m_blocks.end(); ++i) utils_command_line.cpp: for (int i = 0; i < ac; ++i) utils_command_line.cpp: for (std::size_t i = 0; i < m_options.size(); ++i) utils_command_line.cpp: for (std::size_t i=0; i<m_handlers.size(); ++i) utils_command_line.cpp: for (std::size_t i = 0; i < m_options.size(); ++i) utils_command_line.cpp: for (std::size_t i=0; i<m_handlers.size(); ++i) utils_transformer.cpp: for (std::size_t i=0; i<tlist.size(); ++i) utils_transformer.cpp: for (std::size_t i=0; i<m_ops.size(); ++i) utils_transformer.cpp: for (std::size_t i=0; i<out.length(); ++i) xml_details_iterator.h: for (std::size_t i = 0; i < n; ++i) xml_details_iterator.h: for (std::size_t i = 0; i < n; ++i) xml_node.cpp: for (a_type i = n.first_attribute(); i != n.last_attribute(); ++i) xml_node.h: for (xmlNodePtr child = m_node->children; child != NULL; child
Je le confirme. Connaissant Nicolas Sadirac, je suis même surpris qu'il accepte le C++. Il a du mettre de l'eau dans son vin :)