Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 奇怪的自动初始化行为_C++ - Fatal编程技术网

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。