簡體   English   中英

For循環條件是一個沒有比較的變量

[英]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個內存位置,因此當我們在這些位置之外的位置檢索數據時,它們的范圍可以是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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM