使用未初始化的局部变量
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