在Java,C和C++中循环变量的类型限制

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)


P D*_*ddy 6

你的例子:

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初始化程序之外声明其中一种变量.