Given
int x[10];
int y[10];
int n = 10;
Version 1
int i = 0;
while (i < n)
y[i] = x[i++];
Version 2
for (int i = 0; i < n; i++)
y[i] = x[i]
Are the two versions always equivalent? If not, when are they not equivalent?
Given
int x[10];
int y[10];
int n = 10;
Version 1
int i = 0;
while (i < n)
y[i] = x[i++];
Version 2
for (int i = 0; i < n; i++)
y[i] = x[i]
Are the two versions always equivalent? If not, when are they not equivalent?
This line:
y[i] = x[i++];
is undefined behaviour. You cannot use i and i++ within the same statement.
Your Version 2, with the i++ inside the for control statement, is fine.
If we code around the undefined behaviour correctly diagnosed by Greg Hewgill in his answer, then we might end up with code like this:
int x[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int y[10];
int n = 10;
i = 0;
while (i < n)
{
if (i % 3 == 0)
continue;
y[i] = x[i];
i++;
//cont: ;
}
for (i = 0; i < n; i++)
{
if (i % 3 == 0)
continue;
y[i] = x[i];
}
These loops are not equivalent because of the continue statements — and, indeed, the first is an infinite loop. And the loop bodies could be written without the continue, but I wanted something simple to illustrate the behaviour of continue in a while loop and a for loop.
The for loop behaves sanely, not initializing elements y[0], y[3], y[6] or y[9], but otherwise working perfectly well.
The while loop looks similar, but the continue; statement is equivalent to goto cont; where cont is the label that is commented out, immediately before the closing brace. Note that it skips the increment of i, which is why the loop is 'infinite'.
So, the two loops are equivalent if there is no continue inside.
Note that the related loop:
for (int i = 0; i < n; i++)
{
if (i % 3 == 0)
continue;
y[i] = x[i];
}
is not quite identical to the first for loop. The variable i is available outside (after) the loop in the while loop and the first for loop; it is not available when the variable is declared in the for loop itself.
Good question,
take a look here
you can find a nice c to assembler web compiler
I compared the two versions and there are minor assembly differences in the loop implementation.
the functionality seems exactly the same therefor I conclude both samples are always equivalent.
While case:
For case:
