int a; std::cout << a; // 未定义的行为!
由于未初始化,因此导致未定义行为a。
通常,错误地声称这是因为该值是“不确定的”,或者是“该值之前在该内存位置中的任何值”。但是,a上述示例中访问的值的行为给出了未定义的行为。实际上,在这种情况下,打印“垃圾值”是一种常见症状,但这只是未定义行为的一种可能形式。
尽管实际上不太可能(因为它依赖于特定的硬件支持),但是编译器在编译上述代码示例时也可以很好地将程序员电化。有了这样的编译器和硬件支持,对未定义行为的这种响应将显着提高平均(活动的)程序员对未定义行为的真正含义的理解-这是标准对结果行为没有任何限制。
如果使用以下unsigned char类型的不确定值,则不会产生未定义的行为:
三元条件运算符的第二或第三操作数;
内置逗号运算符的正确操作数;
转换为的操作数unsigned char;
赋值运算符的右操作数(如果左操作数也为type)unsigned char;
unsigned char对象的初始化程序;
或者该值被丢弃。在这种情况下,如果适用,不确定的值会简单地传播到表达式的结果。
请注意,static变量始终为零初始化(如果可能):
static int a; std::cout << a; // 定义的行为,“ a”为0