在do-while循环内部声明的变量可以在条件语句中使用

16

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

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

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

(http://codepad.org/n5ym7J5w)

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

我只是好奇是否存在任何技术原因,使这不可能发生。


2
double 是一个关键字,是的,double(变量)在循环外部不在作用域内(因此不能用作条件)。 - Chad
抱歉使用 double 作为变量名。哈哈。现在已经修改了。 - José D.
3
这段代码的含义相当于 for(;;) {cout << 0;} - chris
1
@chris 是的,如果一开始就编译通过了(j作用域问题),那么是可以的。 - syam
1
“技术原因”是,每次进入循环时重置和重新初始化条件中的变量毫无意义。 - Crowman
显示剩余3条评论
5个回答

13
j 的作用范围仅限于 {} 大括号内。你不能在循环条件中使用它,因为循环条件位于该作用域之外。
从我手边的 C++ 草案标准来看:
“在块内声明的名称仅局部于该块。其潜在作用域始于其声明点并于其声明区域结束。”
“块”也被称为“复合语句”,是由大括号 {} 包围的一组语句。

7

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

你声明的变量i和j具有“局部范围” - 即在{}括号内部的变量。你实际上想要将j声明为“语句范围”,但这是不可能的。

语句范围指那些作为'for'、'while'、'if'或'switch'语句一部分声明的变量。然而,语句范围不包括do-while语句,这就是为什么你不能这样做。

你基本上揭示了使用do-while的语言缺陷。

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

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

但是它并没有提供这个功能。

0

Double这个词需要改成一个未被保留的单词(感谢Chad),才能在while条件中使用,因此必须在do的范围之外声明。

int i = 0;
int d = 0;
do{
    d = i * 2;
    cout << d;
    i++;
} while (d < 100);

如果你想让它编译通过,你可以更改 double 的名称。 - Chad

0
  • do循环的语法是do{ },在{ }中的任何变量声明将只存在于此范围内。因此,j的作用域仅限于do{ }内部,因为它是在此范围内声明的。只能在此范围内调用或引用。
  • 如果你想在这个作用域之外访问j,你需要将j声明为全局变量。将j的声明移出这个作用域。

-1
int j = 0;
for(int i = 0;j < 100;++i){
j = i * 2;
cout<<j;
}

在每个循环之前将 i 设置为 0,并声明为 int 类型,这样 for 循环会更好地工作。

能否解释一下?没有解释的代码在SO上是不可接受的。此外,请缩进。-1 - syam
我的英语不好,但我尽力帮忙,却得到了-1的评价... - Michał Szałapski
是的,因为你没有提供任何解释,所以被评为-1分。即使你的英语不是很好,也请至少尝试解释一下。如果你只给出代码而没有任何解释,我们怎么能理解你的意思呢?我知道这听起来很严厉,但这是我们保持SO和自己不断进步的方式。 - syam
1
没问题,只需要记住我的投票不是反对,而是反对这个消息。我把它删除了,因为你试图改正。 ;) - syam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接