2017-01-07 91 views
1

我總是覺得在任何類型的循環語句中聲明的變量都被限制在該語句中。在類似的問題上稍微捅一下似乎也證實了這個想法。因此,我通過以下摘錄從C++的Stroustrup的甲遊不解(§4.2.3初始化容器第38頁):循環中變量的作用域

「的push_back()爲元素的任意數目的輸入有用,例如:

Vector read(istream& is) { 
    Vector v; 
    for (double d; is>>d;) // read floating-point values into d 
     v.push_back(d); // add d to v 
    return v; 
} 

輸入環路由一個結束文件或格式化錯誤終止。在此之前,每個數字 讀取被添加到Vector,使得在結束時,v的大小是元件的數量閱讀。我使用了for -statement而不是更傳統的while - 聲明將d的範圍限制爲循環。

這似乎意味着,在一個while語句的條件聲明的變量堅持聲明體外。

+0

在'for'循環語句中聲明的變量處於整個循環體的範圍內。這就是說,「*我使用'for'語句而不是傳統的'while'語句來保持'd'的作用域限於循環*」 - 如果使用'std :: copy()'使用'std :: istream_iterator'和'std :: back_inserter',可以完全消除循環,例如:'std :: copy(std :: istream_iterator (is),std :: istream_iterator (),std :: back_inserter(v));' –

回答

4

讓我們來看看這個循環:

for (double d; is>>d;) // read floating-point values into d 
    v.push_back(d); // add d to v 

在這裏,我們有:

  • d
  • 聲明
  • 一個循環條件
  • 一個空的「做在每次迭代」表達

並且,是,在d範圍僅限於for循環。

現在嘗試編寫一個while循環來完成相同的工作,並保持d範圍的限制。你將無法做到這一點,因爲在while的序言中沒有地方放置聲明。只有for具有該功能。 A while只有一個條件。

這並不意味着對於while的範圍規則是不同的;這隻意味着不可能使用while來編寫此代碼。有不是任何「在while聲明的條件下聲明的變量」。

+0

這裏是一個[C++ 17論文](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0305r1.html),它建議增加可選的初始化爲'if'和'switch'語句,理由是'while'語句具有for語句形式的選項。 –

+0

@Revolver_Ocelot:我看到了;不能真正決定我是否喜歡tbh。不過,就其格式,措辭,解釋和圖表而言,這是我最喜歡的提案文件! –

+0

我多笨!有一點想法可以立即清楚地說明,在「while」條件下聲明變量是不可能的!因爲如果它被初始化爲零或假,語句體將不會運行,並且如果初始化爲任何其他值,它將在每次迭代中重新建立並導致無限循環。 [cppreference](http://en.cppreference.com/w/cpp/language/while「cppreference while」)明確解釋了這樣一個構造,卻沒有注意到它完全沒有意義。 –

4

[..]在while語句的條件聲明的變量[..]

這是不可能的。

使用for語句允許申報這樣

變量
for(int a = 0; a < 5; a++) { 
    // Use a 
} 
// a is not visible anymore 

如果使用while循環,它是可見

int a = 0; 
while(a < 5) { 
    // Use a 
    a++; 
} 
// a still visible