[英]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.