Якщо ви звикли до C / C ++, цей код не так важко читати, хоча він досить короткий і не дуже великий. Тож дозвольте мені пояснити частини, які є більшою за Cism ніж будь-що інше. Спочатку загальний синтаксис C для циклу виглядає так:
for (<initialization> ; <condition>; <increment>)
{
<code...>
}
Код ініціалізації запускається один раз. Потім умова перевіряється перед кожною петлею, і нарешті, приріст стає викликом після кожного циклу. Тож у вашому прикладі ви знайдете умовуu--
Чому u--
робота працює як умова в C, а не C #? Оскільки C неявно перетворює багато речей, які занадто сильно розгортаються, і це може спричинити неприємності. Для числа будь-що, що не є нулем, є істинним, а нуль - хибним. Таким чином, він буде рахувати від b.size () - 1 до 0. Наявність побічного ефекту в умові трохи дратує, і було б краще помістити його в прирістну частину циклу for, хоча багато C код робить це. Якби я писав це, я зробив би це так:
for (u = b.size() - 1, v = b.back(); u>=0; --u)
{
b[u] = v;
v = p[v]
}
Причиною цього є, принаймні, мені зрозуміліше. Кожна частина циклу for for виконує свою роботу і нічого іншого. У вихідному коді умова була зміною змінної. Зростаюча частина робила щось, що повинно бути в блоці коду тощо.
Оператор з комами може також кидати вас за цикл. У C щось на зразок x=1,y=2
виглядає як одне твердження, що стосується компілятора, і вписується в код ініціалізації. Він просто оцінює кожну з частин і повертає значення останньої. Так, наприклад:
std::cout << "(1,2)=" << (1,2) << std::endl;
буде надруковано 2.
u--
. Напівколонки використовуються для розмежування різних частинfor
висловлювання.