Si está acostumbrado a C / C ++, este código no es tan difícil de leer, aunque es bastante conciso y no es tan bueno de código. Permítanme explicar las partes que son más Cism que cualquier otra cosa. Primero, la sintaxis general de un bucle C for se ve así:
for (<initialization> ; <condition>; <increment>)
{
<code...>
}
El código de inicialización se ejecuta una vez. Luego, la condición se prueba antes de cada ciclo y, finalmente, se llama al incremento después de cada ciclo. Entonces, en su ejemplo, encontrará que la condición esu--
¿Por qué u--
funciona como una condición en C y no en C #? Debido a que C convierte implícitamente muchas cosas demasiado, esto puede causar problemas. Para un número, todo lo que no sea cero es verdadero y cero es falso. Por lo tanto, contará desde b.size () - 1 a 0. Tener el efecto secundario en la condición es un poco molesto y sería preferible colocarlo en la parte de incremento del ciclo for, aunque mucha C El código hace esto. Si lo estuviera escribiendo lo haría más así:
for (u = b.size() - 1, v = b.back(); u>=0; --u)
{
b[u] = v;
v = p[v]
}
La razón de esto es, al menos para mí, es más claro. Cada parte del bucle for hace su trabajo y nada más. En el código original, la condición estaba modificando la variable. La parte de incremento estaba haciendo algo que debería estar en el bloque de código, etc.
El operador de coma también puede estar lanzándole un bucle. En C, algo así x=1,y=2
parece una declaración en lo que respecta al compilador y se ajusta al código de inicialización. Simplemente evalúa cada una de las partes y devuelve el valor de la última. Así por ejemplo:
std::cout << "(1,2)=" << (1,2) << std::endl;
imprimiría 2.
u--
. Los punto y coma se utilizan para delimitar las diversas partes de lafor
declaración.