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。

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

4

7 回答 7

17

您使用后增量。那应该工作:

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

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

于 2009-01-31T12:43:45.640 回答
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
于 2009-01-31T12:52:47.183 回答
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 都会重置并返回相同的内容,从而导致您的无限循环。

于 2009-01-31T13:20:05.007 回答
3

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

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

... 甚至:

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

... ?

于 2009-01-31T12:48:25.430 回答
1

你应该使用

公共静态int next(int v){
        返回 v + 1;
}

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

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

于 2009-01-31T13:03:26.037 回答
1
public static int next(int v) {
        return ++v;
}

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

于 2009-01-31T12:48:34.523 回答
0

发布增量工作,但你会得到在数组中使用 '0' 值的异常 bcas。逻辑上 0/0 是不可能的,它是无限的,所以会发生异常,避免除以“0”值

于 2009-09-15T06:53:05.377 回答