为什么j在循环中初始化为0而不是其递增值?

时间:2015-02-13 15:21:15

标签: c

考虑以下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应该是一些垃圾值,但事实并非如此?为什么呢?

2 个答案:

答案 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