考虑以下c代码:
int main()
{
int a[5] = {5, 2, 1, 6, 3}, b[5] = {1, 6, 3, 2, 5}, c[10], i = 0, j = 0, k = 0;
for (i = 0 ; i < 5 ; i++)
{
while (a[i] != b[j])
j++;
c[k] = a[i];
c[k+1] = b[j];
k = k + 2;
}
for (i = 0 ; i < 10 ; i += 2)
printf("%d->%d\n", c[i], c[i + 1]);
getch();
}
程序打印两个相同的数字,每个数字从[5]和b [5]
中选择问:j只被初始化一次,并且在循环中j的值增加,因此它可能会增加到超过5,因为在循环内不再发生j的初始化,因此o / p应该是一些垃圾值,但事实并非如此?为什么呢?
答案 0 :(得分:2)
j
循环时, for
包含0。退出while
循环时变为4,因为条件a[i] != b[j]
才会为假。
然后,在第一个for
循环的下一次迭代中,j
递增,您尝试读取数组(b[5]
,b[6]
等)并且这调用Undefined Behavior,这意味着任何事情都可能发生。
它完美运作的原因是纯粹的运气。但你不能依赖这个。
答案 1 :(得分:1)
如果您打印值匹配的数组元素的地址,您可以看到@ Marian注释的真实性,j
索引相同的数组在第一场比赛之后,i
确实如此。
#include <stdio.h>
int main()
{
int a[5] = {5, 2, 1, 6, 3}, b[5] = {1, 6, 3, 2, 5}, c[10], i = 0, j = 0, k = 0;
for (i = 0 ; i < 5 ; i++)
{
while (a[i] != b[j])
j++;
printf ("%p %p\n", (void*)&a[i], (void*)&b[j]); // added a cue
c[k] = a[i];
c[k+1] = b[j];
k = k + 2;
}
for (i = 0 ; i < 10 ; i += 2)
printf("%d->%d\n", c[i], c[i + 1]);
getch();
}
节目输出
0018FF2C 0018FF24
0018FF30 0018FF30
0018FF34 0018FF34
0018FF38 0018FF38
0018FF3C 0018FF3C
5->5
2->2
1->1
6->6
3->3