[英]Why does the line “subsets.push_back(n);” give me an error in the following code?
[英]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,因为你没有用任何值初始化变量a和b 。 可能是你的编译器用0初始化a和b
下面的代码肯定会产生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.