有没有办法在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中实现相同的目标?
答案 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代码时,编译器将检查所有变量的定义。如果在代码中找到未定义的变量,将调用错误并停止编译或链接过程。
希望这能让你区分不同。