问题描述
我正在使用教程点的codingground 编译器上的 floor() 函数测试脚本。 我从这个简单的脚本开始:
#include <iostream>
#include <cmath>
using namespace std;
/* Including std namespace since I am not including any other namespaces. */
int main() {
double var1 = 3.393,var2;
cout << var1 << “ “ << var2;
return 0;
}
结果:3.393 0。
但是,当我将 floor()
添加到 var1 时,var2 更改为 6.95329e-310。
这是否有原因,要么是编译器特有的,要么是我做错了什么?
资源:http://tpcg.io/SkgxtNCa
解决方法
var2
未初始化,它是一个最终在堆栈上的局部变量。
当您调用函数时,堆栈用于保存返回地址以及该函数的局部变量。当你不初始化一个变量时,它会得到那个地方的堆栈中剩下的最后一个值。有些编译器的行为可能有所不同,有些编译器具有用于初始化的标志。我猜你使用的那个不会这样做,你最终会从堆栈中得到一个随机结果,调用 floor 可能改变了这一点。
只需更改代码以初始化变量
double var1 = 3.393,var2 = 0.0;
下面的评论指出它并不总是在堆栈上,这也是正确的。大多数实现使用堆栈,但根据平台/编译器的不同,它可能有很多东西。最重要的是在非托管语言中初始化变量,如 c、c++、pascal、汇编(这些是我多年来一直使用的那些),因为除非你将它们配置为这样做,否则它们不会为你做。