Iphone ! 目标c中的vs==nil
如果您有一个像NSString*someString这样的对象,那么它们之间的区别(如果有的话)是什么Iphone ! 目标c中的vs==nil,iphone,objective-c,c,Iphone,Objective C,C,如果您有一个像NSString*someString这样的对象,那么它们之间的区别(如果有的话)是什么 if (!someString) vs 谢谢 在你的情况下,它的意思是一样的。任何不指向nil的指针将返回YES(true) 通常感叹号运算符会对BOOL值求反。对于大多数指针,它们是等效的,尽管我知道的大多数编码器更喜欢前者,因为前者更简洁 对于弱链接符号,前者解析符号(如果符号丢失,将导致崩溃),而与nil或NULL进行显式比较则不会。是一个求反运算符。如果您的对象未分配,您将从真值表中
if (!someString)
vs
谢谢 在你的情况下,它的意思是一样的。任何不指向
nil
的指针将返回YES
(true)
通常感叹号运算符会对
BOOL
值求反。对于大多数指针,它们是等效的,尽管我知道的大多数编码器更喜欢前者,因为前者更简洁
对于弱链接符号,前者解析符号(如果符号丢失,将导致崩溃),而与
nil
或NULL
进行显式比较则不会。
是一个求反运算符。如果您的对象未分配,您将从真值表中获得与使用==nil
操作相同的结果
但是!!通常更多地用于布尔运算
if(!isFalse) {
//if isFalse == NO, then this operation evaluates to YES (true)
[self doStuff];
}
当您使用
时像这样的对象上的code>!something
它只是检查指针是否指向nil
,如果不指向,则返回true,并触发if语句。您使用的第一种语法:
if (!someString)
利用C的一种“模糊性”,源于C的原始标准缺少适当的布尔类型这一事实。因此,任何等于0的整数值都被解释为“false”,任何与“0”不同的整数值都被视为“true”。的含义因此,code>是基于此约定定义的,当前版本的C标准保留了原始定义以实现兼容性
在您的特定情况下,someString
是一个指针,因此首先将其转换为整数,然后再转换为!当someString
指向位置0x000000
时,someString
被解释为true
的布尔值,否则它将求值为“true”
在大多数情况下(我总是这么说),这很好,但在理论上,在某些编译器下,NULL/nil
,因此(在理论上)最好使用第二种语法,它更明确:
if (someString == nil)
无论如何,它更具可读性,而且由于someString
不是整数(而是指针),因此在一般情况下,我认为这是更好的做法
编辑:关于空的定义
C标准是否将NULL定义为0对我来说是一个有趣的话题
根据第7.17节“通用定义”:
NULL[它]扩展为实现定义的NULL指针常量
所以,NULL在stddef.h中定义为实现定义的NULL指针常量。。。
第47页的同一文件规定:
值为0的整型常量表达式或转换为void*类型的此类表达式称为空指针常量。55)如果将空指针常量转换为指针类型,则生成的指针(称为空指针)保证与指向任何对象或函数的指针进行不相等的比较
因此,可以将空指针常量(即(void*)0
)转换为空指针,并保证将其与指向任何对象或函数的指针进行比较
因此,我认为这基本上取决于实现是否决定将null指针常量转换为null指针的结果生成一个指针,该指针转换回整数后得到0。不清楚被解释为整数的空指针是否等于0
我想说的是,该标准确实尝试并强制执行空指针为0,但却为空指针敞开了大门。如果你想测试条件“foo为nil”,你应该说:foo==nil
如果您想测试布尔值是否错误,!foo是可以的,但我个人认为一个小小的感叹号很容易被忽略,所以我更喜欢foo==NO
编写好的代码不仅仅是向编译器,而且是向下一个程序员(可能是未来的您)清楚地传达您的意图。在这两种情况下,你对你要做的事情越明确越好
除了这些,
和==nil
在我能想到的所有情况下都有相同的效果。砰的一声,感叹号,前缀运算符是逻辑not。至少,这是它的一个版本。如果您查看一个典型的逻辑非真值表,您会看到如下内容:
Input Result
1 0
0 1
Input Result
non-zero 0
0 1
但是,在C中,逻辑not运算符的作用更类似于:
Input Result
1 0
0 1
Input Result
non-zero 0
0 1
<> P>因此,当您考虑ObjuleC中NULL和NIL的值为0时,您知道应用到它们的逻辑NOR运算符将导致1。
现在,考虑等式<代码>=< /代码>运算符。它比较两个项目的值,如果它们相等,则返回1,如果它们不相等,则返回0。如果将其结果映射到真值表,那么它将与逻辑not的结果完全相同
在C和Objective-C程序中,条件实际上是由int决定的,而不是真正的布尔。这是因为C中不存在布尔数据类型。因此,在C中编写类似这样的内容非常好:
而且
if(2029) printf("hello\n"); // also prints hello
基本上,任何非零int在C中都将计算为“true”。您将其与逻辑求反和相等的真值表相结合,很快就会意识到:
(! someString) and (someString == nil)
所有的意图都是一样的
所以下一个逻辑问题是,为什么喜欢一种形式而不是另一种形式?从纯C的角度来看,这主要是一种风格,但大多数(优秀的)开发人员选择平等测试的原因有很多:
它更接近您试图在代码中表达的内容。你是
正在尝试检查someString变量是否为nil
它更便于携带。像Java这样的语言有一个真正的布尔类型。
不能对其变量或NULL使用bang符号
定义。在需要的地方使用相等使移植更容易
以后,C语言将被应用到这些语言中
苹果可能会改变nil的定义。好的,没有