Les deux sont identiques, et voici comment vous pouvez le savoir, en regardant ce que fait le compilateur (même sans que l'optimisation soit réglée à un niveau élevé) :
Regardez ce que le compilateur (gcc 4.0) fait à vos exemples simples :
1.c :
main(){ int var; while(int i < 100) { var = 4; } }
gcc -S 1.c
1.s :
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -16(%ebp)
jmp L2
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
leave
ret
2.c
main() { while(int i < 100) { int var = 4; } }
gcc -S 2.c
2.s :
_main:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl $0, -16(%ebp)
jmp L2
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
leave
ret
A partir de là, vous pouvez voir deux choses : premièrement, le code est le même dans les deux.
Deuxièmement, le stockage de var est alloué en dehors de la boucle :
subl $24, %esp
Et finalement, la seule chose dans la boucle est l'affectation et la vérification de la condition :
L3:
movl $4, -12(%ebp)
L2:
cmpl $99, -16(%ebp)
jle L3
Ce qui est à peu près aussi efficace que vous pouvez l'être sans supprimer entièrement la boucle.
7 votes
Pour être clair, le code ci-dessus ne "déclare" pas cent fois var.
1 votes
@Rabarberski : La question référencée n'est pas un doublon exact car elle ne précise pas de langue. Cette question est spécifique au C++ . Mais selon les réponses postées à votre question référencée, la réponse dépend du langage et éventuellement du compilateur.
2 votes
@jason Si le premier bout de code ne déclare pas cent fois la variable 'var', pouvez-vous expliquer ce qui se passe ? Est-ce qu'il déclare la variable une fois et l'initialise 100 fois ? J'aurais pensé que le code déclarait et initialisait la variable 100 fois, puisque tout dans la boucle est exécuté 100 fois. Merci.
1 votes
Cela répond-il à votre question ? Déclarer des variables dans les boucles, bonne ou mauvaise pratique ?