ch2-Array precedence
Chapter_2 Exercise_2-10 Arguments_precedence | ch2-Exercises Chapter_3 |
arrp.c K&R, p. 53 download
#include <stdio.h> // for printf(), putchar()
// array precedence
int main()
{
int i, a[10];
for (i = 0; i < 10; i++)
{a[i] = -10;} // initialize a[]
i = -1;
while (i < 9)
{
a[i] = ++i;
}
printf("a[i] = ++i, i = -1..8\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = -1;
while (i < 9)
{
a[i] = i++;
}
printf("a[i] = i++, i = -1..8\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = -1;
while (i < 9)
{
a[++i] = i;
}
printf("a[++i] = i, i = -1..8\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = 0;
while (i < 10)
{
a[i++] = i;
}
printf("a[i++] = i, i = 0..9\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = -2;
while (i < 8)
{
a[++i] = ++i, a[i+1] = i+1; // test value of i
}
printf("a[++i] = ++i, a[i+1] = i+1, i = -2..6 (step 2)\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = -2;
while (i < 8)
{
a[++i] = i++, a[i+1] = i+1; // test value of i
}
printf("a[++i] = i++, a[i+1] = i+1, i = -2..6 (step 2)\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = -1;
while (i < 9)
{
a[i++] = ++i, a[i] = i+1; // test value of i
}
printf("a[i++] = ++i, a[i] = i+1, i = -1..7 (step 2)\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
putchar('\n');
for (i = 0; i < 10; i++)
{a[i] = -10;} // reset a[]
i = -1;
while (i < 9)
{
a[i++] = i++, a[i] = i+1; // test value of i
}
printf("a[i++] = i++, a[i] = i+1, i = -1..7 (step 2)\n");
for (i = 0; i < 10; i++)
{printf("a[%d] = %d,%c", i, a[i], (i % 5 == 4) ? '\n' : ' ');}
return 0;
}
/*
gcc arrp.c -o arrp
./arrp
a[i] = ++i, i = -1..8
a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4,
a[5] = 5, a[6] = 6, a[7] = 7, a[8] = 8, a[9] = 9,
// ++i is executed before the assignment and before the subscript is chosen
a[i] = i++, i = -1..8
a[0] = -1, a[1] = 0, a[2] = 1, a[3] = 2, a[4] = 3,
a[5] = 4, a[6] = 5, a[7] = 6, a[8] = 7, a[9] = 8,
// i++ is executed after the assignment, but before the subscript is chosen
a[++i] = i, i = -1..8
a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4,
a[5] = 5, a[6] = 6, a[7] = 7, a[8] = 8, a[9] = 9,
// ++i is executed before the subscript is chosen and before the assignment
a[i++] = i, i = 0..9
a[0] = 1, a[1] = 2, a[2] = 3, a[3] = 4, a[4] = 5,
a[5] = 6, a[6] = 7, a[7] = 8, a[8] = 9, a[9] = 10,
// i++ is executed after the subscript is chosen, but before the assignment
a[++i] = ++i, a[i+1] = i+1, i = -2..6 (step 2)
a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 3, a[4] = 4,
a[5] = 5, a[6] = 6, a[7] = 7, a[8] = 8, a[9] = 9,
// both ++i before both operations
a[++i] = i++, a[i+1] = i+1, i = -2..6 (step 2)
a[0] = -2, a[1] = 1, a[2] = 0, a[3] = 3, a[4] = 2,
a[5] = 5, a[6] = 4, a[7] = 7, a[8] = 6, a[9] = 9,
// ++i before subscript, before assignment (but after i++), so after assignment,
// i++ before subscript, after assignment
a[i++] = ++i, a[i] = i+1, i = -1..7 (step 2)
a[0] = 1, a[1] = 2, a[2] = 3, a[3] = 4, a[4] = 5,
a[5] = 6, a[6] = 7, a[7] = 8, a[8] = 9, a[9] = 10,
// i++ after subscript, before assignment, ++i before both operations
a[i++] = i++, a[i] = i+1, i = -1..7 (step 2)
a[0] = -1, a[1] = 2, a[2] = 1, a[3] = 4, a[4] = 3,
a[5] = 6, a[6] = 5, a[7] = 8, a[8] = 7, a[9] = 10,
// first i++ after subscript, before assignment (but after i++), so after assignment,
// second i++ before subscript, after assignment
*/
Notes:
Within while() we have to set
all values of a[],
so we have to use proper indices and assignments.
For one incrementation (the first 4 cases),
i varies from
-1 to 8 or from 0 to 9 (10 values),
corresponding to a[0]..a[9].
For two incrementations (the last 4 cases) we need an extra assignment because
i is increased by 2 at each step.
Here i varies from
-2 to 6 (step 2) or from
-1 to 7 (step 2), 5 values in total,
corresponding to a[0],
a[2],
a[4],
a[6],
a[8].
For the other 5 values, we use the extra assignment
a[i+1]
=
i+1 or
a[i]
=
i+1,
depending on the value of i.
After each case, we reset a[]
to values -10 to be sure
the next case sets all the values of a[]
(unset values will display -10).
Chapter_2 Exercise_2-10 Args_prec | BACK_TO_TOP | ch2-Exercises Chapter_3 |
Comments
Post a Comment