【问题标题】:"Variable may be uninitialized when used here" Xcode compiler warning“在此处使用时变量可能未初始化”Xcode 编译器警告
【发布时间】:2016-09-08 17:40:24
【问题描述】:

所以我写了这个小program 给出了这个警告,尽管我已经初始化了变量,而不是duplicate question

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        int num1, num2, product, largestProduct = 0;

        while (num2 < 1000) {

            while (num1 < 1000) {

                product = num1 * num2;

                if (isPalindrome(product)) {

                    largestProduct = product>largestProduct?product:largestProduct;
                }

                num1++;
            }

            num1 = 0; //If I delete that line the warning disappears.
            num2++;
        }

       NSLog(@"%i", largestProduct);

    }
    return 0;
}

奇怪的是,如果我删除该注释行,警告就会消失,如果我单独初始化 num1,它也会消失。我做错了什么还是 Xcode 中的错误?

【问题讨论】:

    标签: objective-c xcode compiler-warnings


    【解决方案1】:

    线

    int num1, num2, product, largestProduct = 0;
    

    仅将largestProduct 初始化为0。该行的其他变量均未显式初始化。

    在一行中声明多个变量可以说是一种糟糕的做法。

    我建议:

    int num1 = 0;
    int num2 = 0;
    int product = 0;
    int largestProduct = 0;
    

    这更容易阅读和调试。

    但如果你真的想要一行,那么:

    int num1 = 0, num2 = 0, product = 0, largestProduct = 0;
    

    【讨论】:

    • 是否有任何流行的语言允许单行初始化或者这是一般规则?原谅我的无知。
    • 我所描述的适用于所有基于 C 的语言,例如 C、C++ 和 Objective-C。我不会说任何其他语言。
    • 另一条评论。变量应尽可能晚地声明以限制其范围。 product 应该只在使用它的地方声明。到目前为止没有理由提前宣布。
    【解决方案2】:

    除了@rmaddy 的回答,您还可以将num1 = 0 行移到第二个while 循环上方。这样,当你实际使用变量num 时,它就会有一个显式的初始化值。

    int main(int argc, const char * argv[]) {
        @autoreleasepool {
    
            int num1, num2, product, largestProduct = 0;
    
            while (num2 < 1000) {
    
                num1 = 0; //Value initialised here.
    
                while (num1 < 1000) {
    
                    product = num1 * num2;
    
                    if (isPalindrome(product)) {
    
                        largestProduct = product>largestProduct?product:largestProduct;
                    }
    
                    num1++;
                }
    
                num2++;
            }
    
           NSLog(@"%i", largestProduct);
    
        }
        return 0;
    }
    

    【讨论】:

    • 这适用于num1,但它仍然使num2product 未初始化。
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    相关资源
    最近更新 更多