2010-11-28 31 views
0

J'essaie de comprendre un code C. Dans une partie il y a:Question sur "goto" dans C

for ...{ 
    if condition{ 
     a=1; 
     break; 
    } 
} 

qui, dans une version ultérieure est modifiée:

for ...{ 
    if condition{ 
     goto done; 
    } 
} 
done: a=1; 

De mon point de vue, les deux vesions devraient donner le même résultat, mais il ne se produit pas. Est-ce que tu sais pourquoi?

CORRECTION: Le correctif est:

for ...{ 
    if condition{ 
     goto done; 
    } 
} 

      goto notdone; 
      done: 
       ok=0; 
      notdone: 
+0

Est-ce le code entier ou existe-t-il d'autres boucles imbriquées? – casablanca

+0

non, pas de boucles imbriquées – flow

+2

Je vois votre correction et je reconnais qu'elle fait la même chose que la version 1, mais je ne comprends pas pourquoi vous remplaceriez une solution parfaitement bien par une autre qui utilise un ensemble non intuitif de 'goto' s ... – Heinzi

Répondre

6

Il dépend de la boucle for a d'autres conditions de sortie.

  • Dans le premier exemple, a=1 ne se produit que pour cette condition de sortie spécifique dans le instruction if. Dans le second exemple, a=1 se produit dans tous les scénarios qui sortent de la boucle. Il peut uniquement être contourné en utilisant une instruction return ou une autre instruction goto.

+0

+1 pour une bonne réponse; L'analyse des flux est la clé pour démêler le code. –

3

Dans la deuxième version, a=1 est finalement exécuté même sicondition était faux, simplement parce que le flux de contrôle atteint finalement done: après la condition de la boucle ne soit plus remplie.

+0

à droite, et comment le réparer? – flow

+0

@Werner: En utilisant la version 1? Non, sérieusement, cela dépend du comportement que vous voulez. Si vous voulez le comportement de la version 1, utilisez la version 1. Si vous voulez le comportement de la version 1, mais vous ne pouvez pas utiliser la version 1 pour une raison quelconque, dites-nous la raison pour que nous puissions suggérer une alternative. La solution la plus simple serait de remettre 'a = 1' dans la condition. – Heinzi

+0

droite, vous m'avez donné le point, alors il était très facile de réparer – flow