int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
該代碼產生「0 1 2 3 4」的輸出。 它與[i]相比是什麼,它如何知道在數組的末尾停下來,而不是結束?For循環條件是一個沒有比較的變量
int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
該代碼產生「0 1 2 3 4」的輸出。 它與[i]相比是什麼,它如何知道在數組的末尾停下來,而不是結束?For循環條件是一個沒有比較的變量
您的代碼會導致未定義的行爲。表達式a[i]
將評估爲true,如果非零,則爲false,如果爲零。當你運行它時,你很幸運有一個0
字緊跟着你的數組在內存中,所以循環停止。
它正在讀取數組,通過純粹的運氣,這裏的內存恰好爲零。讀取該數組的末尾是未定義的行爲,結果可能隨時發生變化,因此請不要依賴它。
你能想到的a[i]
爲被比較0
,它只是獲取從內存中的位置檢索編號,並在0
是住在那段記憶,然後退出循環的價值,如果它是任何其他數循環繼續。
假設int
在系統上是4個字節。給我們一個地址a
,讓我們假設它是0xFF00
,當我們試圖評估a[0]
我們檢索存儲在內存0xFF00
的數據值。 a[1]
將從內存中檢索數據0xFF04
等。您的程序僅將值分配給前5個內存位置,因此當我們檢索超出這些位置的數據時,它們可能是0
到INT_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;
}
但'a [i]'與0比較! –
@MattiVirkkunen我想你也可以這樣說,但我認爲通常會發生的是'TEST'指令用於比較寄存器和它自己。 http://stackoverflow.com/questions/6002079/x86-assembler-use-of-test-instruction – Leonardo
正在執行的操作仍然是一個比較,無論它如何實現。 TEST指令確實涉及將內部的值與零值進行比較,如果它不爲零,該如何知道。 –
這個代碼將無法正常工作。除非你把'a [5]'改成'a [6]' –
它不會。這是未定義的行爲。 –
輕浮的答案是「純粹運氣」。更深思熟慮的答案可以在下面找到。 – Floris