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

时间:2018-11-27 10:36:51

标签: java

我是一名正在学校学习Java(初学者)的学生,我想知道一些事情。
我具有其他语言的编码基础知识,并且不了解Java中的特定内容。
如果我要在循环内声明变量(让我们以int为例),那是否就意味着我要一遍又一遍地声明相同的变量?

这是我的意思:

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

这不是同一回事吗? (这是不正确的)

int x = 5;
int x = 5;

如果没有,为什么?它们都是/两次声明相同的变量,尽管我知道in循环中的变量是局部的,不能在循环外使用(尽管我不认为这是问题所在)。
我也知道您不能两次声明相同的变量,所以我不明白第一个示例的合法性。

非常感谢:D

此问题已解决,感谢所有人的帮助:D

8 个答案:

答案 0 :(得分:9)

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

实际上等同于:

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

每个x变量都在单独的范围内声明。

答案 1 :(得分:3)

作用域是一次迭代,循环结束后,作用域不存在。

简单的例子:

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


output:
0
0
0
0

答案 2 :(得分:0)

在循环的每次迭代中,“ 创建”类型为x的变量int并分配了值5
迭代完成后,此变量将被“ destroyed ”破坏,并且在下一次迭代中,循环将再次开始。
因此,在相同范围内永远不会有两个具有相同名称的变量

答案 3 :(得分: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;
}

在您退出变量时

答案 4 :(得分:0)

变量x的生命周期从您声明它开始,一直到for-loop的结束块结束。

换句话说,x是在您输入新迭代时诞生的,而在迭代结束时死亡(或在包含该迭代的代码块的末尾死亡)

答案 5 :(得分:0)

通常最好的做法是使变量在尽可能小的上下文中可用:如果仅在循环内需要它,则在内部声明它被认为是一种好习惯。

对于循环声明,基本上会重新分配您的值。

阅读并添加有关此问题的更多信息可能会很有趣:Declaring variables inside or outside of a loop

这也是合法的事情

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

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

答案 6 :(得分:0)

好吧,当您在循环内声明int x = 5;时,您是在局部范围(从其{})中声明它,因此变量{{1} }超出范围时将被销毁,这意味着在下一次循环迭代中,它是一个新的x,因此您可以这样做,并且由于超出范围而被销毁,因此无法使用/在范围之外看到。

答案 7 :(得分:0)

仅是为了阐明允许在循环中声明变量的概念,我在循环中再次声明了相同的变量,并且收到错误消息“此范围内已经定义了名为“ x”的局部变量或函数”(用C#编写了此代码,但是您应该在Java中得到类似的消息): same variable in a loop

如果我在循环外的其他范围内声明变量,则不会出现错误,因为范围不同:

ALTER TRIGGER [dbo].[trginsert] 
ON [dbo].[Employee_Test]
AFTER INSERT 
AS
    -- you should *ALWAYS* spell out the columns you want to insert into!
    -- since you didn't mention them, this is *just my GUESS* - adapt as needed!
    INSERT INTO Employee_Test (Name, Salary, EmpId)
        -- grab the inserted rows from "Inserted"
        SELECT
            i.Emp_name, i.Emp_Sal, u.ERPMainCustID
        FROM
            Inserted i
        -- cross join them against all the "ERPMainCustID" values from "AspNetUsers"
        CROSS JOIN
            AspNetUsers u
        WHERE
            u.ERPMainCustID IS NOT NULL

如果我们无法在循环中声明变量,则必须编写以下代码:

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

        {
            int x = 5;
        }

但是使用循环,我们可以只编写以下内容,而不是编写3个作用域:

        {
            int x = 5;
            // Do something with x=5
        }
        {
            int x = 5;
            // Do something with x=5
        }
        {
            int x = 5;
            // Do something with x=5
        }