使用数组的示例程序在这里,我们需要找到代码的最终输出,但我不能得到与编译器得到的相同的输出。我得到错误的输出数字[3]和数字[6]。
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
int numbers[10];
int i, index = 2;
for (i = 0; i < 10; i++)
numbers[i] = i * 10;
numbers[8] = 25;
numbers[5] = numbers[9] / 3;
numbers[4] += numbers[2] / numbers[1];
numbers[index] = 5;
++numbers[index];
numbers[numbers[index++]] = 100;
numbers[index] = numbers[numbers[index + 1] / 7]--;
for (index = 0; index < 10; index++)
printf("numbers[ %d ] = %dn", index, numbers[index]);
return 0;
}
- 最简单的方法是在调试器中显示
index
和numbers
的值,然后执行每一行,直到您感到惊讶。如果你的调试器支持它,你也可以反向运行你的程序。 - 你可以用一个函数来修改你的程序,打印出
index
和numbers
,然后在每次有重大变化后运行这个函数。 - 如果你想手动操作,你可以用手反过来推理程序。从程序的输出中:
numbers[ 3 ] = 100
numbers[ 6 ] = 99
让我们从最后一个赋值开始:
numbers[ index ] = numbers[ numbers[ index + 1 ] / 7 ]-- =>
numbers[3] = numbers[numbers[4] / 7]-- =>
= numbers[(40 + 20 / 10) / 7 ]-- =>
= numbers[6]--
作为index = 3
,从2
与int i, index = 2
集合的初始值在numbers[ numbers[ index++ ] ] = 100;
上的后增量。numbers[ 4 ] += numbers[ 2 ] / numbers[ 1 ];
,它只使用在循环中设置的初始值numbers[ i ] = i * 10
.
从输出中我们知道,numbers[3]
将赋值100
和numbers[6]
减为99
。我们唯一赋值100的地方是前一行numbers[ numbers[ index++ ] ] = 100
,所以我们只需要让自己确信左边是numbers[6]
:
numbers[ numbers[ index++ ] ] =>
numbers[numbers[2]] =>
numbers[6]
作为上面讨论的初始赋值的index = 2
,numbers[2] = 6
来自++numbers[ index ]
,来自5
与numbers[ index ] = 5;
集合的上一个值。
这个故事的寓意是更喜欢单一的任务:-)
所有的奇迹都发生在最后两行:
numbers[numbers[index++]] = 100;
numbers[index] = numbers[numbers[index + 1] / 7]--;
我建议您使用调试器并将numbers[3]
和numbers[6]
添加到watcher
。然后在numbers[numbers[index++]] = 100;
行设置一个断点。
数量[6]
index
是2,所以numbers[index++]
会给6
由于这两行
numbers[index] = 5; // numbers[2] = 5
++numbers[index]; // numbers[2] = 5 + 1 = 6
- 现在,
numbers[numbers[index++]] = 100;
将变成numbers[6] = 100;
- 现在,
index++
将执行,使其成为3
因此,
numbers[6]
现在是100
数字[3]
- 现在解码这一行:
numbers[index] = numbers[numbers[index + 1] / 7]--;
index
现在是3
,所以numbers[index + 1]
等于numbers[4]
,等于42,除以7等于6
现在,- 当
numbers[3]
变为100后,numbers[6]
将由于后减运算符--
而减少1 - 因此
numbers[3] = 100
和numbers[6] = 99
numbers[3] = numbers[6] = 100