Visual Studio生成“错误:未初始化的局部变量'x'”,而在线编译器不生成-为什么?

时间:2019-10-09 16:04:55

标签: c++ compiler-errors

int main() {
    int y, z, a, b, c;
    int x;
    double d;
    cout << "Enter Numbers! Enter -999 to Stop:\n";
    y = 0; z = 0; a = 0;
    b = 0; c = 0; d = 0;

while (x != -999) {

    cin >> x;

    if (x > 0) y++;
    if (x > 0) b += x;
    if (x == 0) z++;
    if (x < 0 && x != -999)a++;
    if (x < 0 && x != -999) c += x;



}
d = b * 1.0 / y * 1.0;
if (b == 0 || y == 0) {
    d = 0;
}

cout << "Total Positive Numbers are: " << y << endl;
cout << "Total Negative Numbers are: " << a << endl;
cout << "Total Zeros are: " << z << endl;
cout << "Sum of Positive Numbers is: " << b << endl;
cout << "Sum of Negative Numbers is: " << c << endl;
cout << "Average of Positive Numbers is: " << d * 1.0 << endl;
return 0;

}

Visual Studio编译器在第13行说其“使用了未初始化的局部变量'x'”。

但是,在其他在线编译器上没有问题。

2 个答案:

答案 0 :(得分:8)

Visual Studio在这里对您很友好:在C ++中,读取未初始化变量的行为是未定义,而(x != -999)是第一次遇到时未初始化的读取。

不要忽略其他编译器发出的警告。

答案 1 :(得分:1)

不需要读取未初始化的变量(您执行的操作)是编译器错误。该标准将其定义为具有“未定义的行为”。这基本上意味着允许编译器编译您的程序,但可以对程序的任何部分执行 ,因为它现在定义为具有明确定义的行为-所以任何都可以。

在C ++中,程序员最终有责任了解所有语言规则,并且从不编写任何可调用UB的内容< em>任何地方,并且不需要 编译器来帮助您/诊断错误,它可以假设您没有写任何UB,也没有写任何结果还是可以的。

在C ++中,没有安全网 /没有训练轮。

另请参阅:https://en.cppreference.com/w/cpp/language/ub