Почему работает цикл for, хотя условие ложно - PullRequest
0 голосов
/ 15 декабря 2018

Я пытался написать трассировку кода для этой программы.после многих попыток на бумаге я думал, что понял это, но теперь я снова споткнулся.

В цикле for i=counter, потому что i=0 и counter=0, так как он должен быть меньше счетчика, как этот код вообще выполняется?

Я включил свой неполныйкод трассировки ниже.

Цель программы - напечатать 50 уникальных случайных чисел от 1 до 999 в 10 строках по 5. Программа работает отлично. Я просто хочу выяснить, как она работает с помощьютрассировки кода.Я знаю, что это может быть простой проблемой для вас, но я борюсь с этим.Не могли бы вы помочь мне, спасибо.

import java.util.Random;

public class Random50 {

    public static void main(String[] args) {

        int numbersNeeded = 50;
        int[] randomNumbers = new int[numbersNeeded];
        int counter = 0;
        Random randomGenerator = new Random();
        int max = 999;
        int min = 1;

        while (counter < numbersNeeded) {

            int generated = min + randomGenerator.nextInt(max);

            boolean found = false;
            for (int i = 0; i < counter && !found; i++) {

                if (randomNumbers[i] == generated) {

                    found = true;

                }

            }

            if (!found) {

                randomNumbers[counter++] = generated;

            }

        }

        for (int i = 0; i < counter; i++) {

            System.out.printf("%03d ",randomNumbers[i] );

            if (i > 0 && (i+1) % 5 == 0) {

                System.out.println("");

            }

        }
    }
}

Code trace

1 Ответ

0 голосов
/ 15 декабря 2018

Эта строка является причиной, по которой:

randomNumbers[counter++] = generated;

Используя counter++, вы используете ++ постфиксный оператор приращения, который оценивается в значение counter, но затем увеличиваетсяэто на 1 после оценки.Эквивалентный код без использования этого оператора будет выглядеть примерно так:

randomNumbers[counter] = generated;
counter = counter + 1;

Таким образом, на первой итерации, где выполняется эта строка, randomNumbers[0] обновляется, но затем counter устанавливается в 1 (потому что 0 + 1 = 1).На второй итерации randomNumbers[1] обновляется, затем counter обновляется до 2 (потому что 1 + 1 = 2) ... и т. Д.

Подробнее об арифметических операторах можно найти здесь:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html

...