簡體   English   中英

“while”和“for”循環的范圍是什么?

[英]What is the scope of a 'while' and 'for' loop?

whilefor循環的范圍是什么?

例如,如果我在循環中聲明了一個對象,它的行為是什么,為什么?

在以下示例中,除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

ab僅在 for 循環范圍內可見。 范圍包括循環(){}

我認為值得一提的是:

一些編譯器可能有一個選項來影響在 for 循環初始值設定項中創建的變量的范圍。 例如,Microsoft Visual Studio 有一個選項/Zc:forScopeFor 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

在上面的示例代碼中, if都在{ { 和} } 范圍內,當執行右大括號時,兩個變量都超出了范圍。

原因很簡單,標准是這么說的; 這就是 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.

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