Java,无限循环,增量

时间:2009-01-31 12:42:20

标签: java infinite-loop increment

在下面的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 ++,而while循环中i的值应该增加1。

为什么可能是无限循环的原因? 谢谢。

7 个答案:

答案 0 :(得分:17)

您使用帖子增量。 这应该有效:

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

所以基本上,你的例子中的下一个函数返回相同的数字,而不是递增一个。

答案 1 :(得分:9)

v ++的定义是:

Return the current value of v then add one to v

在您的情况下,v是方法参数,它是main中变量i的副本,因此该方法只返回传递给它的相同值。永远不会使用v中的递增值。

您可以使用++ v。其定义是:

Add one to v, then return the new value

答案 2 :(得分:5)

这里的区别在于后缀vs前缀运算符。

例如:

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 :(得分:3)

您是否有理由不使用更惯用且更易于阅读的内容:

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

......甚至:

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

......?

答案 4 :(得分:1)

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

不要忘记数组在Java中以索引0开头,而除以零则抛出异常。

答案 5 :(得分:1)

你应该使用

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

使用v ++是错误的,因为返回的值是增量前的v的原始值。

此外,在return语句中使用++ v或v ++是错误的样式,因为++具有修改v的副作用,并且表达式中不应存在任何副作用。副作用只能在他们自己的陈述中进行,以避免混淆和未定义的评价顺序。

答案 6 :(得分:0)

发布增量工作,但肯定会在数组中使用'0'值获得异常bcas。逻辑上0/0不可能是无限的,因此除非除以“0”值