Boucles for sans les {} ?

Boucles for sans les {} ? - C++ - Programmation

Marsh Posté le 23-11-2016 à 11:39:58    

Salut HFR
 
Je suis le cours c++ de guillaumme.belz
 
Sur une page (sur les collections) il y a ce code :
 
   

Code :
  1. #include <iostream>
  2.     #include <vector>
  3.     #include <string>
  4.    
  5.     int main() {
  6.         std::vector<int> const i { 1, 2, 3, 4 };
  7.         for (auto const value: i)
  8.             std::cout << value << '\t';
  9.         std::cout << std::endl;
  10.    
  11.         std::vector<double> const d { 1.2, 3.4, 5.6, 7.8 };
  12.         for (auto const value: d)
  13.             std::cout << value << '\t';
  14.         std::cout << std::endl;
  15.    
  16.         std::vector<std::string> const s { "un", "deux", "trois", "quatre" };
  17.         for (auto const value: s)
  18.             std::cout << value << '\t';
  19.         std::cout << std::endl;
  20.     }


J'en conclu que les boucles for ne prennent en compte que ce qui est indenté ?  Je croyais que les espaces n'avaient pas d'importance  :pt1cable:
 
Comment on sait ou elles s’arrêtent ?  Il n'y a pas de {} ouvrantes/fermantes
 
Merci d'avance pour votre savoir  ;)


Message édité par Lt Ripley le 23-11-2016 à 11:40:47
Reply

Marsh Posté le 23-11-2016 à 11:39:58   

Reply

Marsh Posté le 23-11-2016 à 11:47:31    

Bonjour !

 

Cela n'a rien à voir avec les espaces ou l'indentation, qui, en effet, ne sont pas pris en compte et ne servent qu'à la lisibilité (pas comme en python, donc).

 

Le contenu de la boucle est soit la "ligne" de code suivante (dont la fin est matérialisée par le point-virgule) suivante, soit le bloc (matérialisé par des accolades) suivant.

 

Dans le cas qui nous intéresse, les deux codes sont strictement équivalents :

 
Code :
  1. for (auto const value: s)
  2.     std::cout << value << '\t';
 

et

 
Code :
  1. for (auto const value: s)
  2. {
  3.     std::cout << value << '\t';
  4. }


Si le bloc ne contient qu'une ligne de code, les accolades ne sont, techniquement, pas obligatoires, cela revient au même, mais, à titre personnel, je les mets toujours.

 

Si on veut mettre au moins deux "lignes" dans la boucle, il faut absolument définir un bloc avec des accolades.

 

Bonne continuation !


Message édité par Farian le 23-11-2016 à 11:49:24

---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 23-11-2016 à 11:49:05    

Tout comme pour les if et autres blocs, s'il n'y a pas les accolades, seule l'instruction suivante est concernée.

 
Code :
  1. if (true)
  2.     cout << "foo"
  3. if (false)
  4.     cout << "bar"
  5. cout << "baz"
  6. // affiche "foobaz"
 

L'indentation n'est pas nécessaire

 
Code :
  1. if (true)
  2. cout << "foo"
  3. if (false)
  4. cout << "bar"
  5. cout << "baz"
  6. // affiche "foobaz" tout pareil que le source précédent
 

Mais c'est, à mon sens, à éviter. Les accolades devraient être toujours présentes. Leurs absence peut souvent être source de bug, parfois très très grave, comme ce fut en partie le cas du bug TLS/SSL d'apple.

 

Edit : [:benou_grilled]


Message édité par kao98 le 23-11-2016 à 11:50:48

---------------
Kao ..98 - Uplay (R6S) : kao98.7.62x39 - Origin (BF4, BF1) : kntkao98
Reply

Marsh Posté le 23-11-2016 à 15:06:03    

Ok merci beaucoup les gars !

Reply

Marsh Posté le 23-11-2016 à 18:03:02    

Code :
  1. if (a)
  2.   if (b)
  3.     cout << "blah";
  4. else cout << "plop";


 
A quel if correspond le else ? :o


---------------
last.fm
Reply

Marsh Posté le 23-11-2016 à 19:06:51    

Je dirais le 2ème
 
Edit : même si, si c'est ça, l'identation n'est pas bonne


