Iphone if(self=[super init])与if((self=[super init]))

Iphone if(self=[super init])与if((self=[super init])),iphone,objective-c,class,initialization,Iphone,Objective C,Class,Initialization,我刚做了一个代码审查,开始怀疑: 我认为if(self=[super init])检查将[super init]的返回值赋值给变量self是否成功(操作值)。因此(self=nil)实际上是真的 我想if((self=[super init])检查赋值后self的值(变量值)。因此,((self=nil))将是FALSE 初始化自己的类时,哪种方法是正确的?Apple文档使用的是前一个(),我现在实际使用的样式。“赋值表达式在赋值后具有左操作数的值”(C99),因此无论哪种方式,它都具有变量的值

我刚做了一个代码审查,开始怀疑:

我认为
if(self=[super init])
检查将
[super init]
的返回值赋值给变量
self
是否成功(操作值)。因此
(self=nil)
实际上是
真的

我想
if((self=[super init])
检查赋值后
self
的值(变量值)。因此,
((self=nil))
将是
FALSE


初始化自己的类时,哪种方法是正确的?Apple文档使用的是前一个(),我现在实际使用的样式。

“赋值表达式在赋值后具有左操作数的值”(C99),因此无论哪种方式,它都具有变量的值,正如您所说的那样。额外的括号没有什么区别(可能除了警告)。

它们都做相同的事情。
if
计算的内容是其内部表达式的值,即赋值中的赋值。因此,当
self
不是nil时,进入
if


第二种形式在它周围抛出parens,以消除关于条件语句中赋值的任何潜在编译器警告,这通常是一种不好的做法,可能是一种输入错误。但是这是惯用的Objective-C,所以第一种方法很好。

正如其他人所说,在这种情况下,括号并不重要。重要的是,如果您明确检查nil:

if (self = [super init] != nil) // wrong!

if ((self = [super init]) != nil) // right
!=具有高于=的优先级,因此在第一种情况下,您将布尔结果赋值为
[super init]!=对self为nil(可能为true),然后对if进行测试

就我个人而言,我不喜欢这两种方法,但更喜欢在测试之外明确地完成任务。这反映了我的编程背景,使我相信布尔与整数和指针是不同的类型,赋值不是表达式,即使在C实现中,我错了

self = [super init];
if (self != nil) 

Thanx解释了表达式的作用-以及为什么我认为必须有额外的括号!现在我回忆起在其他环境中收到这样的编译器警告,并添加了第二个括号(当然,在检查表达式是否真的达到了我的目的之后)。