Actualmente estoy trabajando mi camino a través de "Accelerated C++" y acabo de encontrar esto en el capítulo 3:invariantes de bucle (Específicamente ch.3 de "C++ acelerada")
// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades
while (cin >> x) {
++count;
sum += x;
}
Los autores siguen este explicando que el invariante necesita atención especial porque cuando la entrada se lee en x
, leeremos count + 1
y por lo tanto la invariante será falsa. Del mismo modo, cuando hayamos incrementado el contador, sum
ya no será la suma de las calificaciones del último recuento (en caso de que no lo haya adivinado, es el programa tradicional para calcular las calificaciones de los estudiantes).
Lo que no entiendo es por qué esto importa. Seguramente para casi cualquier otro ciclo, una afirmación similar sería cierta. Por ejemplo, esta es la primera while
bucle del libro (la salida se rellena después):
// invariant: we have written r rows so far
while (r != rows) {
// write a row of output
std::cout << std::endl;
++r;
}
Una vez que hemos escrito la fila correspondiente de la producción, sin duda el invariante es falso hasta que hayamos incrementado r
, al igual que en el otro ejemplo?
¿Qué hace que estas dos condiciones sean diferentes?
EDIT: Gracias por todas sus respuestas. Creo que lo tengo, pero voy a dejarlo un poco más de tiempo antes de elegir una "Respuesta aceptada" solo para estar seguro. Hasta ahora, todas las respuestas básicamente coinciden, por lo que apenas parece justo, pero vale la pena hacerlo, supongo.
El párrafo original, tal como se solicita a continuación:
"Descripción de la invariante para este circuito requiere un cuidado especial, porque la condición en el tiempo tiene efectos secundarios Estos efectos secundarios afectan a la verdad de la invariante:. Ejecutar con éxito cin >> x hace que la primera parte de la invariante-la parte que dice que hemos leído cuente grados-falso. Por consiguiente, debemos cambiar nuestro análisis para dar cuenta del efecto que la condición misma podría tener en la invariante.
Sabemos que la invariante era cierta antes de evaluar la condición, por lo que sabemos que ya hemos leído las calificaciones. Si cin >> x tiene éxito, entonces ahora hemos leído t + 1 grados. Podemos hacer que esta parte de lo invariante sea verdad nuevamente incrementando el recuento. Sin embargo, al hacerlo, falsifica la segunda parte del invariante, la parte que dice que la suma es la suma de los primeros grados del recuento, porque después de haber incrementado el recuento, la suma es ahora la suma del primer recuento: 1 grado, no el primero contar calificaciones. Afortunadamente, podemos hacer que la segunda parte de lo invariante sea verdadera ejecutando sum + = x; para que todo el invariante sea cierto en viajes posteriores a través del tiempo.
Si la condición es falsa, significa que nuestro intento de entrada falló, por lo que no obtuvimos más datos, por lo que el invariante sigue siendo verdadero. Como resultado, no tenemos que dar cuenta de los efectos secundarios de la condición después de que termine el tiempo. "
Si no es demasiado largo, ¿podría usted copiar la * frase * exacta del autor? Tal vez malinterpretaste algo de sutilidad en la explicación. – nico
Editado, gracias. – Owen
+1 solo por usar este libro para aprender C++. ':)' – sbi