! = оператор в Java для цикла - PullRequest
       1

! = оператор в Java для цикла

0 голосов
/ 11 сентября 2018

Почему следующий код печатает «Значение J: 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);
}

Ответы [ 4 ]

0 голосов
/ 11 сентября 2018

Это, как сказал Сахеб, из-за целочисленного переполнения.

Значение J, 1000, достигается после 3842865528 итераций

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 голосов
/ 11 сентября 2018

вы определили свой J как Int.Целые числа имеют определенный диапазон.Максимальное значение подписанного целого числа составляет 2 147 483 647.Как только вы перебираете это значение, вы получаете переполнение, которое приводит к тому, что все начинается с минимального значения.В случае целых чисел это -2 147 483 648.В какой-то момент цикла вы получаете отрицательное начальное значение цикла, которое приводит к приземлению цикла на 981 + 19 = 1000 >>> цикл завершен, потому что J равно вашему выходному условию цикла for.

0 голосов
/ 11 сентября 2018

Сканирование на наличие переполнений, например:

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

печатает

overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
overflow
The value of J is: 1000

, что означает, что j переполняется 17 раз, пока приращение на 19 не достигнет, наконец, 1000.

0 голосов
/ 11 сентября 2018

Максимальное значение int в java равно 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...