为什么变量初始化是多余的?

时间:2016-02-13 18:35:49

标签: java

我已经在UVa Online Judge上解决了一个3 * N + 1问题(100),但这是我不明白的一件事,但它与Java有关,我想,不是算法本身。所以这是代码:

private static int maxCycleLength(int lo, int hi) {
        maxLength = 0;
        int n = 0;
        int length = 0;

    for (int i = lo; i <= hi; i++) {
        // It's the first time we're computing the cycle length for n
        if (lengths[i] == 0) {
            n = i;
            length = 1;
            while (n != 1) {
                if ((n % 2) == 0) {
                    n = n >> 1;
                    length++;
                }
                else {
                    n = 3 * n + 1;
                    n = n >> 1;
                    length += 2;
                }
            }
            lengths[i] = length;
        }
        // Otherwise we just look it up
        else
            length = lengths[i];

        // Check if the current cycle length is the maximum
        if (length > maxLength)
            maxLength = length;
    }
    return maxLength;

我不明白的地方:我的IDE(IDEA)告诉我,在这段代码中,变量nlength的初始化是多余的,但是, maxLength必须初始化,如果我不这样做,它就不会编译。

为什么这样? maxLengthn

length有什么不同?

2 个答案:

答案 0 :(得分:2)

在所有代码路径上,在尝试从中读取值之前,先初始化nlength。无论发生什么,最初分配给它们的值都不会被使用,因为在您需要之前,您将用其他内容覆盖它。

maxLength虽然在您为其分配新值之前,在进行length > maxLength比较时,或在return中,如果for循环是跳过。由于它在第一遍中没有值,你需要给它一个起始值来使用。

答案 1 :(得分:1)

maxLength不同,因为它的值在for循环之外使用。如果从未输入for循环,则永远不会初始化maxLength(如果在开始时删除初始化),则return语句将变为无效。

其他两个变量(nlength)保证在访问之前分配,即使在删除初始初始化之后也是如此。它们不在for循环外访问,而在for循环内,ifelse子句都是从初始化length开始的。 n仅由if cluase初始化,但只能在该子句中访问。