Если вы привыкли к C / C ++, этот код не так сложен для чтения, хотя он довольно лаконичен и не так хорош для кода. Итак, позвольте мне объяснить части, которые больше Cism, чем что-либо еще. Прежде всего, общий синтаксис цикла C for выглядит следующим образом:
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 выполняет свою работу и ничего больше. В исходном коде условие модифицировало переменную. Часть приращения делала то, что должно быть в блоке кода и т. Д.
Оператор запятой также может привести вас к циклу. В C что-то похожее x=1,y=2
выглядит как одно утверждение в отношении компилятора и вписывается в код инициализации. Он просто оценивает каждую из частей и возвращает значение последней. Так, например:
std::cout << "(1,2)=" << (1,2) << std::endl;
распечатал бы 2.
u--
. Точки с запятой используются для разграничения различных частейfor
утверждения.