IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Le mot clé continue en C++


Sujet :

C++

  1. #1
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut Le mot clé continue en C++
    Bonjour

    En terme de bonnes pratiques, est ce que c'est mal d'utiliser le mot clé continue dans un code c++ ? J'ai un cas ou ça me permettrait de bien réduire la complexité cyclomatique, qui rend vite le code illisible dans certains cas.
    Find me on github

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Pas de soucis pour utiliser "continue" ou "break".
    Par contre "goto"...

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Avant de l'utiliser, j'aurais tendance à regarder à deux fois si un refactoring ne me permettrait pas de l'éviter (par exemple, en mettant le corps de la boucle dans une fonction) de manière agréable, sinon, je n'aurais pas plus d'états d'âme que ça à le faire.
    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.

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Ce n'est qu'un ressenti personnel, et donc fatalement sujet à débat, mais, pour ma part, je suis tout relativement tout aussi allergique à l'utilisation de continue qu'à celle de break lorsque je ne suis pas dans une structure logique switch ... case.

    Maintenant, je vais m'empresser d'ajouter une précision, avant que certains ne se mettent à crier "au scandale"

    Je n'aime pas l'instruction continue, pas plus que je n'aime break en dehors des switch...case ou l'instruction goto.

    Cela ne veut absolument pas dire que je veuille en arriver à en interdire l'utilisation . J'ai beau être (actuellement ) responsable de rubrique, qui serais-je pour essayer d'imposer cette vision des choses

    Généralement, ma politique tient principalement sur deux aspects:
    1. la facilité de relecture de code
    2. la simplicité de programmation et de mise en oeuvre
    S'il est possible (et "seulement si") d'assurer la facilité de relecture du code en s'en passant sans pour autant nuire à la facilité de mise en oeuvre et de programmation, alors, le choix est fait: j'évite les continue

    S'il devient trop difficile d'assurer la simplicité de mise en oeuvre et de programmation en s'en passant, et que le code reste, malgré tout "suffisamment" (c'est un curseur à placer... où bon te semble ) facile à relire, il semble opportun de faire "contre mauvaise fortune, bon coeur" et d'accepter de déroger à la règle "générale" qui conseille de les éviter.

    Ceci dit, il est *peut-être* également intéressant de se poser la question de savoir si ta fonction n'en fait pas un peu trop, et d'envisager de la factoriser de manière plus efficace, ce qui *pourrait peut-être* te permettre d'éviter un recours trop intense à continue, en plus de te faciliter la tâche en terme de recherche d'erreurs.

    Je suis désolé de donner une réponse aussi "générique" à ta question, mais il me semble impossible d'être plus précis, chaque situation devant être évaluée individuellement

    hope it helps

    [EDIT]Grillé... ca m'apprendra à vouloir faire des discours
    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

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    J'ai la même réaction que Loic.

    Car, continue et break, c'est comme return, c'est une vieille histoire de SESE (Single Entry, Single Exit) que l'on se traine dans l'inconscient collectif depuis le C.

    Le SESE, cela sert d'abord à assurer une libération déterministe de ressources. Hors, pour cela, le C++ dispose du RAII (à contrario du C, du Pascal et autres langages pré-exceptions).

    Certains estiment que le SESE est nécessaire à rendre une fonction compréhensible. Foutaises! Si la fonction n'est pas compréhensible à cause d'une malheureuse interruption, c'est qu'elle est trop complexe. Qu'on la refactorise d'abord pour en extraire autant de parties que nécessaire (cf ce qu'à dit Loic). Pour une bonne compréhension et une bonne maintenabilité, c'est ça qui est important.
    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...

  6. #6
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Et bien merci pour ces réponses détaillées !

    Ho ce n'est pas tant qu'elle n'est pas compréhensible, mais ça rajoute des tas de ifs qui s'imbriquent les uns les autres et ça fera une mauvaise note de mon code au check cyclomatique ^^

    Non ce n'est pas indispensable, et d'ailleurs je vais m'en passer, mais la question m'intéressait au delà même de mon bout de code.
    Find me on github

  7. #7
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par jblecanard Voir le message
    Ho ce n'est pas tant qu'elle n'est pas compréhensible, mais ça rajoute des tas de ifs qui s'imbriquent les uns les autres et ça fera une mauvaise note de mon code au check cyclomatique ^^
    Dans ce cas là, réécrit le code, ne laisse pas ces ifs. Tu peux donner une idée de ce à quoi il ressemble, qu'on puisse être plus précis ?
    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.

  8. #8
    screetch
    Invité(e)
    Par défaut
    il y a quand même quelques très mauvais cas d'utilisations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    do
    {
      if(blablabla) break;
      /* plein de trucs */
      if(dobidouwa) break;
      /* plein de trucs */
    } while(0);
    qui est un vilain goto ecrit de manière un peu pompeuse. (break peut aussi etre remplacé par continue)

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Ce qui est vilain, c'est /* plein de trucs */

    Et contrairement à goto, on ne peut aller qu'à un seul endroit. Nous sommes loin de l'article "goto considered harmful" qui date d'une époque où il y pouvait y avoir des entrecroisements de spaghettis.
    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...

  10. #10
    screetch
    Invité(e)
    Par défaut
    avoir un "do while" qui ne boucle pas c'est méchamment difficile a relire.

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    OK. J'avais manqué le 0. Des fois des gens ont des idées bizarres.
    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...

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Avril 2010
    Messages : 43
    Points : 50
    Points
    50
    Par défaut
    Roh mais arreter ce délit de facies avec le goto c'est bien !
    C'est meme tellement bien que certains ont inventé le goto++ !
    http://www.gotopp.org/presentation.html.fr

    Au passage on peut admirer ses caractéristiques :
    * C'est le meilleur langage de programmation au monde.
    * Et même mieux, c'est le meilleur langage de programmation de l'univers.
    * Il a une syntaxe claire et accessible.
    * La possibilité de faire des GOTO.
    * Manipulation des références (équivalent des pointeurs) pour faire plus de bugs.
    * Multitâche très simple : on utilise un GOTOUNIVERSPARALLELEouizzz à la place d'un GOTO normal et le flux d'exécution du programme se sépare en deux.
    * Objet : héritage, propriétés et méthodes partagées, accès aux membres par indice...
    * Modulaire : grâce à une interface très simple, il est possible de programmer des modules en C++. Le GOTO++ propose entre autres un module réseau très facile à utiliser (en combinaison avec les caractéristiques multitâches du langage).
    * Expressions régulières.
    * Tableaux, tables de hachage...
    * Des GOTO ! Plein de GOTO !
    * Et bien d'autres choses !
    Que ce language permet de faire des troupeaux de pinguouin anonymes.
    De faire la merveilleuse commande gotochezpasou (oui oui un goto a atterrissage random si c'est pas merveilleux !)

    Non bref le goto c'est bien mangez en !


    Allez j'en remet une couche :
    Le GOTO++ (ce fabuleux langage) est le fruit d'un travail considérable de réflexions profondes sur le sens de la vie, la nature du monde qui nous entoure, l'utilité des coléoptères à pattes articulées dans notre écosystème et moultes choses non moins importantes. Cependant, son élaboration a été avant tout motivée par la nécessité de compter les suicides de pingouins dans les regions méridionales de l'Antarctique sauvage. Pour parler plus concrètement, le GOTO++ est basé sur des règles non conventionelles. Il n'y a pas d'opérations logiques en GOTO++, bien qu'on puisse s'y ramener par des artifices complexes. L'instruction de base est le GOTO, qui ne fait absolument rien. Ensuite vient le GOTOGOTO qui permet de se rendre en un autre point du programme (un goto classique me direz-vous). Toutefois, le GOTOGOTO requiert, en plus du label, un pourcentage de réussite qui va permettre de calculer la probabilité pour que le GOTOGOTO vous envoie vraiment à cette étiquette. Là, normalement, votre esprit vient de s'illuminer, vous avez atteint la libération du cycle du samsara et vous réalisez avec enthousiasme les innombrables possibilités qui sont désormais à votre disposition. Alors n'hésitez plus, rejoignez les millions de programmeurs qui ont déjà choisi le GOTO++ comme langage de prédilection !

    Voici, en guise d'exemple, le fameux « Hello World! » écrit en GOTO++. Notez l'élégance du code et le fait que notre boucle n'est pas infinie mais se répète un nombre aléatoire de fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    §1
    GOTOPRINTDUTEXTE() ; «Hello World !»
    GOTO qui sert a rien
    GOTOGOTO() *(1)
    Ce message etait sponsorisé par la société des informaticiens trolls

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    OK. J'avais manqué le 0. Des fois des gens ont des idées bizarres.
    ou pas ??? (j'ai toujours pas compris l'intérêt mais bon)
    http://www.developpez.net/forums/d35...pp/define-gcc/

  14. #14
    screetch
    Invité(e)
    Par défaut
    Citation Envoyé par Luc Hermitte Voir le message
    OK. J'avais manqué le 0. Des fois des gens ont des idées bizarres.
    ah oui effectivement il saute pas forcément aux yeux
    mais on est bien d'accord, des fois les gens......

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Citation Envoyé par yan Voir le message
    ou pas ??? (j'ai toujours pas compris l'intérêt mais bon)
    http://www.developpez.net/forums/d35...pp/define-gcc/
    Ici c'est une macro.
    Potentiellement multi-instructions, ou aussi une macro qui oblige à mettre des ';' derrière histoire de ne pas perturber l'indentation automatique.
    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...

  16. #16
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Le "try" est un magnifique goto. En fait c'est un goto qui ne se dit pas, mais il peut avoir lieu n'importe où, n'importe quand. Il suffit d'épousseter quelques labels (pardon, des catch) ça et là pour avoir, peut-être, une chance de constater qu'un goto a fait son oeuvre quelque part.

  17. #17
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Citation Envoyé par camboui Voir le message
    Le "try" est un magnifique goto. En fait c'est un goto qui ne se dit pas, mais il peut avoir lieu n'importe où, n'importe quand. Il suffit d'épousseter quelques labels (pardon, des catch) ça et là pour avoir, peut-être, une chance de constater qu'un goto a fait son oeuvre quelque part.
    Il y a certe interruption du flux normal mais soit tu attrapes l' exception ici et tu la traites soit tu remontes la pile d'appel pour tenter de trouver un bloc qui peut la traiter..
    On ne peut pas parler de goto (qui lui envoie potentiellement n'importe où dans la portée courante).
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  18. #18
    Membre expert Avatar de jabbounet
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juin 2009
    Messages
    1 909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 909
    Points : 3 284
    Points
    3 284
    Par défaut
    Citation Envoyé par camboui Voir le message
    Le "try" est un magnifique goto. En fait c'est un goto qui ne se dit pas, mais il peut avoir lieu n'importe où, n'importe quand. Il suffit d'épousseter quelques labels (pardon, des catch) ça et là pour avoir, peut-être, une chance de constater qu'un goto a fait son oeuvre quelque part.

    personnellement je ne suis pas fan de la programmation par exception mais je pense qu'il s'agit d'une autre débat. les goto et continue j'arrive aussi a m'en passer.

    Je n'utilise les try/catch que lorsque cela s'avère nécessaire c'est à dire pour gérer des cas exceptionnel comme par exemple l'appel de fonctions externe bas niveau non maitrisées (dans le sens boite noire) et qui peuvent en lancer par exemple.

    dans l'absolu j'arrive toujours a me passer des exception des l'instant ou je n'ai pas a m'interfacer avec des fonctions pouvant en lever.
    bazar: http://www.improetcompagnie.com/publ...ctacles-6.html

    BÉPO la disposition de clavier francophone, ergonomique et libre: http://bepo.fr/wiki/Accueil

    Emacs Wiki: http://www.emacswiki.org/

    En attente de ce que produira: http://www.pushmid.com

  19. #19
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu es en train de nous dire que tu n'utilises (en C++) jamais des choses comme new, ou les conteneurs standards.
    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...

  20. #20
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    ou je n'ai pas a m'interfacer avec des fonctions pouvant en lever.
    oO... Sa fait pas gras :')
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

Discussions similaires

  1. Extraction de mots clés
    Par Olive1808 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 01/02/2016, 20h49
  2. [VB6] attendre un événement pour continuer l'exécution
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 21
    Dernier message: 12/11/2002, 13h08
  3. [langage] Continuer a parser une ligne
    Par D[r]eadLock dans le forum Langage
    Réponses: 5
    Dernier message: 30/09/2002, 18h49
  4. Au sujet des mots de passe
    Par FranT dans le forum Langage
    Réponses: 6
    Dernier message: 17/09/2002, 22h16
  5. [langage] Reconnaissance de mots
    Par Flo. dans le forum Langage
    Réponses: 2
    Dernier message: 10/08/2002, 23h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo