簡體   English   中英

我想確認我對變量范圍的理解在C ++中是正確的

[英]I want to confirm that my understanding of variables scope is correct in C++

我已經閱讀了關於范圍的內容,並且認為我到目前為止已經理解了它。 我遇到了另一個程序的問題,在嘗試修復它時,我發現循環范圍內的變量表現得非常不符合我的預期。 所以我制作了這個節目來表明我的意思:

#include <iostream>

using namespace std;

int main()
{
    int num = 6;
    for (int i = 0; i < 5; i++)
    {
        cout << num;
        int num = 5;
        cout << num;
    }
}

我期望首次運行for循環,第一個cout << num將是未定義的,因為它是一個新的范圍,而num尚未定義。 但相反,它只使用了前一個范圍的num值。 然后當num在循環內部被初始化為5時,之后,num的所有輸出應該是5.但是輸出是656565 ......

因此,使用這些信息,我建立了一個模型,我認為變量的范圍就像它一樣,它看起來像這樣:

范圍圖

所以在圖像中你可以看到我認為范圍是如何工作的,我認為對於循環中的每次迭代,循環獲得一個新的變量范圍,然后在循環結束時刪除它的范圍並獲取一個新的范圍。下一次迭代的開始,解釋為什么for循環使用前一個范圍中的num,直到num在當前范圍內重新初始化。 我的理解是否正確?

我的理解是否正確?

是,但num 不會 重新初始化 它定義了另一個變量。
“inner” num 遮蔽 “外部” num

由於兩個num都有塊范圍 ,因為basic.scope.block

塊中聲明的名稱是該塊的本地名稱; 它有塊范圍 它的潛在范圍從其聲明點 開始 ,並在其塊 結束結束 在塊作用域中聲明的變量是局部變量。

int main() {
   int num = 6; // block scope (a) ---- point of declaration for (a) begins
   for (int i = 0; i < 5; i++)
   {
      cout << num; // uses (a)
      int num = 5; // block scope (b) ---- point of declaration for (b) begins
      cout << num; // uses (b)         ||
   }               //                 ---- (b) goes out of scope here
} // ---- (a) goes out of scope here

如果范圍1是最外部范圍並且范圍4是最內部范圍,則圖表是正確的。 使用“覆蓋”一詞不是C ++的慣例。 變量不會被覆蓋,而是被遮蔽 類似的陰影是許多編程語言的一部分。

我期望首次運行for循環,第一個cout << num將是未定義的,因為它是一個新的范圍,而num尚未定義。 但相反,它只使用了前一個范圍的num值。 然后當num在循環內部被初始化為5時,之后,num的所有輸出應該是5.但是輸出是656565 ......

您在此處的理解不正確,您看到的輸出是正確的。

在循環中,第一個cout << num將打印在循環之前定義的變量num 第二個將打印循環內定義的變量。

循環中的int num = 5不會影響先前定義的變量(在外部作用域中)。 它定義了一個全新的變量,並將其初始化為5 對循環之前定義的num的值沒有任何影響。 因此,外部定義的num將保持值6 ,而內部定義的num (在每次循環迭代中創建)將具有值5 盡管您的代碼為它們指定了相同的名稱( num ),但它們是完全不同的變量,並且在內存中占用不同的地址 - 因此更改一個不會改變另一個。

實際上你的代碼

 int num = 6; for (int i = 0; i < 5; i++) { cout << num; int num = 5; cout << num; } 

在概念上等同於

int num = 6;
for (int i = 0; i < 5; i++)
{
    cout << num;
    {                   //  note another scope introduced here
        int num = 5;
        cout << num;
    }
}

這種概念等價來自標准中的要求,如果在塊中創建自動存儲持續時間的多個變量,則它們不再以其構造順序的相反順序存在。 (即,如果跟蹤類對象的構造函數和析構函數的調用,則最先構造的自動存儲持續時間對象將首​​先被破壞)。

除非cout語句位於當前作用域或包含作用域中,否則cout語句不能訪問num的值。 因此,以這種方式查看意味着第一個cout << num僅具有外部num (初始化為6 )而不是內部num可見性。 而第二個cout << num訪問內部范圍中定義的變量。

暫無
暫無

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

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