C'est l'un de mes préférés de questions d'entrevue. Je vais vous expliquer la réponse tout d'abord, et puis vous dire pourquoi j'aime la question.
Solution:
La réponse est que les deux extraits afficher les nombres de 0 à 4 inclusivement. C'est parce qu'un for()
boucle est généralement équivalent à un while()
boucle:
for (INITIALIZER; CONDITION; OPERATION) {
do_stuff();
}
Peut être écrite:
INITIALIZER;
while(CONDITION) {
do_stuff();
OPERATION;
}
Vous pouvez voir que l'OPÉRATION est toujours fait à la fin de la boucle. Dans ce formulaire, il doit être clair que l' i++
et ++i
ont le même effet: ils vont à la fois incrément i
et ignorer le résultat. La nouvelle valeur de i
n'est pas testé jusqu'à la prochaine itération commence, au sommet de la boucle.
Edit: Merci à Jason pour préciser que ce for()
de while()
d'équivalence de ne pas tenir si la boucle contient les instructions de contrôle (comme l' continue
) qui empêcherait OPERATION
d'être exécuté dans un while()
boucle. OPERATION
est toujours exécutée juste avant la prochaine itération d'un for()
boucle.
Pourquoi c'est une Bonne Question d'Entrevue
Tout d'abord, il ne prend qu'une minute ou deux, si un candidat dit de la la bonne réponse immédiatement, afin que nous puissions aller à droite à la prochaine question.
Mais étonnamment (pour moi), de nombreux candidats dites-moi la boucle avec la post-graduation afficher les nombres de 0 à 4, et la pré-incrémentation de la boucle va imprimer de 0 à 5 ou de 1 à 5. Ils expliquent généralement la différence entre le pré - et post-incrémentation correctement, mais ils comprennent mal la mécanique de l' for()
boucle.
Dans ce cas, je leur demande de réécrire la boucle à l'aide de while()
, et cela me donne vraiment une bonne idée de leur processus de pensée. Et c'est pourquoi je vous pose la question en premier lieu: je veux savoir comment ils abordent un problème, et de la façon de procéder lorsque j'ai jeté un doute sur la façon dont leur monde fonctionne.
À ce stade, la plupart des candidats à réaliser leur erreur et de trouver la bonne réponse. Mais j'en ai eu un qui a insisté pour sa réponse originale à cette question a droite, puis a changé la façon dont il traduit l' for()
de la while()
. Il a fait une interview passionnante, mais nous n'avons pas à faire une offre!
Espérons que ça aide!