C++ 奇怪的自动初始化行为
我了解到自动变量不是初始化为零的。因此,以下代码将正确运行并在屏幕上打印随机数:C++ 奇怪的自动初始化行为,c++,C++,我了解到自动变量不是初始化为零的。因此,以下代码将正确运行并在屏幕上打印随机数: #include <iostream> using std::cout; using std::endl; void doSomething() { int i; cout << i << endl; } int main() { doSomething(); } 有人知道为什么这里“j”和“i”突然被初始化为零吗?使用未初始化的变量是未定义的行为。很可能在另一
#include <iostream>
using std::cout;
using std::endl;
void doSomething()
{
int i;
cout << i << endl;
}
int main()
{
doSomething();
}
有人知道为什么这里“j”和“i”突然被初始化为零吗?使用未初始化的变量是未定义的行为。很可能在另一个编译器上不会得到相同的行为。唯一的“为什么”在源代码中找到特定的C++编译器。p> 如果为对象指定了初始值设定项,则该初始值设定项将确定对象的初始值。如果未指定初始值设定项,则将全局(§4.9.4)、命名空间(§8.2)或局部静态对象(§7.1.2、§10.2.4)(统称为静态对象)初始化为适当类型的0 例如:
// Global scope
int a; // means ‘‘int a = 0 ;’’
double d; // means ‘‘double d = 0.0;’’
void f()
{
int x; // x does not have a well defined value
// ...
}
默认情况下,本地变量(有时称为自动对象)和在空闲存储上创建的对象(有时称为动态对象或堆对象)不会初始化
例如:
// Global scope
int a; // means ‘‘int a = 0 ;’’
double d; // means ‘‘double d = 0.0;’’
void f()
{
int x; // x does not have a well defined value
// ...
}
< Stroustrup >,C++编程语言,第三版,P.83-π4.95你对0号赋予特殊意义-它仍然未定义,恰好是0!呃。。。我不知道你是不是在比赛,但恰恰相反---编辑---好的,你编辑了,现在它是正确的。对不起,我的记忆有时像筛子,现在更正了。我知道,我花了整整两分钟才查到。好吧,这就是你想要的。我冒昧地向您的第一个示例添加了一个“//Global scope”注释,这是真的!我尝试了一台不同的机器,代码的行为是正确的。但是,它是一个错误的答案,但是StruouTUP是按照C++标准的第8.5节(ISO-IEC 1488—2003),实际上,“为什么”与编译器几乎没有关系。该值通常是以前执行的任何操作留下的值,或者是新分配内存时操作系统放在那里的值(出于安全原因,后者通常为零)。@Mike:即使每次打印出
0
,函数也会“正确”运行。你不能指望这个数字是“随机的”。@ufotds:嗯?第8.5节讨论了声明者和初始化者。引用的代码没有初始值设定项。因此,没有定义的行为,除非标准比我想象的更神秘!这是无法排除的@迈克:比尔是对的。您的代码没有正确的行为@Jerry:当然O/S很重要,但我得说编译器发出的确切代码几乎是首先要检查的因素。将编译器标志设置为始终为零或0xDEADBEEF存储,f'rinstance。