【问题标题】:Explanation on several iterations of an increment?对增量的多次迭代的解释?
【发布时间】:2017-10-24 14:04:02
【问题描述】:

上周我们在一项测试中完成了这项任务。 我的答案是“k”(将字母递增 2 次,迭代 5 次)。 当我在 IntelliJ 中运行它时,我得到“c”。 老师告诉我们它是“h”。 我感到完全失落。有人介意向我解释一下吗?谢谢!

    public class main {
        public static void main(String[] args) {
            char a = 'a';
            for (int i = 0; i <= 5; i++) ;
            a++;
            ++a;

            System.out.println(a);
        }
    }

【问题讨论】:

  • 查看 for 语句后的 ;,然后思考循环体中包含的内容。
  • a++ = b, ++a = c 因此你会看到 c。如果你删除分号,那么你会在输出中得到 h。
  • 这实际上应该打印c,因为增量不在循环内。
  • 除非老师有不同的代码sn-p,否则他错了。正如许多人提到的那样,它是'c'。

标签: java for-loop increment


【解决方案1】:

让我们(逐行)看看发生了什么:

 public static void main(String[] args) {
     char a = 'a';                  // <- start from 'a' 
     for (int i = 0; i <= 5; i++) ; // <- trick: the loop does nothing: please notice ";"
     a++;                           // <- increment : 'a' + 1 = 'b'
     ++a;                           // <- increment : 'b' + 1 = 'c'

     System.out.println(a);         // print out: ('c')
  }

所以你有'c'。您的老师可能建议了以下代码(请注意唯一的区别:在 for 循环之后没有;):

  public static void main(String[] args) {
      char a = 'a';                 // <- starts from  'a' 

      for (int i = 0; i <= 5; i++)  // <- six times... 
      a++;                          // <- increment: 'a' + 1 + 1 + 1 + 1 + 1 + 1 = 'g'  

      ++a;                          // <- increment: 'g' + 1 = 'h' 

      System.out.println(a);        // print out ('h')
   }

你的理解

在 5 次迭代中增加字母 2 次

应该实现为

 public static void main(String[] args) {
     char a = 'a';                 // <- starts from  'a' 

     for (int i = 0; i < 5; i++)   // <- five times... (please, notice < instead of <= ) 
     {                             // do two increments in a loop
     a++;                          // <- first increment  
     ++a;                          // <- second increment 
     }

     System.out.println(a);        // print out ('k')
 }

【讨论】:

  • 非常感谢!该分配确实声明了“> =”,并且没有大括号。请问是什么让添加大括号会产生不同的结果?
  • @Vantalim: for loop 只执行一个操作;通过添加{},我们将多个操作(在您的情况下为a++; 和++a;)合并为一个
  • 宾果游戏!非常感谢:)
【解决方案2】:

这一行末尾的;:

for (int i = 0; i <= 5; i++) ;

... 表示循环什么也不做。空语句附加到它。

因此,a 会递增两次,这就是为什么在运行它时会得到 'c'。

没有该行末尾的;,下一行的a++ 将在循环内,因此a 将被循环递增6 次(一次为i == 0,再次为i == 1,依此类推,直到并包括i == 5),到'g',然后在循环之后再次(++a)到h。

【讨论】:

  • 非常感谢!除了明显未能发现我所犯的基本错误之外,这使它更加清晰。那么我是否正确理解 for 循环中的计数器在循环运行一次后递增?
  • @Vantalim:是的。 for 循环有四个部分:Initialization、test、increment 和 body。它是这样运行的: 1. 进行初始化; 2. 做test,如果结果为假则退出循环; 3.做body; 4.递增; 5. 转到第 2 步。
  • 你们太棒了。谢谢!
【解决方案3】:

for 循环由; 终止。这使得for 循环完全不相关并且没有任何效果。

剩下的只是 2 个增量,使 a 变为 c

【讨论】:

  • 谢谢,我应该发现这个!我很新,所以我显然需要更多的细节培训!
【解决方案4】:

如果讲师告诉您答案是“h”,那么您可能错过了复制代码。要获得“h”,它应该是:

public class main {
        public static void main(String[] args) {
          char a = 'a';
          for (int i = 0; i <= 5; i++) 
            a++;
          ++a;  
          System.out.println(a);        
        }
    }

【讨论】:

  • 你说的完全正确;我都想念复制代码和你建议的代码。
猜你喜欢
  • 2020-03-05
  • 2014-01-09
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 2017-02-09
  • 2013-03-10
  • 2017-04-01
  • 2020-01-03
相关资源
最近更新 更多