Se você está acostumado a C / C ++, esse código não é tão difícil de ler, embora seja bastante conciso e não muito bom. Então, deixe-me explicar as partes que são mais Cism do que qualquer outra coisa. Primeiro, a sintaxe geral de um loop C for assim:
for (<initialization> ; <condition>; <increment>)
{
<code...>
}
O código de inicialização é executado uma vez. Em seguida, a condição é testada antes de cada loop e, por fim, o incremento é chamado após cada loop. Então, no seu exemplo, você encontrará a condiçãou--
Por que u--
funciona como uma condição em C e não em C #? Porque C converte implicitamente muitas coisas em bools e isso pode causar problemas. Para um número, qualquer coisa que não seja zero é verdadeira e zero é falso. Portanto, ele fará a contagem regressiva de b.size () - 1 a 0. Ter o efeito colateral na condição é um pouco chato e seria preferível colocá-lo na parte de incremento do loop for, embora muito C código faz isso. Se eu estivesse escrevendo, faria mais assim:
for (u = b.size() - 1, v = b.back(); u>=0; --u)
{
b[u] = v;
v = p[v]
}
A razão para isso é, pelo menos para mim, é mais claro. Cada parte do loop for faz seu trabalho e nada mais. No código original, a condição estava modificando a variável. A parte do incremento estava fazendo algo que deveria estar no bloco de código etc.
O operador de vírgula também pode estar jogando você para um loop. Em C, algo parecido x=1,y=2
com uma declaração no que diz respeito ao compilador e se encaixa no código de inicialização. Apenas avalia cada uma das partes e retorna o valor da última. Então, por exemplo:
std::cout << "(1,2)=" << (1,2) << std::endl;
imprimiria 2.
u--
. Os pontos-e-vírgulas são usados para delimitar as várias partes dafor
declaração.