如何使用if语句测试某个变量是否已初始化。
谢谢大家。我不一定需要测试它是否已初始化。所以我收到了关于未初始化变量的解决方案和信息。
答案 0 :(得分:7)
无法知道本地非静态变量是否已初始化。但是,全局变量以及本地static
变量始终初始化(未显式初始化的全局和静态局部变量由编译器运行时系统进行零初始化)。
不必担心,总是初始化局部变量。
您可能希望了解std::once_flag
和std::call_once
。
答案 1 :(得分:3)
这是不可能的,但您可以将其设置为某个初始值,表示需要再次初始化。
答案 2 :(得分:3)
一般情况下,您不能使用未初始化的变量,这是不好的做法。
您可以使用以下内容:
int x = -1;
....
rest of your code
....
if( x == -1 )
{
}
在上面的示例中,假设在程序执行x
下永远不会设置为-1
。如果它是-1那么它是未初始化的。
答案 3 :(得分:1)
全局/静态零填充不能承受,简单的答案就是:
当您编写代码时,您会检测到“未初始化”的变量;不正在运行。
您至少似乎在尝试“检测”不确定值条件。假设函数或循环范围中的局部变量:
int a;
int b = a;
这个简单的小片段没有定义行为。问自己这段代码执行后b
是什么?你认为a
是什么?那么a
是什么?不知道?其他任何人都没有,这就是重点。它是不确定的,如果a
是不确定的,那么必须是b
。
一个更简单的例子:
int *p;
if (p) { do-something }
那么...... do-something
会执行吗?你肯定关于那个吗?
你可以通过总是在评估之前初始化变量来避免这种情况。如果您的代码可以评估某些内容而不进行设置,那么适当配置的合适编译器会向您发出警告,但您可以通过采取措施来避免它自己首先发现它。始终初始化变量。如果它们是C ++中的对象,则可以自行初始化,但对于没有默认构造的类型,您需要自己解决问题。在这个过程中,你永远不会遇到这个问题,你的代码将进一步走向成熟的道路。
答案 4 :(得分:0)
这不是直接可能的。
您可以使用唯一的“无效”值对其进行初始化(因此已初始化)。
-1
表示int
应包含正值。
nullptr
(或NULL
)表示应包含数据的指针。
另一种方法是使用其他数据来跟踪未初始化的值。
class A
{
public:
A() : hasBeenSet(false) {}
bool isInitialized() const { return hasBeenSet; }
void set(int value) { hasBeenSet = true; myInt = value; }
int get() const
{
if (!isInitialized()) {
throw std::runtime_error("Not initialized");
}
return myInt;
}
private:
bool hasBeenSet;
int myInt;
};