C:与NULL的比较

And*_*NER 23 c comparison performance null

除了宗教论点:

在C中,option1在功能上等同于option2吗?

由于没有比较,后者会更快解决吗?

Las*_*lan 33

我更喜欢显式样式(第一版).很明显,有一个指针涉及,而不是一个整数或其他东西,但它只是一个风格的问题.

从性能的角度来看,它应该没有区别.


Nor*_*sey 31

当量.它在语言标准中这样说.人们有最恶劣的宗教偏好!

  • 这个词应该是最难的吗? (2认同)

jal*_*alf 19

假设编译器编写者至少具有最低智能度通常很有用.你的编译器不是由混杂的小鸭子编写的.它由人类编写,具有多年的编程经验,并且花了数年时间研究编译器理论.这并不意味着您的编译器是完美的,并且总是最了解,但它确实意味着它完全能够处理琐碎的自动优化.

如果这两种形式是等价的,那么为什么编译器不会只将一种形式翻译成另一种形式以确保两者同样有效?

如果if (pointer[i] == NULL)比较慢if (!pointer[i]),编译器是否只会将其更改为第二种更有效的形式?

所以不,假设它们是等价的,它们同样有效.

至于问题的第一部分,是的,它们是等价的.语言标准实际上明确指出了这一点 - 如果指针是非NULL,则指针求值为true;如果指针为NULL,则求值为false,因此两者完全相同.

  • 事实上,我认为确实如此.如果你觉得被它冒犯,我很抱歉.我不是要攻击任何人,只是指出,如果你停下来思考它,这应该完全彻底地显而易见.如果两个琐碎的语言构造意味着相同的东西,那么它们将以相同的方式编译.如果你想谈论屈尊俯就,你怎么样更好?您假设初学者在大约30秒内能够比编写编译器的经验丰富的开发人员执行更好的优化.这对我来说似乎很粗鲁.;) (8认同)
  • @jalf:如果你从来没有使用过积累的*drunk*ducklings编写的编译器,你就不可能长时间编写软件;-)幸运的是,自然选择已经处理了大部分这些恐怖故事 - 但我希望还有一些人还在......更重要的是:编译器编写者不是神 - 他们像我们其他人一样容易犯错,而且错误的代码仍然可以编写.示例:我最近一直在处理c ++编译器/ rtl,其中测量const字符串的长度每次都会调用复制构造函数... (8认同)

Tho*_*mas 18

我喜欢第二个,其他人喜欢第一个.

实际上,我更喜欢第三种:

if (NULL == ptr) {
   ...
}
Run Code Online (Sandbox Code Playgroud)

因为那时我:

  • 将无法错过并只输入一个"="
  • 如果条件很长(多行),将不会错过"== NULL"并将其误认为相反

在功能上它们是等价的.

即使NULL指针不是"0"(全零位),if (!ptr)也要与NULL指针进行比较.

以下是不正确的.它仍然存在,因为有许多注释引用它: 不要将指针与文字零比较.它几乎可以在任何地方工作,但是未定义的行为IIRC.

  • 托马斯,请参阅http://c-faq.com/null/ptrtest.html.将指针与文字0进行比较是完全安全的. (7认同)
  • @dreamlax:来自C99标准6.3.2.3:"一个值为0的整型常量表达式,或者这样的表达式转换为void*类型,被称为空指针常量.55)如果将空指针常量转换为指针类型,结果指针,称为空指针,保证比较不等于指向任何对象或函数的指针." 基本上说"在指针上下文中使用的0**是**NULL". (3认同)
  • "不要将指针与字面零点进行比较.它几乎可以在任何地方工作,但是未定义的行为IIRC." < - 没错.是什么让你说它是未定义的行为? (2认同)
  • 但是,NULL是#defined为0.因此,如果你要比较NULL,那么就编译器而言,你要比较0,因为编译器不会处理你输入的内容,而是预处理器的输出和预处理器将NULL替换为0.因此,在(void*)0处可能存在某些有效的事实是无关紧要的.在编译器看到之前,NULL将被替换为0. (2认同)
  • @Dreamlax你是血腥的错.您混淆了空指针值和空指针常量.当定义为0时,NULL始终有效.当然,将其定义为0xFFFF永远不会有效.NULL是一个空指针常量.作为异常`(void*)0`也是在C中.当转换为指针类型时,它变为空指针值.这是当它成为指向某个地址不等于0x0的指针时.但这与将指针比较为0无关.这与地址0不相比.整数不是地址. (2认同)

Bar*_*lly 9

几乎可以肯定没有性能差异.不过,我更喜欢第二种隐含的风格.