2017-01-07 53 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