Si vous êtes habitué à C / C ++, ce code n'est pas si difficile à lire, bien qu'il soit assez laconique et pas si génial en code. Alors laissez-moi vous expliquer les parties qui sont plus Cism qu'autre chose. Tout d'abord, la syntaxe générale d'une boucle C for ressemble à ceci:
for (<initialization> ; <condition>; <increment>)
{
<code...>
}
Le code d'initialisation est exécuté une fois. Ensuite, la condition est testée avant chaque boucle et enfin l'incrément est appelé après chaque boucle. Donc, dans votre exemple, vous trouverez que la condition estu--
Pourquoi fonctionne-t-il u--
comme une condition en C et non en C #? Parce que C convertit implicitement beaucoup de choses trop booléennes et cela peut causer des problèmes. Pour un nombre, tout ce qui est différent de zéro est vrai et zéro est faux. Donc, il compte à rebours de b.size () - 1 à 0. Avoir l'effet secondaire dans la condition est un peu ennuyeux et il serait préférable de le mettre dans la partie incrémentielle de la boucle for, bien que beaucoup de C le code fait cela. Si je l'écrivais, je le ferais plus comme ceci:
for (u = b.size() - 1, v = b.back(); u>=0; --u)
{
b[u] = v;
v = p[v]
}
La raison en est, du moins pour moi, c'est plus clair. Chaque partie de la boucle for fait son travail et rien d'autre. Dans le code d'origine, la condition modifiait la variable. La partie incrémentation faisait quelque chose qui devrait être dans le bloc de code, etc.
L'opérateur virgule peut également vous lancer pour une boucle. En C, quelque chose comme x=1,y=2
ressemble à une instruction en ce qui concerne le compilateur et s'inscrit dans le code d'initialisation. Il évalue simplement chacune des parties et renvoie la valeur de la dernière. Donc par exemple:
std::cout << "(1,2)=" << (1,2) << std::endl;
imprimerait 2.
u--
. Les points-virgules sont utilisés pour délimiter les différentes parties de l'for
instruction.