为什么while while的条件超出了范围

时间:2012-11-08 20:27:23

标签: c++ scope do-while

我们经常需要像这样的循环

do
{
     Type value(GetCurrentValue());
     Process(value);
}while(condition(value));

不幸的是,这不会编译,因为value的范围在}结束。这意味着我必须在循环之外声明它。

Type value;
do
{
    value = GetCurrentValue(); 
    Process(value);
}while(condition(value));

至少有两个原因,我不喜欢这个。首先,我喜欢在当地宣布事物。第二,如果值不可分配或默认可构造,但只有可复制构造,则会出现问题。

所以,我的问题有两个方面。首先,我想知道将do while的范围扩展到最终条件是否有特定的原因/困难(正如for循环中声明的变量的范围包括for循环的主体,尽管它实际上是在牙箍之外)。如果你相信我的第一个问题的答案是“这就是它的方式。不要问为什么问题。”那么我想知道是否有成语可以帮助编写类似于我的例子中的do-while循环,但没有我提到的缺点。

希望问题清楚。

1 个答案:

答案 0 :(得分:13)

如果您希望将value保留为while循环的本地作用域,则可以改为:

do
{
     Type value(GetCurrentValue());
     Process(value);
     if (! condition(value) )
         break;
} while(true);

这只是个人偏好,但我发现while循环结构如下,更易读(while而不是do-while):

while(true) {
    Type value(GetCurrentValue());
    Process(value);
    if (! condition(value) ) {
        break;
    }
}

C / C ++中的作用域规则的工作原理如下:在大括号{...}块中声明的局部变量仅对该块是本地/可见的。例如:

int a = 1;
int b = 2; 
{
    int c = 3;
}
std::cout << a;
std::cout << b;
std::cout << c;

会抱怨c未申报。

至于理由 - 这只是一致性问题而“只是语言的定义”