Cry*_*tal 15 c iphone objective-c
如果你有像NSString*someString这样的对象,那么它们之间有什么区别(如果有的话)
if (!someString)
Run Code Online (Sandbox Code Playgroud)
VS
if (someString == nil)
Run Code Online (Sandbox Code Playgroud)
谢谢!
ser*_*gio 23
您使用的第一个语法:
if (!someString)
Run Code Online (Sandbox Code Playgroud)
利用C的一种"模糊性",这是因为C的原始标准缺乏适当的布尔类型.因此,任何等于0的整数值被解释为"假",并且任何不同于"0"的整数值被视为"真".!因此,基于此约定来定义其含义,并且C标准的当前版本保持了原始的兼容性定义.
在您的特定情况下,someString是一个指针,因此它首先被转换为一个整数,然后! someString被解释为true当该someString点位置时的bool值0x000000,否则它将变为"true".
这在大多数情况下都很好(我会说总是如此),但从理论上讲,NULL/nil 可能与0x000000某些编译器不同,所以(在非常理论上)最好使用第二种语法,这更明确:
if (someString == nil)
Run Code Online (Sandbox Code Playgroud)
无论如何它更具可读性,因为someString它不是整数(而不是指针),IMO,一般来说是更好的实践.
编辑:关于NULL的定义...
C标准是否将NULL定义为0对我来说是一个有趣的话题......
根据C99标准,第7.17节"通用定义":
NULL [which]扩展为实现定义的空指针常量;
因此,NULL在stddef.h中定义为实现定义的空指针常量 ......第47页的相同文档指出:
值为0的整型常量表达式或类型为void*的表达式称为空指针常量.55)如果将空指针常量转换为指针类型,则生成的指针(称为空指针)为保证比较不等于指向任何对象或函数的指针.
因此,空指针常量(即(void*)0)可以转换为空指针,并保证比较不等于指向任何对象或函数的指针.
所以,我觉得基本上这取决于是否执行决定转换的结果,空指针常量到一个空指针产生一个指针,它转换回整数给出0目前尚不清楚的是一个空指针解释为一个整数等于0.
我会说标准真的尝试并强制将空指针设为0,但是对空指针不为0的系统保持开放.
对于大多数指针来说,它们是等价的,尽管我知道的大多数编码器更喜欢前者,因为它更简洁.
对于弱链接符号,前者解析符号(并且如果缺少则会导致崩溃),同时对比nil或NULL不进行显式比较.
| 归档时间: |
|
| 查看次数: |
5007 次 |
| 最近记录: |