Java中的!=运算符用于循环中。

4
为什么下面的代码会输出"The value of J is: 1000"?
我原以为在所有情况下,"j != 1000"都会被评估为false(因为1000 mod 19不等于0),从而使其成为一个无限循环。
public static void loop2() {
    int j = 0;

    for(int i=0;j != 1000;i++) {
        j = j+19;
    }
    System.out.println("The value of J is: " + j);
}

7
我想象你的整数变量将在某一时刻溢出,那时候它的值可能会变成1000。 - Worthless
4个回答

14

Java中int的最大值为2,147,483,647。在将19添加到j上一次又一次地进行操作时,该值会被传递。之后,它将从int的最小值即-2,147,483,648重新开始。

这将继续进行,直到j的值在某个点上变为1000。因此,循环将停止。

j将迭代17次,超过整数的最大值才能达到这一点。检查代码:

public class Solution {
    public static void main(String args[]) {
        int j = 0;
        int iterationCount = 0;

        for(int i=0;j != 1000;i++) {
            j = j+19;
            if(j - 19 > 0 && j < 0) {
                iterationCount ++;
            }

        }
        System.out.println("The value of J is: " + j + " iterationCount: " + iterationCount);
    }
}

输出:

The value of J is: 1000 iterationCount: 17

3
顺便提一下,在它达到1000之前,它会溢出并循环回来大约17次。 - Worthless

4

像这样扫描溢出:

public static void main(String[] args) {
  int j = 0;
  for(int i=0;j != 1000;i++) {
    j = j+19;
    if(j < Integer.MIN_VALUE+19){
      System.out.println("overflow");
    }
  }
  System.out.println("The value of J is: " + j);
}

打印

溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
溢出
J的值为:1000

这意味着,在增加19之前,j溢出了17次才最终达到1000。


1
这是由于整数溢出导致的,正如Saheb所说。
在3842865528次迭代后,J的值达到了1000。
public static void loop2()
{
    int j = 0;
    long iterations = 0;

    for (int i = 0; j != 1000; i++) {
        j = j + 19;
        iterations++;
    }
    System.out.println("The value of J is: " + j + " reached after " + iterations + " iterations");
}

0

你将j定义为int类型。整数有一个定义好的范围。有符号整数的最大值是2,147,483,647。一旦超过这个值,就会发生位溢出,导致整个值从最小值开始。在整数的情况下,最小值为-2,147,483,648。在循环的某个点上,您会得到一个负的起始循环值,这会导致您的循环停留在981+19 = 1000 >>> 循环退出,因为J等于您for循环的退出条件。


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