C++ 使用未初始化的局部变量

示例

int a;
std::cout << a; // 未定义的行为!

由于未初始化,因此导致未定义行为a。

通常,错误地声称这是因为该值是“不确定的”,或者是“该值之前在该内存位置中的任何值”。但是,a上述示例中访问的值的行为给出了未定义的行为。实际上,在这种情况下,打印“垃圾值”是一种常见症状,但这只是未定义行为的一种可能形式。

尽管实际上不太可能(因为它依赖于特定的硬件支持),但是编译器在编译上述代码示例时也可以很好地将程序员电化。有了这样的编译器和硬件支持,对未定义行为的这种响应将显着提高平均(活动的)程序员对未定义行为的真正含义的理解-这是标准对结果行为没有任何限制。

C ++ 14

如果使用以下unsigned char类型的不确定值,则不会产生未定义的行为:

  • 三元条件运算符的第二或第三操作数;

  • 内置逗号运算符的正确操作数;

  • 转换为的操作数unsigned char;

  • 赋值运算符的右操作数(如果左操作数也为type)unsigned char;

  • unsigned char对象的初始化程序;

或者该值被丢弃。在这种情况下,如果适用,不确定的值会简单地传播到表达式的结果。

请注意,static变量始终为零初始化(如果可能):

static int a;
std::cout << a; // 定义的行为,“ a”为0