我正在调试一些c ++代码,并且遇到了一个似乎永远不会被赋予价值的双重代码。它用行
声明double x;
之前没有使用过c或c ++,我不确定双打是否有默认的值?即鉴于上面的声明,如果x从未专门给出一个值,它会自动为0,还是为空?
X用于代码中其他地方的计算,计算结果意味着显示给用户 - 此时它不是......计算结果为:
y*asin(sin(x/y)*sin(a*b));
我认为如果x默认为0,这会导致编译/运行时错误?如果x默认为0,那么计算肯定会返回0,并且会向用户显示0吗?
答案 0 :(得分:9)
这取决于声明变量。
如果它被声明为全局变量,那么它将在main
开始运行之前进行零初始化。
如果它在函数内被声明为非静态局部变量,那么它的值是不确定的(实际上它将是变量占用的内存中的任何内容,它看起来是随机的)。
使用未初始化(非静态)局部变量会导致undefined behavior。
答案 1 :(得分:4)
如果没有指定初始化值,那么double x
的值如果在堆/堆栈上则是未定义的。如果它是全局变量,则将其设置为0.
答案 2 :(得分:0)
在以下情况下执行零初始化:
- 对于每个具有静态或线程本地存储持续时间的命名变量,在不进行任何其他初始化之前,不进行常量初始化(自C ++ 14起)。
- 作为非类类型和没有构造函数的值初始化类类型的成员的值初始化序列的一部分,包括不提供初始化程序的聚合元素的值初始化。
- 当任何字符类型的数组都使用太短的字符串文字初始化时,该数组的其余部分将被零初始化。
https://en.cppreference.com/w/cpp/language/default_initialization
https://en.cppreference.com/w/cpp/language/zero_initialization
因此没有构造函数的类中的双数据成员将被初始化为零。