使用未初始化的局部变量

int a;
std::cout << a; // Undefined behavior!

这会导致未定义的行为,因为 a 未初始化。

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

虽然在实践中极不可能(因为它依赖于特定的硬件支持),编译器在编译上面的代码示例时同样可以很好地电子编程程序员。有了这样的编译器和硬件支持,对未定义行为的这种响应将显着增加平均(生活)程序员对未定义行为的真实含义的理解 - 这是标准对结果行为没有约束。

Version >= C++ 14

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

  • 三元条件运算符的第二个或第三个操作数;
  • 内置逗号运算符的右操作数;
  • 转换为 unsigned char 的操作数;
  • 如果左操作数也是 unsigned char 类型,则为赋值运算符的右操作数;
  • unsigned char 对象的初始值设定项;

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

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

static int a;
std::cout << a; // Defined behavior, 'a' is 0