当时只是在做代码评审,然后开始怀疑:
我认为if (self = [super init])检查将[super init]的返回值分配给变量self是否成功(操作值)。因此,(self = nil)实际上是TRUE。
我认为if ((self = [super init]))检查赋值后self的值(变量的值)。因此,((self = nil))将是FALSE。
在初始化您自己的类时,哪一种方法是正确的?苹果文档使用的是前一种(举个例子),我现在实际上正在使用这种风格。
发布于 2010-06-17 06:00:57
他们都做同样的事。if计算的内容是它内部表达式的值,它是赋值中的赋值。因此,当self不是零时,就进入if块。
第二种形式在它周围抛出部分,以压制任何关于条件内赋值的潜在编译器警告,这通常是错误的做法,可能是错误的。但这是惯用的目标-C,所以用第一种方法做是可以的。
发布于 2010-06-17 07:51:56
正如其他人所说,在这种情况下,括号并不重要。它们真正重要的地方是,如果您明确地检查为零:
if (self = [super init] != nil) // wrong!
if ((self = [super init]) != nil) // right!=具有比=更高的优先级,因此在第一种情况下,您将[super init] != nil的布尔值(可能为真)分配给self,然后对if进行测试。
就我个人而言,我不关心这两种情况,但我更喜欢在测试之外显式地完成任务。这反映了我的编程背景,使我相信布尔值与整数和指针是不同的类型,而赋值不是表达式,即使在C实现中,我错了。
self = [super init];
if (self != nil) 发布于 2010-06-17 06:00:46
“赋值表达式具有赋值后左操作数的值”(C99),因此,正如您所说,无论哪种方式,它都有变量的值。额外的括号没有什么区别(除了警告之外)。
https://stackoverflow.com/questions/3059232
复制相似问题