15

我正在写类似这样的代码:

do {
    int i = 0;
    int j = i * 2;
    cout<<j;

    i++;
} while (j < 100);

( http://codepad.org/n5ym7J5w )

当我的编译器告诉我不能使用变量“j”时,我感到很惊讶,因为它没有在 do-while 循环之外声明。

我只是好奇是否有任何技术原因导致这不可能。

4

5 回答 5

12

的范围j就在{}大括号内。您不能在该范围之外的循环条件中使用它。

从 C++ 标准草案中,我很方便:

在块中声明的名称是该块的本地名称。它的潜在范围从它的声明点开始,到它的声明区域结束。

“块”也称为“复合语句”,是用大括号括起来的一组语句{}

于 2013-08-30T20:54:37.293 回答
7

这不可能是有原因的。这是由于“语句范围”的限制。

您的变量 i 和 j 已用“本地范围”声明 - 即 {} 括号内的变量。您实际上希望 j 用“语句范围”声明,但这是不可能的。

语句范围是那些声明为“for”、“while”、“if”或“switch”语句的一部分的变量。但是,语句范围不包括 do-while 语句,这就是您不能这样做的原因。

您基本上暴露了使用 do-while 的语言缺陷。

如果该语言提供以下内容会更好:

do {
.
.
.
} while (int j < 100);

但它不提供这个。

于 2013-08-30T21:23:51.207 回答
0

Double 必须更改为非保留字(感谢 Chad),需要在 do 的范围之外声明才能在 while 条件中使用。

int i = 0;
int d = 0;
do{
    d = i * 2;
    cout << d;
    i++;
} while (d < 100);
于 2013-08-30T20:58:11.903 回答
0
  • do 循环的语法是 do{ } 在 { } 中的任何变量声明都将只存在于这个范围内。因此 j 的范围仅在 do{ } 内,因为它是在此范围内声明的。它只能在这个范围内被调用或引用。
  • 如果要在此范围之外访问 j,则需要将 j 声明为全局变量。将 j 的声明移到此范围之外。
于 2013-08-30T22:31:36.693 回答
-1
int j = 0;
for(int i = 0;j < 100;++i){
j = i * 2;
cout<<j;
}

在每个循环之前设置 i = 0; 并声明为 int + for 循环效果更好

于 2013-08-30T20:56:47.670 回答