Java, бесконечный цикл while, приращение - PullRequest
3 голосов
/ 31 января 2009

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

public class Time {

    public static int next(int v) {
        return v++;
    }

    public static void main(String[] args) {

        int[] z = {3, 2, 1, 0};

        int i = 1;

        while(i < 4) {
            System.out.println(z[i]/z[i]);
            i = next(i);
        }
    }
}

В цикле while вызывается метод next (), и я должен каждый раз увеличиваться на 1: next () должен возвращать i ++, а значение i в цикле while должно увеличиваться на единицу.

Почему может быть причина бесконечного цикла? Спасибо.

Ответы [ 7 ]

17 голосов
/ 31 января 2009

Вы используете пост увеличение. Это должно работать:

public static int next(int v) {
        return v+1; //or ++v
    }

Таким образом, ваша следующая функция в вашем примере возвращает тот же номер, а не инкрементный.

9 голосов
/ 31 января 2009

Определение для v ++:

Return the current value of v then add one to v

В вашем случае v - это параметр метода, который является копией переменной i в main, поэтому метод просто возвращает то же значение, которое было ему передано. Увеличенное значение в v никогда не используется.

Вы могли бы использовать ++ v. Определение этого:

Add one to v, then return the new value
5 голосов
/ 31 января 2009

Разница здесь в постфиксных и префиксных операторах.

например:

int a = 1;
int b = a++; // sets b to to 1 THEN increments a.

// a now equals 2.

int c = ++a; // increments a THEN stores the value in c, c = 3.

вызов метода, который возвращает int ++, не будет делать то, что вы ожидаете. Это не то же самое, что иметь это:

while (expression) {
// code...
intValue++;
}

, поскольку в приведенном выше блоке кода приращение не передается в отдельную переменную, и полное приращение значения будет происходить до выхода из блока кода, постфикса или префикса.

public static int someMethod(int n) {
return n++;  
}

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

3 голосов
/ 31 января 2009

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

for(int i = 0; i < 4; i++){
    System.out.println(z[i]/z[i]);
}

... или даже:

for(int x : z){
    System.out.println(x / x);
}

...?

1 голос
/ 31 января 2009

Вы должны использовать

public static int next(int v) {
        return v + 1;
}

Использование v ++ некорректно, поскольку возвращаемое значение является исходным значением v до приращения.

Более того, использование ++ v или v ++ в выражении return - это плохой стиль, потому что ++ имеет побочный эффект изменения v, и в выражениях не должно быть никаких побочных эффектов. Побочные эффекты следует делать только в собственных утверждениях, чтобы избежать путаницы и неопределенного порядка оценки.

1 голос
/ 31 января 2009
public static int next(int v) {
        return ++v;
}

Не забывайте, что массивы начинаются с индекса ноль в Java, а деление на ноль вызывает исключение.

0 голосов
/ 15 сентября 2009

постинкрементная работа, которая, конечно, но вы получите исключительную возможность использования значения '0' в массиве. логически 0/0 невозможно, его бесконечно, поэтому возможны исключения, избегайте деления на значение «0»

...