164 votes

Jamais vu avant C ++ for-loop

J’étais la conversion un algorithmn C++ en c#. Je suis tombé sur cette boucle FOR :

Il n’y a aucune erreur dans C++, mais il le fait en c# (impossible de convertir int en bool). Je ne peux pas vraiment comprendre cette boucle, où est la condition ?

Quelqu'un peut-il s’il vous plaît expliquer ?

PS. juste pour vérifier, pour adapter un vecteur à une liste b.back() correspond-elle à b [b.Count-1] ?

321voto

dasblinkenlight Points 264350

La condition de la boucle est au milieu entre les deux points-virgules - .

En C++, il est OK pour mettre presque n’importe quelle expression comme condition : tout ce qui prend la valeur zéro signifie ; non nulle signifie .

Dans votre cas, la condition est : lorsque vous convertissez en c#, ajoutez simplement :

165voto

slim Points 12620

Beaucoup de réponses précises, mais je pense qu'il vaut la peine d'écrire l'équivalent de la boucle while.

for (u = b.size(), v = b.back(); u--; v = p[v]) 
   b[u] = v;

Est équivalent à:

u = b.size();
v = b.back();
while(u--) {
   b[u] = v;
   v = p[v];
}

Vous pourriez envisager de refactoring pour le while() format que vous le traduire en C#. À mon avis c'est plus clair, moins d'un piège pour les nouveaux programmeurs, et tout aussi efficace.

Comme d'autres l'ont souligné-mais pour faire ma réponse complète-pour rendre le travail en C# vous auriez besoin de changer de while(u--) de while(u-- != 0).

... ou while(u-- >0) seulement dans le cas où u commence négatif. (OK, b.size() ne sera jamais négatif-mais considérons le cas général où, peut-être quelque chose d'autre initialisé u).

Ou, pour le rendre encore plus clair:

u = b.size();
v = b.back();
while(u>0) {
   u--;
   b[u] = v;
   v = p[v];
}

Il vaut mieux être clair que pour être laconique.

66voto

Daniel Daranas Points 15123

La condition est - u--;, parce que c'est dans la deuxième position de la pour instruction.

Si la valeur de u--; est différent de 0, il sera interprété comme true (c'est à dire, implicitement coulé à la valeur booléenne true). Si, au contraire, sa valeur est à 0, il sera coulé à l' false.

C'est très mauvais code.

Mise à jour: j'ai abordé l'écriture de boucles "for" dans ce blog. Ses recommandations peuvent être résumées dans les paragraphes suivants:

Une boucle est une pratique, lisible (une fois que vous vous habituez à elle) et laconique de construire, mais vous avez besoin de l'utiliser. En raison de sa rare la syntaxe, de l'utiliser dans un trop imaginative, n'est pas une bonne idée.

Toutes les parties de la boucle doit être court et facile à lire. Les noms de variables doivent être choisis de manière à le rendre facile à comprendre.

Cet exemple est clairement en contradiction avec ces bons conseils.

23voto

Narendra Points 1688

Il s’agit du form c# de votre boucle.

Il vous suffit de remplacer équivalent pour size() et back().

Ce qu’il fait recense les revers et les stocke dans un tableau. Mais en C# nous avons directement le fonctionnement du système défini pour cela. Si vous n’avez pas besoin d’écrire cette boucle également.

14voto

Bo Persson Points 42821

La condition est le résultat de , qui est la valeur de avant d’être décrémentée.

En C / C++, une *est* convertible en bool faisant implicitement un comparaison (0 est , tout le reste est ).

est le dernier élément dans un conteneur, qui est , quand `` .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X