此代码是未定义行为吗?
具体是这个吗? “ while(Thing * x = getNext(x))”是因为标准中的规则而将x初始化为零,还是幸运吗?还是编译器正在这样做,但不应该依赖它吗?
#include <iostream>
struct Thing {
};
Thing* getNext(Thing* thing)
{
std::cout << "thing:" << thing << "\n";
return thing;
}
void test()
{
while (Thing* x = getNext(x))
{
}
}
答案 0 :(得分:1)
该程序通过访问未初始化变量的值表现出未定义的行为。如果您看到零被打印,那只是偶然。
答案 1 :(得分:1)
此未初始化的变量用法是否为未定义的行为
是的
读取不确定值的行为是不确定的。此代码副本使用尚未初始化的thing
来初始化参数x
,从而具有不确定的值,因此行为未定义。
此代码是未定义行为吗?
是的
具体是这个吗? “而(事物* x = getNext(x))”
是的,特别是有UB。
由于标准中的规则,将x初始化为零
不。在这种情况下,没有这样的规则可以说x
初始化为零。
是幸运的还是编译器仍在这样做但不应依赖它?
该行为是不确定的。如果是程序的行为使您得出结论:它可能是未定义的,则您可以认为自己很幸运。您可以通过启用编译器警告来改善运气:
warning: 'x' may be used uninitialized in this function [-Wmaybe-uninitialized]
答案 2 :(得分:0)
此代码是未定义的行为吗?
是的,因为您的程序正在访问未初始化的变量。
使用-Wall -Wextra
选项编译程序,您会发现编译器发出以下警告消息:
prg.cpp:17:31: warning: variable 'x' is uninitialized when used within its own initialization [-Wuninitialized]
while (Thing* x = getNext(x))