Java,无限while循环,递增

3
在下面这个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() 方法,每次都应该将 i 增加 1:next() 应该返回 i++,而在 while 循环中 i 的值也应该增加一。如果出现无限循环的情况,可能的原因是什么呢?谢谢。

1
当i = 3时要注意除零错误。 - Amarghosh
7个回答

17

您使用了后置递增运算符。 那应该可以工作:

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

基本上,你在示例中的next函数返回相同的数字,而不是递增一个数。


i++ 是后增量,++i 是前增量。他/她已经使用了后增量,这就是错误的原因。 - Barış Akkurt

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

对于加分题:在执行“i = i++;”之后,i的值是多少? - Michael Myers
凭我的直觉,我认为官方答案是“undefined”。但是我不会冒险去尝试。 - Adrian Pronk
刚刚测试过了,没有变化(在ActionScript中)。 - Amarghosh

5
这里的区别在于后缀和前缀运算符。
例如:
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

你不使用更习惯和易于阅读的方式有原因吗:

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

甚至更多:

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

... ?


for(int x : z) {...} 不是合法的Java语法。 - Darron
@Darron,是的 - 这是Java 5中引入的增强for循环。 - Dan Dyer

1

应该使用

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

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

此外,在返回语句中使用++v或v++是不好的风格,因为++具有修改v的副作用,在表达式中不应存在任何副作用。副作用只应在它们自己的语句中完成,以避免混淆和未定义的评估顺序。


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

在Java中,不要忘记数组从索引零开始,并且除以零会抛出异常。


0

后置递增运算符是有效的,但如果在数组中使用“0”值,则会出现异常。从逻辑上讲,0/0是不可能的,它是无限的,因此避免除以“0”值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接