2013-10-09 45 views
0
int a[5] = {1,2,3,4,5}; 

for (int i = 0; a[i]; i++) 
{ 
    cout << i; 

} 

該代碼產生「0 1 2 3 4」的輸出。 它與[i]相比是什麼,它如何知道在數組的末尾停下來,而不是結束?For循環條件是一個沒有比較的變量

+1

這個代碼將無法正常工作。除非你把'a [5]'改成'a [6]' –

+0

它不會。這是未定義的行爲。 –

+1

輕浮的答案是「純粹運氣」。更深思熟慮的答案可以在下面找到。 – Floris

回答

3

您的代碼會導致未定義的行爲。表達式a[i]將評估爲true,如果非零,則爲false,如果爲零。當你運行它時,你很幸運有一個0字緊跟着你的數組在內存中,所以循環停止。

0

它正在讀取數組,通過純粹的運氣,這裏的內存恰好爲零。讀取該數組的末尾是未定義的行爲,結果可能隨時發生變化,因此請不要依賴它。

0

你能想到的a[i]爲被比較0,它只是獲取從內存中的位置檢索編號,並在0是住在那段記憶,然後退出循環的價值,如果它是任何其他數循環繼續。

假設int在系統上是4個字節。給我們一個地址a,讓我們假設它是0xFF00,當我們試圖評估a[0]我們檢索存儲在內存0xFF00的數據值。 a[1]將從內存中檢索數據0xFF04等。您的程序僅將值分配給前5個內存位置,因此當我們檢索超出這些位置的數據時,它們可能是0INT_MAX之間的任何值。如果碰巧是0那麼循環會退出,但是如果碰巧是其他東西,循環會繼續。

你可以調整你的程序,像這樣能夠更好地看到:

#include <iostream> 
using namespace std; 
int main() { 
    int a[5] = {1,2,3,4,5}; 
    int i; 
    for (i = 0; a[i]; i++) 
    { 
     cout << "At memory address: " << &a[i] 
      << " lives the value: " << a[i] << endl; 
    } 
    cout << "At memory address: " << &a[i] 
     << " lives the value: " << a[i] 
     << ", and this is why the loop ended." << endl; 
    return 0; 
} 
+0

但'a [i]'與0比較! –

+0

@MattiVirkkunen我想你也可以這樣說,但我認爲通常會發生的是'TEST'指令用於比較寄存器和它自己。 http://stackoverflow.com/questions/6002079/x86-assembler-use-of-test-instruction – Leonardo

+1

正在執行的操作仍然是一個比較,無論它如何實現。 TEST指令確實涉及將內部的值與零值進行比較,如果它不爲零,該如何知道。 –