Message édité par Lt Ripley le 23-11-2016 à 19:07:50
Reply

Marsh Posté le 24-11-2016 à 10:25:50    

c'est bien cela, d'où l'importance de la forme.
 
on aurait pu l'écrire

Code :
  1. if (a) if (b) cout << "blah"; else cout << "plop";

ce qui n'aurait pas posé de problème au compilateur mais ça devient tout de suite incompréhensible.

Reply

Marsh Posté le 24-11-2016 à 11:26:07    

C'est clair, je mets toujours les  { }
Après, y'a le débat de les mettre à la "java" ou à la "C"

Code :
  1. if (a) {
  2.    cout << "coucou";
  3. } else {
  4.    cout << "toto";
  5. }


 
contre

Code :
  1. if (a)
  2. {
  3.    cout << "coucou";
  4. }  
  5. else
  6. {
  7.    cout << "toto";
  8. }


 
Perso, je fais plutôt à la "C" (2ème code).


Message édité par rufo le 24-11-2016 à 11:26:31

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-11-2016 à 14:57:35    

Comme toi : avec les { } et retours à la ligne systématiques. Même si ça me fait passer pour un vieux rétrograde, je trouve ça considérablement plus lisible.
 
Bel exemple le machin de chez Apple. En même temps l'indentation est foireuse, et ça manque de retours à la ligne entre chaque bloc if distincts. Et puis quelle idée de faire des goto. Bien fait pour eux :o


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 28-11-2016 à 15:52:49    

C'est vrai que le goto, je pensais que ça avait été abandonné depuis la fin des années 90  :whistle:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-11-2016 à 15:52:49   

Reply

Marsh Posté le 28-11-2016 à 16:01:20    

1890 tu veux dire ?


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 28-11-2016 à 17:05:54    

Je crois qu'un certain Linus Torvalds n'est pas de votre avis ...
 
http://koblents.com/Ches/Links/Mon [...] rnel-Code/


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 28-11-2016 à 17:10:00    

Je crois qu'un certain Edsger Dijkstra n'est pas de l'avis de Linus et toi, et qu'il ne l'était déjà pas avant même de savoir que Linus ne serait pas de son avis :o


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 28-11-2016 à 17:12:29    

... Bon après, je dois reconnaitre que c'est pas forcément un super argument, vu que le monsieur n'était en fait à peu près de l'avis de personne sur tous les sujets :lol:


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 28-11-2016 à 18:13:27    

Et , de plus, je n'ai jamais dit que j'étais pour les "goto" ! A titre personnel, je n'ai jamais eu besoin (à part en assembleur) d'en utiliser.


---------------
On n'est jamais très fort pour ce calcul !
Reply

Marsh Posté le 28-11-2016 à 18:32:58    

rufo a écrit :

C'est vrai que le goto, je pensais que ça avait été abandonné depuis la fin des années 90  :whistle:

Il y a des cas très précis ou ça peut être efficace, en particulier si tu implémentes a la pogne un automate a états finis.  
Mais a part quelques cas marginaux comme celui la, c'est a proscrire.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 28-11-2016 à 20:28:37    

Et encore : un automate à états finis, tu peux assez facilement le modéliser avec un réseau de Pétri (donc, des matrices).
En PHP, j'ai utilisé un automate à états finis pour faire une sorte de MVC. Pour se faire, je suis passé par un tableau associatif qui contenait les url des scripts à exécuter en fonction des actions.
 
Tout ça pour dire que la dernière fois que j'ai fait un goto, c'était sur mon Amiga 500, dans un code écrit en BASIC :D Bref, c'est pas tout jeune !


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-11-2016 à 13:51:22    

Je note je note...
 
goto, c'est le mal !  (ça tombe bien que je vois ça parceque j'était tenté justement)

Reply

Marsh Posté le 29-11-2016 à 13:58:32    

Mettre des goto un peu partout dans un programme, ça le rend surtout assez compliqué à comprendre parce qu'on passe son temps à sauter d'un endroit à un autre dans le code. Alors qu'avec les structures de contrôle classiques (if/else, for, while, switch...), c'est normalement plus lisible et permet une lecture du code plus linéaire donc, plus facile à comprendre et donc, à débugger ou repérer des erreurs ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed