繁体   English   中英

为什么下面的代码给我 0 作为输出

[英]Why does the following code give me 0 as the output

#include <iostream>
#include <iomanip>

using namespace std;

int main() 
{
        float a;

        float b;
        float avg;

        avg = ((3.5 * a) + (7.5 * b))/(3.5 + 7.5);

        cout <<"AVG = ";
        std::cout << std::fixed << std::setprecision(5) << avg << endl;


        return 0;
}

使用未初始化的局部变量会显示未定义的行为(UB),并且对未定义的行为没有适当的解释

它给出0.00000,因为你没有用任何值初始化变量ab 可能是你的编译器用0初始化ab

下面的代码肯定会产生0

#include <iostream>
#include <iomanip>

using namespace std;

float a;
float b;
float avg;

int main()
{
    avg = ((3.5 * a) + (7.5 * b)) / (3.5 + 7.5);

    cout << "AVG = ";
    std::cout << std::fixed << std::setprecision(5) << avg << endl;
    
    return 0;
}

因为float类型的全局变量被编译器初始化为零。

但是您的原始代码段是不正确的,因为在操作之前没有初始化变量——仅仅因为编译器不应该初始化这样的局部变量。 标准称之为“未定义行为”,一些编译器发现它是错误的(例如 Visual Studio C++ 编译器):

错误 2 错误 C4700:未初始化的局部变量“a”使用了 source.cpp 15

错误 3 错误 C4700:未初始化的局部变量“b”使用了 source.cpp 15

其中第 15 行是avg = ((3.5 * a) + (7.5 * b)) / (3.5 + 7.5);

所以基本上这是一个编译器特定的东西。 您的编译器似乎正在将变量 a 和 b 初始化为 0。理想情况下,您应该在编译代码时看到警告,说明 a 和 b 在函数 main 中未初始化。 如果您尝试使用不同的编译器,它可能不会将其分配为零,但您应该获得剩余的任何值。

它是 0,因为变量未初始化。 然后它会产生未定义的行为。

如果您不知道什么是未定义的行为,总而言之,它只是成功构建的东西,但可执行文件没有按应有的方式运行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM