【问题标题】:Java: Initialize multiple variables in for loop init?Java:在for循环初始化中初始化多个变量?
【发布时间】:2011-04-02 08:30:50
【问题描述】:

我想要两个不同类型的循环变量。有什么办法可以做到吗?

@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?它没有在任何地方声明。是班级成员吗?
  • 你应该接受下面的一个答案
  • 与 C 不同,Java 没有逗号运算符:stackoverflow.com/questions/12601596/…,它允许初始化(但不声明)两个不同类型的变量。
  • @Nick Heiner 您能否将以下答案之一标记为已接受?

标签: java for-loop


【解决方案1】:

initialization of a for 语句遵循local variable declarations 的规则。

这将是合法的(如果愚蠢的话):

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

但是尝试根据需要声明不同的 Nodeint 类型对于局部变量声明是不合法的。

您可以使用这样的块来限制方法中其他变量的范围:

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

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

【讨论】:

  • 有人知道为什么语言设计者会实施这个看似不必要的约束吗?
  • @glenviewjeff - 这最好作为一个单独的问题提出。
  • @JeffAxelrod,可能是出于历史原因,因为 Java 是在 C++ 之后建模的......请参阅这篇文章:stackoverflow.com/questions/2687392/…
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    只需将变量声明(Node&lt;T&gt; 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++) {
    

    【讨论】:

    • 两者都不会编译:你必须在使用前初始化变量。
    • @unbeli 好吧,我不是在练习手动代码编译 :) 我只是想给出这个想法。
    • @unbeli:澄清一下:currentIndex 需要初始化。 Nikita 对它做的第一件事是“currentIndex++”,这很自然地提出了一个问题,增量是什么? current 很好,因为第一次使用是将其设置为 first。
    • 通常为了更好地在 for 循环中编写增量,应该使用 ++var 作为编译器所需的符号 var++ 来复制 var 的内容之前将其递增到将它作为表达式的结果返回,尽管没有人想要它。当然,编译器会优化它,但这就像把垃圾扔在路上等待别人清理。
    【解决方案4】:

    在初始化块中声明的变量必须是同一类型

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

    for(int i=0, b=0, c=0, d=0....;/*condition to be applied */;/*increment or other logic*/){
          //Your Code goes here
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-08
      相关资源
      最近更新 更多