C++中的double类型初始化-默认值是什么?

6

我正在调试一些C++代码,发现有一个double类型的变量似乎没有被赋值。它是通过以下代码声明的:

double x;

我之前没有太多使用C或C++的经验,不确定double类型是否有默认值?也就是说,如果上面的声明中从未给出特定的值,则x会自动变成0还是null

代码中其他地方使用了x进行计算,计算结果应该显示给用户——但目前并没有显示。计算公式如下:

y * asin(sin(x / y) * sin(a * b));

如果x的默认值为0,那么这会导致编译或运行时出错吗?如果x的默认值为0,那么计算一定会返回0,并显示给用户看到0。


类型为 double x; 的声明不会为 x 分配默认值(默认值到底是什么?),如果声明在函数范围内!你必须自己写 double x = 0.0; - Raxvan
它是否在一些函数内部? - Yu Hao
2
@Raxvan:除非它是静态存储期 :-) - paxdiablo
2
http://en.cppreference.com/w/cpp/language/default_initialization - EdChum
为什么向用户显示0会导致运行时错误? - M.M
3个回答

13

这取决于变量的声明位置。

如果它被声明为全局变量,那么在main函数开始运行之前,它将会被初始化为零。

如果它被声明为函数内的非静态局部变量,那么它的值是不确定的(实际上,它将是变量所占用内存中的任意值,看起来毫无规律)。

使用未初始化(非静态)局部变量会导致未定义行为

如果声明为static局部变量,则在第一次调用该函数时也将被初始化为零。


如果它是一个类的成员呢? - athos
@athos 那就取决于包含对象的声明位置以及类对成员变量进行的初始化。 - Some programmer dude

7
如果没有指定初始化值,那么堆栈上的 double x 变量的值是未定义的。如果是全局变量,则会被设置为0。

2
零初始化在以下情况下执行:
1. 对于每个具有静态或线程本地存储期限的命名变量(自C++14以来不受常量初始化影响),在任何其他初始化之前。
2. 作为非类类型的值初始化序列的一部分,以及对于没有构造函数的值初始化类类型的成员,包括聚合体的元素的值初始化,其中未提供任何初始化程序。
3. 当使用太短的字符串字面量初始化任何字符类型的数组时,数组的其余部分将被零初始化。

https://en.cppreference.com/w/cpp/language/default_initialization

https://en.cppreference.com/w/cpp/language/zero_initialization

因此,在没有构造函数的类中,双重数据成员将被初始化为零。


1
仅当整个类被值初始化时才会出现。 - HolyBlackCat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接