如何检查变量是否已在C中初始化?

时间:2016-04-08 03:22:25

标签: c

有没有办法在C中检查变量是否已初始化?

考虑以下示例,

int main(){
    int a = 3, b = 7, c;

    if ( a > b )
        c = a-b;

    // Now, how can I check if the variable "c" has some value or not
    // I don't want check like this,
    // if ( isalpha(c) ) or if ( isdigit(c) )
    // or anything similar to like that
}

换句话说,C在defined中是否具有Perl之类的功能。在Perl中,我可以简单地执行if (defined c)来检查变量是否已定义,并且在上面的示例中它返回False。如何在C中实现相同的目标?

3 个答案:

答案 0 :(得分:60)

C没有这种能力。您有两个主要选择:

哨兵值

例如,如果您知道c的值永远不会为负数,那么请将其初始化为-1,并为此进行测试。

添加另一个变量

创建另一个变量bool we_set_c_to_something = false;,然后在您写信true时将其设置为c

答案 1 :(得分:11)

错误的问题。您不会询问变量是否已定义。如果未定义变量,则编译失败。查看"声明"之间的区别和"定义"。对于那些局部变量,您已经定义了变量c。

您正在寻找的是初始化。许多编译器会在变量初始化之前警告您使用变量,但如果您坚持运行该代码,那么假设您比编译器更清楚。在那一点上,这是你的问题。 :)有些语言(例如Perl)有一个额外的标志,随着一个变量一起传递,表明它是否已被初始化,并且他们向你隐瞒这个额外的旗帜悬挂在你周围或者可能不需要。如果你想在C中使用它,你需要自己编写代码。

由于C ++允许运算符重载,因此在C ++中实现它是相对容易的。 Boost提供了一个" 可选"这样做的模板,或者如果你想进行编码练习,你可以自己动手。 C虽然没有运算符重载的概念(地狱,这个概念并不存在,而且当时的编译器可能无法支持它)所以你得到的就是你得到的。

Perl是一个特例,因为它将两者结合在一起,但C不是。在C中完全可以使用已定义但未初始化的变量。事实上,在很多情况下,我们想要就是这种情况,特别是当您开始对驱动程序和类似内容进行低级别内存访问时。

答案 2 :(得分:10)

C是一种不支持运行时变量绑定的编译语言,而Perl是一种支持动态类型的解释语言。因此,您可以在Perl中检查变量的定义,但不能在C中检查。

当您在C int c;中声明变量时,此变量c已定义但未初始化。声明和定义在一个声明中。

代码编写器不检查C中变量的定义。编译器会为您完成。编译和链接C代码时,编译器将检查所有变量的定义。如果在代码中找到未定义的变量,将调用错误并停止编译或链接过程。

希望这能让你区分不同。