2009-07-07 6 views
7

J'ai une question simple que je pose principalement pour ma curiosité.Différence de performance dans une condition de boucle?

Quelles sont les différences entre ces deux lignes de code? (En C++)

for(int i = 0; i < N, N > 0; i++) 

for(int i = 0; i < N && N > 0; i++) 

La sélection des conditions est tout à fait arbitraire, je suis intéressé par les différences entre, et & &. Je ne suis pas un débutant à coder par tous les moyens, mais je n'ai jamais été dérangé par l'opérateur virgule. Y at-il des différences de performance/comportement ou est-ce purement esthétique? Une dernière note, je sais qu'il y a des poissons plus performants à faire frire qu'un opérateur conditionnel, mais je suis juste curieux. Faites-moi plaisir.

Modifier Merci pour vos réponses.

Il s'avère que le code qui a provoqué cette question a mal utilisé l'opérateur de virgule comme je l'ai décrit. Je me demandais quelle était la différence et pourquoi ce n'était pas un opérateur & &, mais il était juste écrit incorrectement. Je ne pensais pas que quelque chose n'allait pas parce que ça marchait très bien. Merci de m'avoir arrangé. L'utilisation d'une virgule comme celle éliminera la première condition

+0

Pourquoi êtes-vous inquiet au sujet de la performance? Dans le temps nécessaire pour obtenir une réponse à cette question, les 9 nanosecondes que vous auriez sauvegardées en utilisant l'une ou l'autre notation seraient déjà perdues. "L'optimisation prématurée est la racine de tous les maux ..." – Juliet

+17

Il n'a pas dit qu'il était inquiet - juste curieux. Je souhaite vraiment que les gens cessent d'agiter le drapeau de «l'optimisation prématurée» chaque fois que quelqu'un «veut juste savoir». La curiosité est une * bonne chose *. –

+5

Je me demande combien de temps serait économisé si SO implémente un filtre qui, chaque fois que quelqu'un mentionne les mots "performance" ou "rapid" dans une question, affiche simplement un commentaire disant "vous n'êtes pas autorisé à penser à que, citoyen, maintenant retournez au travail ";-) –

Répondre

10

Bien qu'il ressemble à elle,

for(int i = 0; i < N, N > 0; i++) 

et

for(int i = 0; i < N && N > 0; i++) 

ne sont pas équivalents.

Voici la preuve.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    int val = (N, i); 
    cout << val << endl; 
} 

Résultat:

5 

Ce qui signifie que le moment de déterminer quand la boucle sortira, il utilisera N > 0. Si N = 10, cela signifie qu'il sera toujours vrai et que la boucle ne sortira jamais.

Exécutez ceci et voyez l'épreuve.

int main(int argc, char* argv[]) 
{ 
    int N = 10; 
    int i = 5; 

    for(int i = 0; i < N, N > 0; i++){ 
    cout << val << endl; 
    } 
} 

bash-2.05$ ./a.out     
0         
1         
2         
3         
4         
5         
6         
7         
8         
9         
10         
11         
... 
142 
143 
144 
145 
146 
147 
148 
^C 

Si N est une constante ou variable qui ne change pas dans la boucle alors vous pouvez retirer le chèque N > 0 en cochant une fois premier, à savoir

if (N > 0){ 
    for (int i = 0; i < N; i++) 
    ... 
} 
+0

Je ne sais pas pourquoi personne n'a voté cela. J'aime une réponse réfléchie et détaillée quand je demande une explication. Merci – CodeFusionMobile

+3

Je ne voterais pas parce qu'il ne précise pas clairement la différence, et essaie de déterminer la signification par expérience, plutôt que de regarder la norme ou toute la documentation. –

+0

J'aime les exemples et les expériences personnellement. La réponse de RichieHindle était courte et précise, mais pas très descriptive et n'a pas répondu à ma question quelle est la différence réelle. Même si cette réponse n'a pas détaillé la raison derrière le problème, elle a effectivement répondu à la question. – CodeFusionMobile

33

L'opérateur de virgule signifie "exécuter ces instructions dans cet ordre et prendre la valeur du dernier".

+0

comme il l'ignore totalement et n'effectue pas la vérification? – Victor

+2

La valeur de "' < N, N > 0' "est la même que celle de" 'N> 0'". – ephemient

+1

@Victor: Il compare i et N, rejette le résultat, puis compare N et 0 et utilise le résultat pour décider s'il faut continuer la boucle. En code optimisé, il ne sera probablement pas la peine de comparer i et N. – RichieHindle

Questions connexes