繁体   English   中英

(Java) While 循环条件

[英](Java) While-Loop condition

我刚开始在学校学习 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”? 这个 while 循环不应该只在 point != count + 1 时运行吗? 然后它应该在 5 = 5 时停止,是不是(并且不会打印“5”)?

非常感谢。

point != count++

这意味着比较pointcount当前值是否不等,然后增加count 所以当count为 4 时:

  1. 它将与point (不等)进行比较
  2. count将变为 5
  3. while 循环将运行一次迭代
  4. 它将再次与point进行比较(相等)
  5. 循环终止

前缀递增运算符++count将在比较中使用该值之前递增。

因为你是在 increment ++之前做比较== ,如果你想修复它,改成++count

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

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++;
    }
  }
}

我使用“有效负载”来表示存在循环的代码,在这种情况下只是println调用。

我的不变量是:

  • 到达测试时的count既是将要测试的值,也是在通过测试时将在有效载荷中使用的值。
  • 循环体执行后, count的值已经加一。

该循环包含两个具有副作用的操作,即对println的调用和count递增。 它们中的每一个都是其语句中最外层的操作。

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

你用的是postfix,这意味着它首先返回count的值,然后增加它。 如果你使用point != ++count你不会得到 5 打印

直到对while进行评估之后,计数才会增加。 你需要这样做:

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

在这种情况下, ++导致count首先改变,然后再根据point进行检查。

很容易记住:如果++出现在前面,则它首先递增。 如果经过再评价。 这同样适用于任务。

话虽如此,我同意帕特里夏的回答,增量应该在 while 块内完成,如下所示:

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

这更清楚,更容易推理。

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

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

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

希望有帮助!

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

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

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

后缀

我=1; 结果 = 5 + i++; //对此的答案将是 6解释:因为这个在 i 之后有 ++ 然后首先我们将添加 i 值然后递增所以第一个 1 将被添加到 5 然后它的新值 i 将是 2

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM