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 :

go to et le c++


Sujet :

C++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �clair�
    Inscrit en
    Novembre 2006
    Messages
    304
    D�tails du profil
    Informations personnelles :
    �ge : 41

    Informations forums :
    Inscription : Novembre 2006
    Messages : 304
    Par d�faut go to et le c++
    Bonjour est ce que goto est propre a c++ ou non ?

  2. #2
    Expert confirm�
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par d�faut
    Salut,

    Le mot cl� goto a �t� h�rit� du C, et son usage est fortement d�conseill�. En C++, il y a toujours moyen de s'en passer.

    Meilleures salutations

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  3. #3
    Membre �clair� Avatar de ZaaN
    Inscrit en
    Novembre 2005
    Messages
    819
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 819
    Par d�faut
    non, bien au contraire. C'est un h�ritage de la programmation procedurale de l �poque.

  4. #4
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par d�faut
    Y'a quand m�me UN cas de figure en C/C++ o� le goto est int�ressant: une sorte de 'break' pour sortir de multiples boucles.
    Certes des alternatives existent, mais c'est plus lent...

    Exemple: rechercher un �l�ment dans une matrice
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    for (int i=0; i<M; ++i)
      for (int j=0; j<N; ++j)
        if (A[N*i+j]==a) goto found;
    found:;
    La preuve que c'est vraiment utile: la syntaxe du Java autorise au 'break' de sortir d'une boucle multiple

  5. #5
    Membre �m�rite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par d�faut
    Citation Envoy� par Charlemagne
    Exemple: rechercher un �l�ment dans une matrice
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    for (int i=0; i<M; ++i)
      for (int j=0; j<N; ++j)
        if (A[N*i+j]==a) goto found;
    found:;
    Bof, je pr�f�re, de loin :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    int find(T A[], int N, int M, T a)
    {
      for(int i = 0; i < M; ++i)
        for(int j = 0; j < N; ++j)
          if (A[N*i + j] == a) return N*i + j;
      return -1;
    }

  6. #6
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 42
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par d�faut
    Pareil.
    Certes des alternatives existent, mais c'est plus lent...
    Bof. A moins d'�tre en temps r�el, je ne vois vraiment pas l'int�r�t de se passer de constructions plus propres.

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par d�faut
    Citation Envoy� par Sylvain Togni
    Bof, je pr�f�re, de loin :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    int find(T A[], int N, int M, T a)
    {
      for(int i = 0; i < M; ++i)
        for(int j = 0; j < N; ++j)
          if (A[N*i + j] == a) return N*i + j;
      return -1;
    }
    Moi aussi, je pr�f�re un return, mais c'�tait un exemple � la con...

    Bof. A moins d'�tre en temps r�el, je ne vois vraiment pas l'int�r�t de se passer de constructions plus propres.
    Le principe utilise dans cette preuve me laisse un peu songeur...
    Arr�tez de me critiquer, ou bien critiquez donc �galement Stroustrup.
    Je le cite de son bouquin, sur le paragraphe consacr� au 'goto':
    (...) Un goto peut �galement �tre important dans les cas rares pour lesquels une efficacit� optimale est indispensable (...)
    L'une des applications les plus judicieuses de cette instruction consiste � sortir d'une boucle imbriqu�e ou d'une instruction switch (un break ne permet de remonter qu'un seul niveau de boucle ou d'instruction switch). Par exemple (...)
    D�j� lu un bouquin de C?

  8. #8
    Expert confirm�
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par d�faut
    Stroustrup cite Java?

    Plus s�rieusement, l'usage de goto pour cette t�che se d�fend m�me si je ne partage pas cet opinion.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  9. #9
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Charlemagne
    Arr�tez de me critiquer,


    Ca va mieux maintenant?

    ou bien critiquez donc �galement Stroustrup.
    Je le cite de son bouquin, sur le paragraphe consacr� au 'goto':
    Il n'ecrit rien de semblable a
    Citation Envoy� par Charlemagne
    La preuve que c'est vraiment utile: la syntaxe du Java autorise au 'break' de sortir d'une boucle multiple
    Raisonnement que je continue a trouver tres douteux, quelle que soit mon opinion sur les goto et la possibilite de sortir de plusieurs boucles en meme temps.

    D�j� lu un bouquin de C?
    Tu as deja lu mes messages sur le forum C?

  10. #10
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par Charlemagne
    La preuve que c'est vraiment utile: la syntaxe du Java autorise au 'break' de sortir d'une boucle multiple
    Le principe utilise dans cette preuve me laisse un peu songeur...

  11. #11
    Membre chevronn�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par d�faut
    Citation Envoy� par Charlemagne
    Y'a quand m�me UN cas de figure en C/C++ o� le goto est int�ressant: une sorte de 'break' pour sortir de multiples boucles.
    Certes des alternatives existent, mais c'est plus lent...

    Exemple: rechercher un �l�ment dans une matrice
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
     
    for (int i=0; i<M; ++i)
      for (int j=0; j<N; ++j)
        if (A[N*i+j]==a) goto found;
    found:;
    C'est moche et �a n'est pas beaucoup plus rapide que d'utiliser une condition de sortie de boucle:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool found = false;
    for (int i=0; (i<M) && (!found); ++i)
    {
      for (int j=0; j<N; ++j)
      {
        if (A[N*i+j]==a) 
          found = true;
      }
    }
    Ensuite si tu tiens vraiment � optimiser ce type de chose, commence par utiliser une boucle simple plut�t qu'une double boucle

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    for (int i=0; (i < M*N) && (!found); ++i)
    {
      if (A[N*i+j]==a) 
        found = true;
    }
    Maintenant, si tu poss�des la STL c'est tout aussi performant et plus lisible d'utiliser
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    find(A, A+(M*N), a);

  12. #12
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Par d�faut
    Citation Envoy� par Jan Rendek
    C'est moche et �a n'est pas beaucoup plus rapide que d'utiliser une condition de sortie de boucle:

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    bool found = false;
    for (int i=0; (i<M) && (!found); ++i)
    {
      for (int j=0; j<N; ++j)
      {
        if (A[N*i+j]==a) 
          found = true;
      }
    }
    C'est un peu plus long en temps de calcul � ta mani�re,
    et franchement je trouve le goto plus �l�gant.

    Citation Envoy� par Jan Rendek
    Ensuite si tu tiens vraiment � optimiser ce type de chose, commence par utiliser une boucle simple plut�t qu'une double boucle

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    for (int i=0; (i < M*N) && (!found); ++i)
    {
      if (A[N*i+j]==a) 
        found = true;
    }
    Maintenant, si tu poss�des la STL c'est tout aussi performant et plus lisible d'utiliser
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
     
    find(A, A+(M*N), a);
    C'est hors de propos: Tu peux effectivement ici ne faire qu'une boucle, mais c'�tait un exemple � la con pour illustrer une boucle imbriqu�e... rien de plus.
    Dans ce cas d'une boucle simple, t'aurais d� plut�t utiliser un 'break'.

    Tu peux toujours faire part de tes remarques � Stroustrup... que visiblement tu prends �galement pour un imb�cile.

  13. #13
    Invit�
    Invit�(e)
    Par d�faut
    Jan Rendek, si le goto est completement futile, pourquoi bigre fait-il parti du langage, nom de dieu !?

    et derniere petite remarque, car bcp de choses ont d�ja �t� dites ; en assembleur, le "goto" est indispensable, car toutes les boucles fonctionnent avec ca !

    voila, de mon avis perso, c'est pas propre du tout a utiliser, et c'est meme a proscrire, mais ne sois pas faschiste, il existe des cas ou l'on cherche l'optimisation et les performances, et il devient tres utile.

    je rapelle que pour programmer haut niveau, il existe des langages meilleurs que le C/C++, mais que ceux ci en revanche ont une place manifeste dans les langages bas niveau et dans l'informatique industrielle.

  14. #14
    Membre chevronn�
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Par d�faut
    Le goto est un atavisme de l'assembleur, il n'a quasiment plus sa place en C et encore moins en C++. Son utilisation pour sortir d'une boucle est compl�tement marginale. Je ne l'utiliserais que si cette boucle est un goulet d'�tranglement. De plus, avant de la mettre en pratique j'aimerais voir les benchmarks avec et sans et �valuer le gain que cela repr�sente.
    Algorithmiquement les deux m�thodes suivantes font exactement le m�me nombre de comparaisons. La seconde faisant une N*M affectations suppl�mentaire dans une variable que le compilateur assignera probablement dans un registre.
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    bool found = false;
    for (int i=0; (i<M) && (!found); ++i)
    {
      for (int j=0; j<N; ++j)
      {
        found = (A[N*i+j]==a);
      }
    }
    ----------------------
    for (int i=0; i<M; ++i)
      for (int j=0; j<N; ++j)
        if (A[N*i+j]==a) goto found;
    }
    De toute les mani�res ce n'est pas une pratique � encourager � quelqu'un qui commence le C ou le C++. Cette solution brise le flot d'ex�cution normal, masque le v�ritable algorithme et induit des risques d'erreurs de maintenance.
    Si j'ai 10 boucles de ce genres, je dois fixer � la main 10 labels diff�rents (found1, found2, found3...), que se passe-t-il quand je fais du 'refactoring' et que je d�place une boucle d'une autre unit� de compilation ? Ou bien que j'intervertisse quelques lignes de code aux environs de l'�tiquettes ?
    D�j� il y a 20 ans, il y avait des tonnes de mise en garde contre le 'goto' en basique. On pr�conisait de le bannir au profit des 'gosub'. Ce n'est s�rement pas pour le r�introduire maintenant.

    En assembleur le goto est indispensable, tr�s bien. Justement son emploi principal est de mettre en oeuvre des boucles et des appels de routines. Si je programme en C c'est justement pour me faciliter le travail et ne pas g�rer ces probl�mes de sauts conditionnels et d'�tiquettes. 'goto' je ne l'ai employ� que quand je programmais des drivers, dans du C qui contenait all�grement 60% d'assembleur. S�rement pas pour faire des boucles imbriqu�es.

    Ensuite, je ne prend pas Stroustrupt pour un imb�cile. Cependant, je me m�fie des exemples et des citations extraites de leur contexte. Je doute profond�mment que Stroustrupt milite pour l'usage syst�matique des 'goto' pour sortir d'une boucle multiple.

    Bref, cette solution n'est en aucun cas plus �l�gante, ni efficace. Je crois que son seul m�rite c'est de faire l33t HaXXor, mais ce n'est en aucun cas � employer dans du d�veloppement s�rieux.

    @toxcct: Si j'interviens dans ces forums c'est dans un but purement altruiste. J'accepte toute critique, mais s�rement pas de me faire traiter de 'fachiste' par quelqu'un que je ne connais ni d'Eve ni d'Adam.

  15. #15
    Expert confirm�
    Avatar de Mat.M
    Profil pro
    D�veloppeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 539
    D�tails du profil
    Informations personnelles :
    Localisation : France, Rh�ne (Rh�ne Alpes)

    Informations professionnelles :
    Activit� : D�veloppeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 539
    Par d�faut
    Citation Envoy� par Maria1505
    Bonjour est ce que goto est propre a c++ ou non ?
    Eternelle pol�mique.
    Je sugg�rrais de s'initier � l'assembleur x86....
    m�me si il n'y a aucun goto dans ton code source en C++ eh bien ton programme une fois compil� cela donnera toujours des jmp,je etc...
    Les sauts ne sont ni plus ni moins que des goto en ASM.

    Ceci dit il faut �viter d'utiliser goto c'est certain

    exemple en C
    int a=16;
    if (a==20) FaireQQueChose()

    En ASM cela va donner
    mov ax,10h
    cmp ax,10h
    je adresse_FaireQQueChose

    donc en langage machine cela donnera un goto ...

  16. #16
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    goto pose pas des probl�mes �vidents face au RAII ?

  17. #17
    Expert confirm�

    Inscrit en
    Novembre 2005
    Messages
    5 145
    D�tails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par d�faut
    Citation Envoy� par loufoque
    goto pose pas des probl�mes �vidents face au RAII ?
    Je ne vois rien. A moins que tu parles des limitations sur les cibles des goto en C++ qui font qu'on ne peut pas sauter un constructeur?

  18. #18
    Expert confirm�
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    D�cembre 2003
    Messages
    3 549
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : D�cembre 2003
    Messages : 3 549
    Par d�faut
    J'avoue avoir tr�s peu utilis� goto en C++, je ne sais donc pas quelles en sont les restrictions.
    Je pensais que c'�tait comme en C. (Mais bon, en C non plus je connais pas parfaitement)

  19. #19
    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 : 51
    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
    Par d�faut
    Citation Envoy� par toxcct Voir le message
    il existe cependant de tres rares cas o� le goto est utile, notamment pour des problemes de performance quand on veut sortir de plusieurs boucles imbriqu�es. Dans un tel cas, le break est inefficace car il ne faire ressortir que d'un niveau (et donc pas de toutes les boucles).
    Je ne suis jamais tomb� sur un cas o� l'utilisation d'un return, pr�c�d� �ventuellement d'un red�coupage en fonction ne s'est pas traduit par du code plus lisible qu'un goto.
    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.

  20. #20
    Invit�
    Invit�(e)
    Par d�faut
    Citation Envoy� par JolyLoic Voir le message
    Je ne suis jamais tomb� sur un cas o� l'utilisation d'un return, pr�c�d� �ventuellement d'un red�coupage en fonction ne s'est pas traduit par du code plus lisible qu'un goto.
    red�couper en fonctions implique un cout de performance pour les appels ou de m�moire dans le cas d'inline...

    je n'ai pas dit que c'�tait toujours vrai, j'ai dit qu'il existe de tres rares cas ou le goto peut �ventuellement servir.

    ne me fait pas dire ce que je n'ai pas dit, j'ai le goto en horreur.

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