2012-11-08 80 views
13

在外面做条件往往不是我们需要这样的为什么是同时的,而范围

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

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

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

我不喜欢这至少有两个原因。首先,我喜欢在本地声明事物。其次,如果值不可分配或缺省可构造,但只有可复制构造,则这是一个问题。

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

希望问题很清楚。

+3

你意识到这是每一个其他类型的循环一样,对不对?这不是特定于做/当,所以你真的要求做/是一个特殊情况。 –

+1

您可以通过使用'for'循环来保留条件变量的作用域,而不是使用'for'循环来清理它。 –

+1

*我们经常需要**这样的循环* - >在很多年里,我没有使用过* do-while *循环。 –

回答

9

如果你想保持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的范围规则++工作方式如下:一撑{...}在b中声明的局部变量锁是本地的/只对该块可见。例如:

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

会抱怨c未申报。

至于理由 - 它只是一个一致性的问题,并“这就是语言是如何定义”

+0

与问题无关。问题是“为什么”,而不是“如何解决它”。 –

+0

我不敢相信这有两个upvotes ... –

+6

@EdS。,约翰:OP说'如果你相信我的第一个问题的答案是“这只是它的方式,不要问为什么问题。 “ **然后我想知道是否有成语可以帮助编写类似于我的例子中的do-while循环,但没有我提到的缺点。**' – kennytm