2015-07-20 69 views
1

我无法弄清楚我做错了什么。我想打印非零元素,下面的代码不打印任何东西。C for循环,测试数组元素给出奇怪的结果

#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]); 
    } 
} 

有什么不对?

+0

我想你现在明白了。 –

回答

6

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

你的第一个循环是相同的:

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

打破看到零是什么使第一循环提前终止。

+0

为什么它会退出阵列中的第一个零?这不是一个while循环。 – BestCoderEver

+1

@BestCoderEver循环的形式并不重要:'for'循环就像'while循环一样,但在循环头文件中有两个“隔离区” - 用于初始化和提前循环变量。 for循环中的循环条件与while循环的“continuation condition”相同。在你的情况下,这就是'i!= 4 && arr [i]!= 0',所以你的循环将停止在第一个零。 – dasblinkenlight

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

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

2

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

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

这是条件,在开始的时候被检查,因此你的循环结束,然后再开始它的第一个迭代。