默认值C ++ 11,编译器到编译器

时间:2013-07-27 19:34:09

标签: c++ c++11 default-value

问题1:

如何判断变量的默认值?那是(如果我的词汇是错误的)变量在分配之前的值?

问题2:

编译器之间有何不同?

问题3:

有更好的默认值吗?

问题4:

最后,这条规则还有其他例外吗?

示例代码:

bool foolean;
int fintoo;
double fooble;
char charafoo;

默认编译器对编译器有什么作用?

2 个答案:

答案 0 :(得分:8)

在所有版本的C ++中,如果在命名空间范围内声明了问题中的所有变量,那么它们将被零初始化(静态)。在所有其他情况下,如果未初始化,它们将具有垃圾值。

请注意,垃圾值是位于定义变量的内存位置的任何内容 - 它只是0和1的模式。 您的程序不应该读取这些值,否则您的代码将调用未定义的行为

在C ++ 11中,如果将它们写为局部变量(或命名空间变量):

bool foolean {};
int fintoo {};
double fooble {};
char charafoo {};

他们默认初始化,在这种情况下意味着零(因为它们是内置类型)。

答案 1 :(得分:1)

如果变量是自动的(即函数本地的非static变量或其成员),则没有默认值。从实际的角度来看,变量是在堆栈上分配的,堆栈上的内容(可能是前一个函数调用的剩余部分)将成为变量的值。

此外,一些编译器添加代码以在调试模式下将堆栈帧初始化为众所周知的值。这使您可以轻松地看到变量在调试时尚未初始化。

如果变量是静态的(在命名空间作用域中声明,或在函数中使用static关键字),则默认值为零。