初始化int和double变量
初始化int和double变量
我有以下的C++代码:
#includeusing namespace std; #include int main (int argc , char ** argv) { int i1; int i2; double d1; double d2; printf("i1: %d, i2: %d, d1: %f, d2: %f \n", i1, i2, d1, d2); }
输出结果为:
i1: 4195872, i2: 0, d1: 0.000000, d2: 0.000000
每次运行程序时都会得到相同的输出。现在假设我使用以下代码:
#includeusing namespace std; #include int main (int argc , char ** argv) { int i1; int i2; double d1; double d2; cout << "i1: " << i1; cout << " i2: " << i2; cout << " d1: " << d1; cout << " d2: " << d2; }
现在我得到以下输出:
i1: 4196144 i2: 0 d1: 6.95294e-310 d2: 0
当我重新运行程序时,d1的值会稍微改变,其他值保持不变。
为什么这些值会以这种方式初始化?为什么没有随机初始化或初始化为零?
undefined behavior是因为未初始化的变量会保存垃圾值。
如果在函数内定义的变量没有进行初始化,那么这个变量的值将保持未定义状态。这意味着该元素会取决于先前在内存中的位置上存储的任何值。
标准在哪里说到了这一点?这听起来不像是标准的措辞。
但是为什么我每次运行程序1000次时都得到相同的输出结果呢?
出现这个问题的原因是由于未初始化的变量会保持垃圾值,所以每次运行程序时,这些变量的值并不会改变,因此得到的输出结果也是相同的。
解决方法是在使用变量之前对其进行初始化,确保变量的初始值是确定的。这可以通过给变量赋予一个初始值或者使用构造函数进行初始化来实现。例如,对于int类型的变量,可以使用以下代码进行初始化:
int num = 0;
对于double类型的变量,可以使用以下代码进行初始化:
double num = 0.0;
通过对变量进行初始化,可以确保变量始终具有确定的值,避免了未定义行为的发生。
在C++中,非类类型的局部变量不会自动初始化。读取未初始化变量的值是未定义的行为。这意味着程序的输出是随机的,可能每次运行都会得到不同的结果。
然而,如果我运行程序1000次,每次都得到相同的输出... 这不算是真正的随机...为什么会这样?
这可能与您当前的操作系统版本、编译器版本、标准库版本、编译选项和月亮的相位一致。如果您更改其中任何一个,它可能开始给出不同的结果。未定义的行为是未定义的,不能依赖它进行任何操作。
解决这个问题的方法是在使用变量之前手动初始化它们。对于整型和双精度变量,可以将它们初始化为0或其他合适的值。例如:
int x = 0; double y = 0.0;
这样就可以确保变量始终有一个明确定义的初始值,避免了未定义行为的发生。
int和double变量的初始化问题
在C++中,当没有为基本类型和自动存储期的变量指定初始化值时,它们会被默认初始化,这意味着它们的值是不确定的。标准规定,读取不确定值的行为是未定义的,除非有一些特殊情况。
为什么没有进行随机初始化或初始化为零呢?这是因为标准没有规定这样做,编译器选择不这样做。随机初始化和零初始化都可能比不进行任何初始化更慢,所以这个选择似乎是合理的。
标准草案中明确规定了当获取具有自动或动态存储期的对象的存储空间时,该对象具有不确定值,并且如果没有对该对象进行初始化,该对象将保留不确定值,直到该值被替换。对于具有静态或线程存储期的对象,将进行零初始化。在特定情况下,产生不确定值的行为是被允许的,例如在条件表达式的第二个或第三个操作数中产生不确定值。
对于无符号窄字符类型的不确定值,如果是由条件表达式、逗号表达式的右操作数、类型转换或转换操作数产生的,那么操作的结果也是不确定值。如果在赋值操作符的右操作数中产生无符号窄字符类型的不确定值,那么该不确定值会替换掉左操作数所引用对象的值。当初始化无符号窄字符类型的对象时,如果初始化表达式产生不确定值,那么该对象将被初始化为不确定值。
需要注意的是,这些规定只适用于无符号窄字符类型,对于其他类型的变量,不进行初始化会产生未定义的行为。
至于为什么要使用无符号字符类型,可能是考虑到与C语言的兼容性。一般情况下,很难想象出有用的情况下会使用不确定值。
因此,当打印输出未初始化的变量时,其行为是未定义的。为什么每次运行程序输出都相同呢?这是因为行为是未定义的,没有明确的规定输出应该是什么样的。
总结起来,初始化int和double变量是一种良好的编程习惯,以避免产生未定义的行为。在使用未初始化的变量之前,应该先对其进行初始化。