有没有办法检查变量是否已在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
}
Run Code Online (Sandbox Code Playgroud)
换句话说,不C有像一些功能defined在Perl.在Perl,我可以简单地做if (defined c),这将检查变量是否被定义,并且它在上面的示例中返回False.如何在C中实现相同的目标?
Bil*_*nch 61
C没有这种能力.您有两个主要选择:
例如,如果您知道值c永远不会为负数,那么将其初始化为-1,并为此进行测试.
创建另一个变量bool we_set_c_to_something = false;,然后true在写入时将其设置为c.
Gra*_*ham 11
错误的问题.您不是在询问变量是否已定义.如果未定义变量,则编译失败.查看"声明"和"定义"之间的区别.在这些局部变量的情况下,您已定义变量c.
您正在寻找的是初始化.许多编译器会在初始化之前警告您使用变量,但如果您坚持运行该代码,那么假设您比编译器更清楚.在那一点上,这是你的问题.:)有些语言(例如Perl)有一个额外的标志,随着一个变量一起传递,表明它是否已被初始化,并且他们向你隐瞒这个额外的标志悬挂在你可能需要或不需要的地方.如果你想在C中使用它,你需要自己编写代码.
由于C++允许运算符重载,因此在C++中实现它相对容易.Boost提供了一个" 可选 "模板来完成它,或者如果你想进行编码练习,你可以自己动手.C虽然没有运算符重载的概念(地狱,这个概念并不存在,而且当时的编译器可能无法支持它)所以你得到的就是你得到的.
Perl是一个特例,因为它将两者结合在一起,但C却没有.在C中完全可以使用已定义但未初始化的变量.事实上,在很多情况下我们都希望如此,尤其是当您开始对驱动程序和类似内容进行低级别内存访问时.
ali*_*dro 10
C是一种不支持运行时变量绑定的编译语言,而Perl是一种支持动态类型的解释语言.因此,您可以在Perl中检查变量的定义,但不能在C中检查.
在C中声明变量时int c;,c会定义此变量但不进行初始化.声明和定义在一个声明中.
代码编写器不检查C中变量的定义.编译器会为您完成.编译和链接C代码时,编译器将检查所有变量的定义.如果在代码中找到未定义的变量,将调用错误并停止编译或链接过程.
希望这会让你区分不同之处.