我见过很多ObjC代码:
obj = [[SomeObject alloc] init];
if (obj) {
/// ...
}
但据我所知,inside()中的值是一个布尔值,0表示FALSE 1表示TRUE(在另一种语言中还有另一种情况,0为真,1为假),如果指针没有指向对于任何事情,它被设置为NULL(nil),#define定义为0,所以我想知道如果我做的更好:
if (obj != nil) {
/// ...
}
因为它检查obj是否为零,无论nil
是什么值,所以它不依赖于nil
(或NULL
)碰巧定义为0?
答案 0 :(得分:5)
修改强> 经过测试后,我确定现代编译器实际上会为两种情况创建相同的机器代码;
orig post:
使用
(或许可以忽略不计)if(obj) {
因为您不需要创建中间布尔值(通过评估比较表达式)。我不确定你指的是关于非零是假的哪种“其他语言”;我能想到的最接近的事情是c程序为“成功”返回0,为“错误”返回任何其他内容。我曾经使用的每种现代语言都使用0作为FALSE和任何非零值为TRUE。
在Objective-C中,nil实际上是0(像指针一样对待)。它不仅仅是指向零的指针,它作为指针为零。因此,它可靠地等于FALSE(或者,在我们的术语“否”中)。
修改强> 经过测试后,我确定现代编译器实际上会为两种情况创建相同的机器代码;可能是因为nil是essentiall typedef为0,所以它知道两种检查方式都说“如果这个指针不为零”。
答案 1 :(得分:3)
0表示FALSE 1表示TRUE
关闭。在C(和Objective-C)中,0的计算结果为false,非零的计算结果为true。所以nil(或NULL)指针是“false”,但任何非nil指针都是“true”。
你的例子基本上是等同的;两者都不比另一个“更好”(除非你或你的代码库有样式偏好)。