[英]What is the scope of a 'while' and 'for' loop?
while
和for
循環的范圍是什么?
例如,如果我在循環中聲明了一個對象,它的行為是什么,為什么?
在以下示例中,除i
之外的循環的每次迭代都會銷毀並重新創建所有變量,它在循環迭代之間持續存在並且可用於 for 循環中的條件表達式和最終表達式。 在循環之外沒有任何變量可用。 for 循環體內部變量的銷毀發生在i
遞增之前。
while(int a = foo()) {
int b = a+1;
}
for(int i=0;
i<10; // conditional expression has access to i
++i) // final expression has access to i
{
int j = 2*i;
}
至於為什么; 循環實際上采用單個語句作為其主體,只是碰巧有一個稱為復合語句的語句,由花括號創建。 在任何復合語句中創建的變量范圍僅限於復合語句本身。 所以這真的不是循環的特殊規則。
對於作為循環或選擇語句本身的一部分創建的變量,循環和選擇語句確實有自己的規則。 這些只是根據設計師認為最有用的東西設計的。
循環中聲明的任何內容都限定在該循環內,不能在花括號外訪問。 事實上,您甚至不需要循環來創建新的作用域。 您可以執行以下操作:
{
int x = 1;
}
//x cannot be accessed here.
int d;
// can use d before the loop
for(int a = 0; a < 5; ++a) // can use a or d in the ()
{
int b;
// can use d, a, b in the {}
}
int c;
// can use d, c after the loop
a
和b
僅在 for 循環范圍內可見。 范圍包括循環()
和{}
我認為值得一提的是:
一些編譯器可能有一個選項來影響在 for 循環初始值設定項中創建的變量的范圍。 例如,Microsoft Visual Studio 有一個選項/Zc:forScope ( For Loop Scope 中的強制一致性)。 它默認為標准 C++ 行為。 但是,這可以更改,以便 for 循環變量在 for 循環范圍之外保持活動狀態。 如果您正在使用 VS,了解此選項的存在可能會很有用,這樣您就可以確保將其設置為所需的行為。 不確定是否有任何其他編譯器具有此選項。
由於優化設置和“死存儲”消除,一些編譯器可能會消除它認為不必要的代碼。 例如,如果在循環內更改的變量沒有在循環外的任何地方讀取,則編譯器可能會丟棄循環本身。
例如,考慮以下循環:
int cnt = 0;
int trys = MAX_INT;
while (trys-- > 0)
{
cnt += trys;
}
有些編譯器可能會丟棄循環的[內容],因為在循環之后沒有使用變量 Cnt。
只是想添加在 for 或 while 循環中聲明的變量也在循環內。 例如:
for (int index = 0; index < SOME_MAX; ++index)
{
...
}
// index is out of scope here.
int a;
for(int b=0; b<10; ++b) {
int c;
}
范圍就好像它是:
int a;
{
int b=0;
begin:
if (b<= 10)
{
{
int c;
}
++b;
goto begin;
}
}
目的是使變量在明確定義的序列點超出范圍。
for( int i = 0; i < 10; ++i )
{
string f = "foo";
cout << f << "\n";
}
// i and f are both "gone" now
在上面的示例代碼中, i
和f
都在{
{ 和}
} 范圍內,當執行右大括號時,兩個變量都超出了范圍。
原因很簡單,標准是這么說的; 這就是 C++ 語言的工作原理。
至於動力,請考慮這可以用於您的優勢:
for( ...)
{
std::auto_ptr<SomeExpensiveObject> obj(new SomeExpensiveObject);
}
在上面的代碼中,我們使用 RAII 智能指針來“擁有”我們在循環中創建的昂貴對象。 for
循環的范圍語義規定,在每次執行循環后,在該迭代期間創建的對象將被銷毀。
在 C/C++ 中,在 for 或 while 循環(或任何其他帶括號的塊,就此而言)中聲明的變量的范圍是從左括號到右括號。
while (some_condition == true)
{
int myVar = 3;
}
cout << myVar << endl; // This will cause a compilation error
看看這個代碼
#include < stdio.h >
int i = 10;
int main() {
for(int i=0; i<3; i++) {
fprintf(stdout," for i = %d & upper i = %d\n",i,::i);
}
while (i>3) {
int i = 30;
fprintf(stdout," while i = %d & upper i = %d\n",i,::i);
i++;
fprintf(stdout," while i = %d & upper i = %d\n",i,::i);
}
fprintf(stdout,"i = %d \n",i);
}
在上面的代碼中,全局變量i與控制 for 循環的變量不同。
它會打印
for i = 0 & upper i = 10
for i = 1 & upper i = 10
for i = 2 & upper i = 10
執行 while 循環時 -我在 while 中定義的變量具有局部作用域,其中(i > 3)下的變量跟隨全局變量,並且不引用局部作用域。
地盤。
變量在循環的范圍內。 即您需要在循環內才能訪問它。 就像你在函數中聲明了一個變量一樣,只有函數中的東西才能訪問它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.