我们经常需要像这样的循环
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循环,但没有我提到的缺点。
希望问题清楚。
答案 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
未申报。
至于理由 - 这只是一致性问题而“只是语言的定义”