【问题标题】:What sort of statements are legal in a Java 'for loop' incrementer?Java“for循环”增量器中哪些语句是合法的?
【发布时间】:2012-04-12 22:41:49
【问题描述】:

在准备 OCP Java 程序员考试时,看到这是合法的语法,我有点惊讶:

for(int i = 0; i < 3; i++, System.out.print("howdy ")) ;

这让我开始思考!在测试一些类似的东西时,我发现这不能编译:

for(;; int j = 0) ;

找不到太多关于此的信息。任何人都可以提供参考或解释为什么在增量部分中声明一个新变量不能编译,但其他语句(方法调用等)可以吗?它只是(for loop scoped)变量声明还是这里不允许的任何其他类型的语句?

【问题讨论】:

    标签: java variables loops for-loop declaration


    【解决方案1】:

    很多语句都是有效的(参见 alexei 提供的链接),但是您必须查看表达式的范围才能理解为什么这种初始化不起作用:

    范围是 for 循环的所有迭代(而不是每次都有一个新范围)。第一部分只执行一次,但第二和第三部分在每个循环结束时执行。因此,如果你在第三部分声明,它会被声明多次(这是不允许的)。

    【讨论】:

      【解决方案2】:

      完整的解释可以在Java Language Specs, chapter 14.14.1找到

      摘录:

      BasicForStatement:
          for ( ForInit_opt ; Expression_opt ; ForUpdate_opt ) Statement
      
      ForInit:
          StatementExpressionList
          LocalVariableDeclaration
      
      ForUpdate:
          StatementExpressionList
      
      StatementExpressionList:
          StatementExpression
          StatementExpressionList , StatementExpression
      

      所有三个“部分”都是可选的,ForInit 和 ForUpdate 是表达式列表,其中每个语句用逗号分隔。

      【讨论】:

        【解决方案3】:

        【讨论】:

        • 感谢参考!我没有完全意识到 LocalVariableDeclaration 不是 StatementExpression(......但我现在知道了!)
        猜你喜欢
        • 2012-07-25
        • 2013-05-11
        • 2021-07-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-04
        • 2021-04-18
        相关资源
        最近更新 更多