Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
915 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Boucles for sans les {} ?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Boucles for sans les {} ?

n°2292489
Lt Ripley
Ils ont tout niqué
Posté le 23-11-2016 à 11:39:58  profilanswer
 

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
mood
Publicité
Posté le 23-11-2016 à 11:39:58  profilanswer
 

n°2292490
Farian
Posté le 23-11-2016 à 11:47:31  profilanswer
 

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 !
n°2292491
kao98
...
Posté le 23-11-2016 à 11:49:05  profilanswer
 

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
n°2292528
Lt Ripley
Ils ont tout niqué
Posté le 23-11-2016 à 15:06:03  profilanswer
 

Ok merci beaucoup les gars !

n°2292576
theshockwa​ve
I work at a firm named Koslow
Posté le 23-11-2016 à 18:03:02  profilanswer
 

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


 
A quel if correspond le else ? :o


---------------
last.fm
n°2292579
Lt Ripley
Ils ont tout niqué
Posté le 23-11-2016 à 19:06:51  profilanswer
 

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
n°2292633
benriach
Posté le 24-11-2016 à 10:25:50  profilanswer
 

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.

n°2292642
rufo
Pas me confondre avec Lycos!
Posté le 24-11-2016 à 11:26:07  profilanswer
 

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
n°2292885
TotalRecal​l
Posté le 28-11-2016 à 14:57:35  profilanswer
 

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


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292888
rufo
Pas me confondre avec Lycos!
Posté le 28-11-2016 à 15:52:49  profilanswer
 

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
mood
Publicité
Posté le 28-11-2016 à 15:52:49  profilanswer
 

n°2292890
TotalRecal​l
Posté le 28-11-2016 à 16:01:20  profilanswer
 

1890 tu veux dire ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292896
Farian
Posté le 28-11-2016 à 17:05:54  profilanswer
 

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 !
n°2292897
TotalRecal​l
Posté le 28-11-2016 à 17:10:00  profilanswer
 

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


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292898
TotalRecal​l
Posté le 28-11-2016 à 17:12:29  profilanswer
 

... 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:


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
n°2292899
Farian
Posté le 28-11-2016 à 18:13:27  profilanswer
 

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 !
n°2292900
gilou
Modérateur
Modzilla
Posté le 28-11-2016 à 18:32:58  profilanswer
 

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é!  --
n°2292905
rufo
Pas me confondre avec Lycos!
Posté le 28-11-2016 à 20:28:37  profilanswer
 

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
n°2292925
Lt Ripley
Ils ont tout niqué
Posté le 29-11-2016 à 13:51:22  profilanswer
 

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

n°2292926
rufo
Pas me confondre avec Lycos!
Posté le 29-11-2016 à 13:58:32  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Boucles for sans les {} ?

 

Sujets relatifs
Rajouter des series en boucles Graphe excel.[Résolu]tri-fusion, jointure par hachage et boucles imbriquées
syntaxe des boucles et des "lists comprehensions" [résolu]Bash avec des boucles à exécuter avec du PHP
[jquery] Question un peu bateau sur les boucles[BATCH] 2 boucles FOR imbriquées
Boucles for imbriquées, macro trop lenteProbleme boucles bash
Equivalence boucles For et While(resolu) requetes sur 900 bases mysql avec boucles
Plus de sujets relatifs à : Boucles for sans les {} ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR