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

Langages de programmation Discussion :

Sortie anticipée d'une boucle. "break"


Sujet :

Langages de programmation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut Sortie anticipée d'une boucle. "break"
    Bonjour la communauté de developpez.

    Ma question est simple mais je n'ai pas trouvé de réponse sérieuse sur le net.
    L'utilisation d'un "break" est elle judicieuse où faut il privilégier les conditions de sortie dans un while ?

    Exemple en Java avec break :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int val = 9;
    int tab[] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5};
    int i = 0;
    while (i<tab.lenght()) {
    	if (tab[i] != val) { break; }
    	i++;
    }
    Exemple en Java avec une condition de sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int val = 9;
    int tab[] = {1, 2, 6, 5, 2, 1, 9, 8, 1, 5};
    int i = 0;
    while ((i<tab.lenght()) && (tab[i] != val)) {
    	i++;
    }

  2. #2
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Ca va dependre de ton architecture, et de la complexite reelle de ta boucle.

    Dans le cas que tu montres, le code genere doit etre a peu pres pareil ; pour verifier, ecris ce programme en C, et regarde le code assembleur genere.

    Par contre, si tu as un vrai traitement dans ta boucle, ca peut changer un peu. Dans le premier cas, tu as deux tests consecutifs. Donc si on prend un processeur de type Sparc, qui charge les instructions 4 par 4, tu vas pouvoir faire les deux tests en un seul chargement.
    Par contre, si tes deux tests sont "eloignes", cela peut impliquer plus de sauts dans le code assembleur.

    Bien sur, sur une boucle avec 4 occurences, on s'en fou. Je pense ici a des boucles qui seraient appelees des millions de fois ou plus.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 124
    Par défaut
    Je vais suivre ton conseil. Je posterai mes conclusions .

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    en dehors de ce qu'a dit gangsoleil, il faut tenir compte aussi de plusieurs choses :

    • Il est possible qu'il y a ait un certain nombre de conditions, certaines ne pouvant être évaluées que à l'intérieur de la boucle..

    • Si le code figurant dans la boucle comporte des algos un tant soit peu complexes, ou pas mal de tests ou de ifs imbriqués, il est plus aisé de faire des "break" que d'ajouter des niveaux d'indentation... Sans compter les gains de temps de tests inutiles...

    • Toutes ces conditions sont également valables pour les "continue" aussi.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Août 2011
    Messages
    342
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Août 2011
    Messages : 342
    Par défaut
    Tu peux aussi boucler sur un flag. Le flag étant mis à jour par chacun des tests présents dans le corps de ta boucle. Cette solution peut te sauver la vie lorsque tu es en présence d'Ayatollah anti-break

    Edit : je complète ma réponse après avoir étudié plus en détail tes exemples.

    Dans "Clean Code", un bouquin que tu devrais vraiment lire si tu t'intéresses à tout ce qui est approche "propre" du codage, l'auteur suggère de remplacer les tests complexes par des appels de méthodes. Ca a selon lui l'avantage de simplifier la compréhension du code.
    Tu remplaces un test complexe par un appel de méthode avec un nom explicite décrivant le test en question.

  6. #6
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Citation Envoyé par GPPro Voir le message
    Dans "Clean Code", un bouquin que tu devrais vraiment lire si tu t'intéresses à tout ce qui est approche "propre" du codage, l'auteur suggère de remplacer les tests complexes par des appels de méthodes. Ca a selon lui l'avantage de simplifier la compréhension du code.
    Tu remplaces un test complexe par un appel de méthode avec un nom explicite décrivant le test en question.
    Je n'ai pas lu ce livre, et je ne souhaite pas troller dessus, mais pour une boucle appelee des millions de fois (boucle infinie de serveur, ...), un appel de methode n'a pas du tout le meme cout que le teste d'une variable.

    En gros, pour tester une valeur, on charge la valeur dans un registre, on charge la valeur attendue dans un autre, et on regarde si les deux ont la meme valeur. Et si la valeur testee est 0, il n'y a pas besoin du second chargement, car 0 est souvent stockee dans un registre "en dur" sur pas mal d'architectures.

    Un appel de methode, c'est beaucoup plus complexe, puisqu'outre la modification des registres, on va modifier le pointeur d'appel -- au grand minimum.
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

Discussions similaires

  1. sortie anticipé d'une procédure
    Par patou41000 dans le forum C++/CLI
    Réponses: 2
    Dernier message: 30/04/2007, 10h09

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