为什么允许在for循环中声明变量?

5

我是一名正在学校学习Java的学生(初学者),这里有一个关于Java的问题让我感到困惑。
我对编程语言有些基础知识,但是我不理解Java中的一个特定内容。
如果我在一个循环内声明了一个变量(让我们使用int作为例子),那么这不意味着我在重复声明同一个变量吗?

我的意思是:

for (int i = 0; i < 3; i ++) {
    int x = 5;
}

这不是和这个一样吗?(这个是不正确的)
int x = 5;
int x = 5;

如果不行,为什么?虽然我知道在循环中变量是局部的并且不能在循环之外使用(但我不认为这是问题),但它们都声明同一个变量。我也知道不能声明两次同一个变量,因此我不明白第一个示例如何合法。
谢谢:D 这个问题已经解决,感谢所有帮助过我的人:D

什么是错误? - Sz-Nika Janos
8
这个变量的作用范围仅限于循环的一次迭代,迭代结束后它就不存在了,因此不会有重复的变量。 - Arnaud
5
这个问题已经被解决了 - 请考虑 接受 一个答案。 - LuCio
8个回答

10
for (int i = 0; i < 3; i ++) {
    int x = 5;
}

实际上等价于:

{
    int x = 5;
}
{
    int x = 5;
}
{
    int x = 5;
}

每个x变量都在单独的作用域中声明。

那么这就像是对循环应用相同的规则,即不能在循环内部声明的变量在循环外部使用?所以基本上它对每个括号都做了同样的事情? - Roe
@Roe 循环体内声明的每个变量仅存在于当前迭代循环的范围内。 - Eran

3

作用域仅在一次循环中存在,循环结束后,作用域将不存在。

简单例子:

for (int i = 0; i < 4; i++) {
            int x = 0;
            System.out.println(x);
            x++;
        }


output:
0
0
0
0

漂亮的插图。 - kabanus

0
在循环的每次迭代中,都会创建一个类型为int的变量x并赋值为5
一旦迭代完成,此变量将被"销毁",并在下一次迭代时重新开始循环。
因此,在同一作用域内永远不会有两个同名变量。

我现在明白了,非常感谢所有帮助我的人:D - Roe

0

变量x的生命周期始于声明它的时刻,并在for循环的结束块处结束。

换句话说,x在进入新迭代时诞生,在迭代结束时死亡(或在包含它的块的末尾死亡)。


0

当你在循环内部声明int x = 5;时,你声明了一个局部作用域(从其{}),因此变量x将在超出其作用域时被销毁,这意味着对于下一次循环迭代,它是一个新的x,所以你可以这样做,由于它在超出作用域时被销毁,因此无法在作用域外使用/查看。


0

让我们来看第一个表达式

for (int i = 0; i < 3; i ++) {
        int x = 5;
 }

这里变量x的作用域仅限于循环块内部

因此,每次启动新循环时,作用域已经被释放。

所以不会出现错误。

如果您将相同的代码更改为以下内容,则会出现错误

for (int i = 0; i < 3; i ++) {
        int x = 5;
        int x = 5;
 }

现在会出现错误,因为x已经在作用域中,而您又再次尝试定义它。

这是允许的。

for (int i = 0; i < 3; i ++) {
    int x = 5;
    x = 5;
}

由于您正在撤销变量


我理解了你说的话,除了这一部分:“所以每次新循环开始作用域已经被释放。因此不会出现错误。” - Roe

0

通常最好的做法是将变量限制在尽可能小的上下文中:如果你只需要在循环内部使用它,那么在循环内部声明它被认为是良好的实践。

对于循环声明的情况,你的值基本上会被重新赋值。

这可能会对阅读和添加更多信息有所帮助:在循环内部或外部声明变量

这也是合法的做法。

for (int i= 0; i < 1000000000; i++) { 
    int j = i & i+1 ;
}

这些是合法的,因为在循环结束时,声明的变量“停止存在”,以便在下一次执行中重新形成。


0

为了澄清在循环中允许变量声明的概念,我在循环中再次声明了同一变量,并得到错误提示“在此范围内已经定义了名为'x'的本地变量或函数”(我用C#编写了这段代码,但在Java中您应该会得到类似的消息): same variable in a loop

如果我在循环外部的不同作用域中声明变量,则不会出现错误,因为作用域不同:

        for (int i = 0; i < 3; i++)
        {
            int x = 5;                
        }

        {
            int x = 5;
        }

如果我们不能在循环中声明变量,我们就必须编写以下代码:
        {
            int x = 5;
            // Do something with x=5
        }
        {
            int x = 5;
            // Do something with x=5
        }
        {
            int x = 5;
            // Do something with x=5
        }

但是使用循环,我们只需要写以下代码而不是写三个作用域:

        for (int i = 0; i < 3; i++)
        {
            int x = 5;
            // Do something three times with x=5
        }

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