以下是否会调用未定义的行为?
int x;
int i = x;
来自C ++ 03的参考
(4.1 / 1)如果左值引用的对象不是T类型的对象 并且不是从T派生的类型的对象,或者如果对象是 未初始化,需要进行此转换的程序 未定义的行为。
修改 但是,从(3.3.1 / 1)开始,对象可以用自己的不确定值进行初始化,为什么呢?即。
int x = x; //not an undefined behaviour
答案 0 :(得分:6)
是的,因为您正在读取未初始化且未分配的变量(x
)的值。
答案 1 :(得分:1)
如果x
未初始化,则未定义,如您的引用中所述。
int x; // 0 initialized
int i = x;
int main() {
int z; // not initialized
int k = z; // UB
}
答案 2 :(得分:0)
唯一要记住的是这没关系:
static int x;
int j = x;
但你的例子不是。
答案 3 :(得分:-1)
它调用完美定义的行为。无论在堆栈上分配的垃圾值x是什么,都将按原样分配给i。
但是,根据您的编译器,您可能会收到有关引用未初始化变量的编译时警告。
答案 4 :(得分:-1)
int x = x; //不是未定义的行为
错误。