2015-07-20 28 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; 
} 

這是條件,在開始的時候被檢查,因此你的循環結束,然後再開始它的第一個迭代。