Java在for循环外声明迭代器

8
根据Oracle文档,for循环是下面这样组成的:
for (initialization; termination; increment) {
    statement(s)
}

E.g.,

class ForDemo {
    public static void main(String[] args){
         for(int i=1; i<11; i++){
              System.out.println("Count is: " + i);
         }
    }
}

为什么我们不能像这样在for循环外声明初始化部分呢?
 class ForDemo {
    public static void main(String[] args){
         int i = 1;
         for(i; i<11; i++){
              System.out.println("Count is: " + i);
         }
    }
}

2
去掉“i;”中的“i”,它就可以工作了。 - Odrai
在 Stack Overflow 上,我们倾向于不在问题帖子中混合问题陈述和解决方案。相反,您可以自我回答您自己的问题。请从您的问题帖子中删除答案部分。 - Tsyvarev
@Tsyvarev 完成了 :) - keser
4个回答

9
你可以使用以下方式:
 for(; i<11; i++){
      System.out.println("Count is: " + i);
 }

但是变量i的作用域不同了。现在,i将会在循环外部存在。


5
你可以这样做。但是在通常放置初始化的位置,你只需要一个空白的;
int i = 1;
for(; i<11; i++){
    System.out.println("Count is: " + i);
}

这样做的区别在于,i 的作用域现在扩大到了循环之外。这可能是您想要的。否则最好将变量保持在尽可能严格的范围内。就像 for 循环的文档中所说:

在初始化表达式中声明它们会限制它们的生命周期并减少错误。

输出:

Count is: 1
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10

4
在这个for循环中真正发生了什么?
BasicForStatement:
    for ( ForInit ; Expression; ForUpdate ) 

根据文档,初始化需要一个语句来说明。

如果ForInit代码是语句表达式列表

来自Java文档

因此,在这段代码中:

 for(i; i<11; i++){ 
      System.out.println("Count is: " + i);
 }

i不是一个语句,它只是一个变量。那么什么是语句?

Statements are roughly equivalent to sentences in natural languages. A statement forms a complete unit of execution. The following types of expressions can be made into a statement by terminating the expression with a semicolon (;).

Assignment expressions
Any use of ++ or --
Method invocations
Object creation expressions

有了这个知识,您可以处理任何for循环,只要您知道语句是什么,例如这个for循环就可以工作。

int i = 1; // Initializated
for(i++; i<11; i++){ // Whit a statemnt
    System.out.println("Count is: " + i);
}

并且输出结果将是:
Count is: 2
Count is: 3
Count is: 4
Count is: 5
Count is: 6
Count is: 7
Count is: 8
Count is: 9
Count is: 10

0
引用 Java 文档:
最好在初始化表达式中声明变量。i、j 和 k 是常用于控制循环的名称;在初始化表达式内声明它们可以限制它们的生命周期并减少错误。
For 循环的三个表达式是可选的;以下代码可以创建一个无限循环:
// infinite loop
for ( ; ; ) {

    // your code goes here
}

所以,我错过了它。虽然可能,但并不理想。留空初始化部分是解决方案。

  for (  ;i <= 10 ; i++ ) {

        // i is defined outside already
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接