En lecture accélérés C++ j'ai été confondu par l'explication donnée pour laquelle l'invariant devient fausse (voir code ci-dessous):Pourquoi cet invariant devient-il faux?
L'invariant est défini par l'auteur (dans ce cas) comme:
Le invariant pour notre temps est que nous avons écrit r lignes de sortie jusqu'à présent. Quand nous définissons r, nous lui donnons une valeur initiale de 0. A ce stade, nous n'avons rien écrit du tout. Mettre r à 0 rend évidemment l'invariant vrai, donc nous avons rencontré la première exigence.
// invariant: we have written r rows so far
int r = 0;
// setting r to 0 makes the invariant true
while (r != rows) {
// we can assume that the invariant is true here
// writing a row of output makes the invariant false <- WHY?
std::cout << std::endl;
// incrementing r makes the invariant true again
++r;
}
// we can conclude that the invariant is true here
Alors explique plus tard ...
Rédaction d'une ligne de sortie provoque l'invariant de devenir faux, parce que r n'est plus le nombre de lignes que nous avons écrit
Étant donné la définition, je ne peux pas établir une connexion entre les deux.
Pourquoi l'invariant devient-il faux lorsqu'une ligne de sortie écrit?
Il se peut que quelque chose me manque, mais 'endl' met une nouvelle ligne, donc vous avez écrit 1 ligne de sortie et vous êtes passé à la seconde. L'incrémentation de 'r' porte le nombre de 0 à 1. Jusqu'à ce que vous incrétiez' r' après l'impression, il contient des données que vous avez écrites 0 lignes, mais en réalité vous avez écrit 1. – chris