我是一名正在学校学习Java(初学者)的学生,我想知道一些事情。
我具有其他语言的编码基础知识,并且不了解Java中的特定内容。
如果我要在循环内声明变量(让我们以int
为例),那是否就意味着我要一遍又一遍地声明相同的变量?
这是我的意思:
for (int i = 0; i < 3; i ++) {
int x = 5;
}
这不是同一回事吗? (这是不正确的)
int x = 5;
int x = 5;
如果没有,为什么?它们都是/两次声明相同的变量,尽管我知道in循环中的变量是局部的,不能在循环外使用(尽管我不认为这是问题所在)。
我也知道您不能两次声明相同的变量,所以我不明白第一个示例的合法性。
非常感谢:D
此问题已解决,感谢所有人的帮助:D
答案 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中得到类似的消息):
如果我在循环外的其他范围内声明变量,则不会出现错误,因为范围不同:
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
}