Iphone ! 目标c中的vs==nil

Iphone ! 目标c中的vs==nil,iphone,objective-c,c,Iphone,Objective C,C,如果您有一个像NSString*someString这样的对象,那么它们之间的区别(如果有的话)是什么 if (!someString) vs 谢谢 在你的情况下,它的意思是一样的。任何不指向nil的指针将返回YES(true) 通常感叹号运算符会对BOOL值求反。对于大多数指针,它们是等效的,尽管我知道的大多数编码器更喜欢前者,因为前者更简洁 对于弱链接符号,前者解析符号(如果符号丢失,将导致崩溃),而与nil或NULL进行显式比较则不会。是一个求反运算符。如果您的对象未分配,您将从真值表中

如果您有一个像NSString*someString这样的对象,那么它们之间的区别(如果有的话)是什么

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”。
的含义是基于此约定定义的,当前版本的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的定义。好的,没有