fjs*_*jsj 5 c++ java scope for-loop strong-typing
为什么Java,C和C++(也许还有其他语言)在for-loop变量上不允许多种类型?例如:
for (int i = 0; i < 15; i++)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们有一个循环变量i,它是循环计数器.
但我可能想要另一个变量,其范围仅限于循环,而不是每次迭代.例如:
for (int i = 0, variable = obj.operation(); i < 15; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
我存储obj.operation()在返回数据variable,因为我想用它仅在循环中.我不希望variable保留在内存中,也不希望在循环执行后保持可见.不仅可以释放内存空间,还可以避免因错误使用而导致的不良行为variable.
因此,循环变量很有用,但由于其类型限制而未得到广泛支持.想象一下,该operation()方法返回一个long值.如果发生这种情况,我不能享受循环变量的优点而不会丢失和丢失数据.以下代码不能用Java编译:
for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
同样,任何人都知道为什么存在这种类型限制?
jsi*_*ght 21
存在这种限制是因为您的要求非常不寻常,并且可以使用非常相似(并且仅稍微更详细)的构造获得.如果您真的想要这样做,Java支持匿名代码块来限制范围:
public void method(int a) {
int outerVar = 4;
{
long variable = obj.operation();
for (int i = 0; i < 15; i++) { ... }
}
}
Run Code Online (Sandbox Code Playgroud)
你的例子:
for (int i = 0, long variable = obj.operation(); i < 15; i++) { ... }
Run Code Online (Sandbox Code Playgroud)
因为同样的原因是非法的:
int i = 0, long variable = obj.operation();
Run Code Online (Sandbox Code Playgroud)
本身就是非法的.逗号不会开始新的声明.逗号之前和之后的两个部分都是一个声明的一部分.该语句声明并初始化int变量列表.好吧int,无论如何,这就是行开头的标识符告诉编译器的内容.在long逗号后的标识是一个错误,因为申报不同类型的变量(一个或多个),必须启动一个新的语句.
由于您无法在一个语句中声明两种不同类型的变量,因此必须在for初始化程序之外声明其中一种变量.