Exercise 2-6
What does the following code do?
int i = 0; while (i < 3) { i += 1; std::cout << i <<std::endl; }
Solution
This is very a classic usage of while loop with the following properties:
Invariant i, with the initial integer value of zero.
int i = 0;
And asymmetric range [0,3). i.e. invariant i is incremented at a specified interval (in this case 1) from the initial value of 0 to the ending value of 3 (but excluding 3). Note the mixed use of square and round brackets (in the sense of writing in the post rather than the actual code.). We use square brackets [ ] to imply inclusiveness, and round bracket ( ) to imply exclusiveness.
while (i < 3) // asymmetric range of [0,3) { i += 1; // invariant increment interval is 1 std::cout << i <<std::endl; // display the invariant to the standard output console }
I denote this while loop as i [0,3)
Using logic, I’d expect the code to do this:
Invariant i (at top of loop) | while ( i < 3) | i += 1 | Console Output |
0 | true | 1 | 1 |
1 | true | 2 | 2 |
2 | true | 3 | 3 |
3 | false |
To confirm this let’s run the following code and output result.
#include <iostream> int main() { int i = 0; while (i < 3) { i += 1; std::cout << i <<std::endl; //i += 1; } return 0; }
Result
1 2 3
The nice thing about using asymmetric range [0,N) is the ease of understanding. i.e. The invariant is true for N number of loops.
Extras
Say now if we modify the code so that the invariant increment happens at the bottom. i.e.
int i = 0; while (i < 3) { std::cout << i <<std::endl; i += 1; }
Our result should now look like this:
Invariant i (at top of loop) | while ( i < 3) | Console Output | i +=1 |
0 | true | 0 | 1 |
1 | true | 1 | 2 |
2 | true | 2 | 3 |
3 | false |
We run the modified code and it confirms our expectation:
0 1 2