Java - справка по циклу do, требующая объяснения - PullRequest
1 голос
/ 29 декабря 2011

Почему следующий код выполняется шесть раз?Пожалуйста, помогите мне понять, как это работает, поскольку я пытался заполучить его в мою голову безуспешно.

Я думал, что сначала он выполнит код один раз , а затем увеличит счет до 1 , выполнить его во второй раз , увеличить счет до 2 , выполнить его в третий раз , увеличить счет до 3 , выполните его в четвертый раз , увеличьте счет до 4 , выполните его в пятый раз , увеличьте счет до 5, а затем остановитесь.Это означает, что он выполнил цикл пять раз (впервые, а затем, когда счетчик равен 1, 2, 3, 4).

int count = 0;

    do {

        System.out.println("Welcome to Java!");

    } while (count++ < 5);

Ответы [ 4 ]

2 голосов
/ 29 декабря 2011

Вы пытались запустить этот код ?

int count = 0;

do {

    System.out.println("Welcome to Java! " + count);

} while (count++ < 5);

вывод:

Welcome to Java! 0
Welcome to Java! 1
Welcome to Java! 2
Welcome to Java! 3
Welcome to Java! 4
Welcome to Java! 5

Это должно помочь вам понять, что происходит.Говорили ли другие, что ваша путаница, скорее всего, связана с тем, как работает оператор постинкрементной обработки.

Чтобы помочь вам понять операторы до и после приращения, давайте запустим другой пример кода

int a = 0;
int b = 0;
System.out.println("pre increment "+ ++a);
System.out.println("post increment "+ b++);

output:

pre increment 1
post increment 0

Подведение итогов: с постинкрементным выражением выражение оценивается до , переменная увеличивается, с предварительным инкрементом выражение оценивается после , переменная увеличивается.

1 голос
/ 29 декабря 2011

Это потому, что вы используете постинкремент. Сначала оценивается условие while (со значением count от ДО приращения), а затем count увеличивается.

Попробуйте ++count (который сначала увеличивает, а затем возвращает значение).

редактирование:

Обратите внимание, что хотя он используется в

for(int i = 0; i < n; i++) {}

в порядке (обычно оптимизируется и т. Д.),

for(int i = 0; i < n; ++i) {}

немного лучше с семантической точки зрения IMO.

Это становится еще сложнее в языках с перегрузкой операторов, где i ++ может иметь другие побочные эффекты, чем ++ i.

1 голос
/ 29 декабря 2011

Его постфиксный оператор, поэтому сначала выполняется оценка всего выражения, а затем увеличивается

Управление будет проходить так

0
Welcome to Java!
//condition check : 0 then 1
Welcome to Java!
//condition check : 1 then 2
Welcome to Java!
//condition check : 2 then 3
Welcome to Java!
//condition check : 3 then 4
Welcome to Java!
//condition check : 4 then 5
Welcome to Java!
//condition check : 5 then 6
0 голосов
/ 29 декабря 2011
count++; // <-- would execute the above code 6 times

- постинкремент, а

++count; // <-- would execute the above code 5 times 

- предварительное увеличение

Рассмотрим:

while (count++ < 5) System.out.println(count); // prints 1 2 3 4 5
while (++count < 5) System.out.println(count); // prints 1 2 3 4

Таким образом, ваш do...while сначала выполняется без сравнения (из-за do), а затем запускает сравнение.

Если это предварительное увеличение, его можно переписать так:

int count = 0;
do {
    // print
    count = count + 1;
} while (count < 5)

Если это постинкремент, его можно переписать так:

int count = 0;
while (count < 5) {
     // print statement
     count = count + 1;
}
...