(Java)While-Loop条件

时间:2015-12-23 15:17:38

标签: java while-loop

我刚刚开始在学校学习Java,现在我被卡住了。

public static void main(String[] args) {
    int count = 0;
    int point = 5;
    while(point != count++){
        System.out.println(count);
    }

控制台: 1 2 3 4 5

为什么数字" 5"还在印吗?不是这个循环应该只在点!=计数+ 1时运行吗?然后它应该在5 = 5时停止,不是它(" 5"不会被打印)?

非常感谢。

7 个答案:

答案 0 :(得分:12)

point != count++

这意味着比较pointcount的当前值不等式,然后递增count。所以当count为4时

  1. 将与point(不等)
  2. 进行比较
  3. count将成为5
  4. while循环将运行一次迭代
  5. 将再次与point进行比较(等于)
  6. 循环终止
  7. 前缀增量运算符++count将在比较中使用该值之前递增。

答案 1 :(得分:10)

因为您在增加==之前进行了比较++,如果要修复它,请更改为++count

答案 2 :(得分:6)

我同意关于假设当前结构的问题细节的先前答案。但是,最好遵循Java语言规范中的建议15.7. Evaluation Order,其中说明

  

Java编程语言保证了操作数   运算符似乎在特定的评估顺序中进行评估,   即,从左到右。

     

建议代码不要严格依赖此规范。   当每个表达式最多包含一侧时,代码通常更清晰   效果,作为最外层的操作,当代码不依赖时   究竟哪个例外由于从左到右而产生   表达式评估。

count++有副作用,并不是其声明中的最外层操作。这最终导致您难以推理代码。如果你在println调用之前或之后在循环内完成了增量,那就更清楚了。

推理程序的关键是拥有简单明了的不变量。这是您的程序的替代版本,过度评论以进行展示。

public class Test {
  public static void main(String[] args) {
    /*
     * Initialize count to the first value that will be used in the loop
     * payload.
     */
    int count = 1;
    int point = 5;
    while (count < point) {
      /*
       * Loop payload - executed with the same value of count as the test above
       */
      System.out.println(count);
      /*
       * Increment count for the next test and, if the test passes, payload
       * execution.
       */
      count++;
    }
  }
}

我使用“payload”来表示循环所在的代码,在这种情况下只是println调用。

我的不变量是:

  • 到达测试时count的值是将要测试的值,如果通过测试,则是将在有效负载中使用的值。
  • 执行循环体后,count的值增加了一个。

循环包含两个带副作用的操作,调用printlncount增量。它们中的每一个都是其声明中最外层的操作。

答案 3 :(得分:5)

这是java中前缀(++i)和后缀(i++)运算符之间的区别。

你使用的是postfix,这意味着它首先返回count的值,然后增加它。如果你使用point != ++count,你将无法获得5张

答案 4 :(得分:4)

计数在评估之后才会递增。你需要这样做:

public static void main(String[] args) {
    int count = 0;
    int point = 5;
    while(point != ++count){
        System.out.println(count);
    }

在这种情况下, ++ 导致计数首先更改,然后再根据进行检查。

很容易记住:如果 ++ 之前出现,它会先增加。如果经过评估后再进行评估。这同样适用于作业。

话虽如此,我同意Patricia的回答,即递增应该在while块内完成,如下所示:

  public static void main(String[] args) {
        int count = 0;
        int point = 5;
        while(point != count){
            System.out.println(count);
            count++;
        }

这更清晰,更容易推理。

答案 5 :(得分:2)

问题是你在增加它之前比较计数。

您的意思是:while(point != count +1)

你想要什么:while(point != ++count)

希望有所帮助!

答案 6 :(得分:-1)

这是我的理解: 如果您在 for 循环中使用 prefix 或 post,它根本不会改变程序的行为。 所以问题是什么时候重要?

当我们将前缀或后缀与其他比较运算符一起使用时很重要例如

前缀 我 = 1; result = 5 + ++i //这个答案是 7 解释:这就是我的想法 - 因为它在“i”之前有 ++ 然后首先我们将增加 i 然后将其添加到 5。

后缀

i=1; 结果 = 5 + i++; //答案是6 说明: 因为这个在 i 之后有 ++ 然后首先我们将添加 i 值然后递增 所以首先将 1 添加到 5,然后 i 的新值将是 2

简而言之 i++ 首先将值提供给比较运算符,然后递增。这解释了你的情况 5!= 4 ,然后 i 增加到 5 并打印出来。