【问题标题】:Java, infinite while loop, incrementationJava,无限while循环,增量
【发布时间】:2009-01-31 12:42:20
【问题描述】:

在下面的 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。

p>

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

【问题讨论】:

  • 当 i = 3 时注意除以零。

标签: java infinite-loop increment


【解决方案1】:

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

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

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

【讨论】:

  • i++ 是后增量,++i 是前增量。他/她已经在使用后增量,这是错误的原因。
【解决方案2】:

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的值是多少?
  • 在我脑海中,我相信官方的答案是“未定义”。但我不会急于尝试。
  • 刚刚测试并且没有改变(在 actionscript 中)。
【解决方案3】:

这里的区别是后缀和前缀运算符。

例如:

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 都会重置并返回相同的内容,从而导致您的无限循环。

【讨论】:

    【解决方案4】:

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

    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,是的,它是 Java 5 中引入的增强型 for 循环。
    【解决方案5】:
    public static int next(int v) {
            return ++v;
    }
    

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

    【讨论】:

      【解决方案6】:

      你应该使用

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

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2013-02-16
          • 2015-02-12
          • 2014-03-29
          • 1970-01-01
          • 2015-06-25
          • 2013-10-08
          • 1970-01-01
          • 2015-10-10
          • 1970-01-01
          相关资源
          最近更新 更多