当前位置:  开发笔记 > 编程语言 > 正文

NULL总是假吗?

如何解决《NULL总是假吗?》经验,为你挑选了5个好方法。

假设NULL在C 中始终转换为false 是否安全?

void *somePtr = NULL;

if (!somePtr) {
  /* This will always be executed? */
}

或者应该明确检查价值NULL



1> tvanfosson..:

是.NULL的计算结果为false,因为C认为任何非零值为true,任何零值为false.NULL本质上是zero地址,并且在比较中被视为这样,我相信将被提升为布尔检查的int.我希望你的代码对任何熟悉C的人都是可读的,尽管我可能会明确地进行检查.

在C和C++编程中,两个空指针保证比较相等; ANSI C保证在与整数类型进行比较时,任何空指针都将等于0; 此外,宏NULL被定义为空指针常量,即值0(作为整数类型或转换为指向void的指针),因此空指针将比较等于NULL.

参考:http://en.wikipedia.org/wiki/Null_pointer#Null_pointer


在某些情况下,显式检查可能更清楚,但这是C语言,该语言保证有效.:)
你不要转换为int.你将0与指针进行比较.0是空指针常量.如果将空指针常量与指针进行比较,则空指针常量将成为正确类型的空指针.并且空指针比较不等于每个有效指针.这就是他想要的
如果所有我的c代码使用那些如果东西现在无效,我会哭

2> akatakritos..:

假设什么都不安全.

对您正在测试的内容进行明确检查也更清楚.


+1显式总是优于隐式.

3> Hans Passant..:

'C'语言可以追溯到一个时代,其中(void*)0实际上可以是一个有效的指针.不久之前,8080和Z80微处理器在地址0处有一个中断向量.面对这样的架构选择,除了让头文件声明NULL值之外,它什么也做不了.那里有一些编译器,现在很久就被遗忘了,其中NULL不等于(void*)0(0xffff是下一个选择),因此给出了if()语句未定义的行为.

C++仁慈地结束了这一点,空指针可以从0分配和测试.


C99保证将0强制转换为指针类型也将是空指针-我从不费心阅读以前的标准,所以不知道何时发生这种情况...

4> Captain Segf..:

是的(至少对于任何符合标准的C编译器!)

从comp.lang.c FAQ:

问:用于测试非空指针的缩写指针比较``if(p)''是否有效?如果空指针的内部表示非零,该怎么办?

答:它总是有效的.



5> Ralph..:

我的ISO / IEC 9899:TC3(委员会草案,2007年9月7日)副本:

6.3转换

1一些运算符会自动将操作数值从一种类型转换为另一种类型。

6.3.2.3指针

3值为0 [...]的整数常量表达式称为空指针常量。如果将空指针常量转换为指针类型,则保证生成的指针(称为空指针)将不相等的值与指向任何对象或函数的指针进行比较。

到目前为止,ptr!=0对于每个非null来说都是true(1)ptr,但是它仍然是开放的,如何比较两个null指针。

6.5.9平等经营者

5 [...]如果一个操作数是一个指针,另一个是空指针常量,则将空指针常量转换为指针的类型。

6当且仅当两个都是空指针,并且两个都是[...]时,两个指针比较相等

因此,当且仅当为空指针时,它ptr==0是1(并且ptr!=0是0)ptr

6.5.3.3一元算术运算符

5逻辑求反运算符的结果!如果其操作数的值比较不等于0,则为0;如果其操作数的值比较等于0,则为1。结果的类型为int。表达式!E等效于(0 == E)。

因此对!ptr

6.8.4.1 if语句

1 if语句的控制表达式应具有标量类型。

2在这两种形式中,如果表达式比较不等于0,则执行第一个子语句。

注意,标量类型算术类型指针类型(请参见“ 6.2.5类型”的第21节)。放在一起,我们有:

if (ptr)成功了吗?ptr!=0是1吗?ptr不是空指针。

if (!ptr)成功了吗?ptr==0是1吗?ptr是一个空指针。

推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有