C for循环,测试数组元素给出了奇怪的结果

时间:2015-07-20 02:06:34

标签: c for-loop

我无法弄清楚我做错了什么。我想打印非零元素,下面的代码打印无。

#include <stdio.h>

int main ()
{
    int arr[4] = { 0, 3, 0, 7 };
    // print non zero elements
    for (int i = 0; i != 4 && arr[i] != 0; ++i)
        printf("%d\t%d\n", i, arr[i]);
}

但是,如果我像下面那样移动阵列测试,它可以工作:

#include <stdio.h>

int main ()
{
    int arr[4] = { 0, 3, 0, 7 };
    // print non zero elements
    for (int i = 0; i != 4; ++i) {
        if (arr[i] != 0)
           printf("%d\t%d\n", i, arr[i]);
    }
}

怎么了?

3 个答案:

答案 0 :(得分:6)

第一个循环与第二个循环不同的原因是第一个循环在i到达数组中第一个零的位置时退出,而第二个循环总是一直向上第四个要素。

你的第一个循环等同于:

for (int i = 0; i != 4; ++i) {
    if (arr[i] != 0)
       printf("%d\t%d\n", i, arr[i]);
    else
        break;
}

突然看到零是第一个循环提前终止的原因。

答案 1 :(得分:2)

for (int i = 0; i != 4 && arr[i] != 0; ++i)

如果arr[i] == 0,循环立即终止。 Ans作为已经的第一个元素 0,它甚至不会运行一次。

答案 2 :(得分:2)

原因是你的第一个for循环等同于:

int i=0;
while(i!=4&&arr[i]!=0)
{
  printf("%d\t%d\n", i, arr[i]);
  ++i;
}

这是在开始时检查的条件,因此你的循环在它开始第一次迭代之前终止。