Quel est le meilleur? do {} while (0); ou goto xy; [fermé]
-
09-10-2019 - |
Question
J'ai deux morceaux de code:
A faire en boucle:
do
{
errorflag=0;
...
if(cond1)
{
errorFlag=12;
break; // Error Conditions
}
.
. // Processing
.
if(cond2)
{
errorflag=56;
break;
}
.
.
} while (0);
l'étiquette A:
errorflag=0;
if(cond1)
{
errorflag=12;
goto xy;
.
.
.
.
if(Cond2)
{
errorflag=56;
goto xy;
}
.
.
.
xy:
Quelle est la meilleure? S'il vous plaît me donner les détails pourquoi? ou est-il une meilleure façon de le faire? Nous optimisons le code. Nous sommes plus à la recherche dans ce genre de grandes boucles. niveau de l'Assemblée est, il n'y a pas beaucoup de place pour l'optimisation. S'il vous plaît fournir à vos entrées.
Je ne aime pas utiliser d'autre, si depuis, il est de nouveau en tête de vérifier une condition supplémentaire. Donc, sortir directement quand il y a un problème.
Je me sens après modifier ma question est logique
Merci à l'avance
La solution
Le choix ici, sur la base de votre question, est do-while
et goto
.
Je vous recommande de choisir do-while
.
Je vous déconseille d'utiliser goto
. Cela vous mènera à des spaghettis code plus tard.
Vous pouvez avoir des alternatives comme if
et if-else
à venir avec le même résultat.
Dites non à goto
Autres conseils
Option 3:
void frobnicate(arguments)
{
if (cond1) return;
if (cond2) return;
...
}
frobnicate(the_arguments)
Choisissez un nom significatif, et le garder court.
Ils génèrent le même code (en supposant l'examen de la valeur du compilateur) de sorte que la différence est l'un qui est plus facile à comprendre et si le do / while interfère avec d'autres constructions en boucle qui sont sur le point. S'il y a une telle interférence, utilisez GOTO. Sinon, ne pas; ils sont moins claires (en général).
Et regardez attentivement pour voir si votre fonction est trop complexe et doit être refactorisé en plusieurs fonctions avec un but plus clair et plus simple flux de contrôle.
Sérieusement? Avez-vous jamais entendu parler de else
?
if (cond1)
{
//stuff
}
else if (cond2)
{
// more stuff
}
// etc
else
{
// default
}
Modifier
J'ai mal lu la question. Je vais laisser la vieille réponse ici parce que les commentaires ne font pas de sens otherwirse.
La bonne façon de code exactement comme par ce qui est dans la question est:
if (!cond1)
{
.
.
.
.
}
Dans les deux cas à la question, la partie if (cond2)
n'a pas d'effet (en supposant cond2 n'a pas d'effets secondaires), car ils ont tous deux un saut à cause de la déclaration qui sera exécuté suivant de toute façon. C'est la raison pour laquelle je l'ai laissé sortir.
Jetez un oeil à http://www.cprogramming.com/tutorial/goto.html
goto
est le mal. Vous ne devez utiliser goto
s quand il n'y a absolument pas d'autre façon de le faire. goto
s peut conduire à code spaghetti imprévisible (difficile à lire, à comprendre, à déboguer, très sujet aux erreurs sur les phases de maintenance).
Je crois qu'une infinie en boucle avec des déclarations de break
conditionnelles est encore mieux, bien qu'il soit plus lisible lorsque les conditions sont exprimées dans la déclaration de while
.