Java:在for循环init中初始化多个变量?


91

我想要两个不同类型的循环变量。有什么办法可以使这项工作吗?

@Override
public T get(int index) throws IndexOutOfBoundsException {
    // syntax error on first 'int'
    for (Node<T> current = first, int currentIndex; current != null; 
            current = current.next, currentIndex++) {
        if (currentIndex == index) {
            return current.datum;
        }
    }
    throw new IndexOutOfBoundsException();
}

什么first啊 它没有在任何地方声明。是班级成员吗?
Extraneon 2010年

7
您应该在下面接受一个答案
Mr_and_Mrs_D 2013年

而且与C不同,Java没有逗号运算符:stackoverflow.com/questions/12601596/…,它将允许初始化(但不声明)两个不同类型的变量。
西罗Santilli郝海东冠状病六四事件法轮功2015年

@Nick Heiner您能否将以下答案之一标记为已接受?
詹姆斯·蒙格

Answers:


105

语句的初始化for遵循局部变量声明的规则

这是合法的(如果很傻):

for (int a = 0, b[] = { 1 }, c[][] = { { 1 }, { 2 } }; a < 10; a++) {
  // something
}

但是尝试声明所需的distinctNodeinttypes对于局部变量声明是不合法的。

您可以使用如下代码块来限制方法中其他变量的范围:

{
  int n = 0;
  for (Object o = new Object();/* expr */;/* expr */) {
    // do something
  }
}

这样可以确保您不会在方法的其他地方意外地重用变量。


10
任何人都知道为什么语言设计人员会实施这种看似不必要的约束吗?
杰夫·阿克塞尔罗德

@glenviewjeff-最好作为一个单独的问题提出。
McDowell

2
@JeffAxelrod,也许是因为历史的原因,因为Java是℃之后仿照++ ......看到这个帖子:stackoverflow.com/questions/2687392/...
克里斯托夫•鲁西

3
+1是使用积木,我
经常

18

你不能这样 您可以使用相同类型的多个变量,for(Object var1 = null, var2 = null; ...)也可以提取另一个变量并在for循环之前声明它。


9

只需将变量声明(Node<T> currentint currentIndex)移到循环外,它就可以工作。像这样

int currentIndex;
Node<T> current;
for (current = first; current != null; current = current.next, currentIndex++) {

甚至

int currentIndex;
for (Node<T> current = first; current != null; current = current.next, currentIndex++) {

1
两者都不会编译:您必须在使用之前初始化变量。
unbeli 2010年

@unbeli好吧,我不是在手工代码编译中工作:)我只是想提出这个想法。
Nikita Rybak 2010年

3
@unbeli:澄清一下:currentIndex需要初始化。Nikita对它所做的第一件事是“ currentIndex ++”,它自然地提出了一个问题,增加什么?current很好,因为第一个用途是将其设置为first。
杰伊,2010年

通常,为了更好地在for循环中编写增量,应该使用++ var作为编译器要求的符号var ++来复制var的内容,然后再递增该变量以将其作为表达式的结果返回,尽管没人希望这样做。当然,编译器会对其进行优化,但这就像在路​​上扔垃圾等其他人进行清理一样。
Chucky 2013年

5

在初始化块中声明的变量必须具有相同的类型

我们无法根据其设计在for循环中初始化不同的数据类型。我只是举一个小例子。

for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
      //Your Code goes here
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.