[英]For loop condition is a variable without comparison
int a[5] = {1,2,3,4,5};
for (int i = 0; a[i]; i++)
{
cout << i;
}
該代碼產生輸出“ 0 1 2 3 4”。 它與a [i]進行比較,它如何知道停在數組的末尾而不越過?
您的代碼導致未定義的行為。 如果非零,則表達式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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.