代码之家  ›  专栏  ›  技术社区  ›  JOM agenthunt

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

  •  20
  • JOM agenthunt  · 技术社区  · 16 年前

    只是做了一个代码审查,开始怀疑:

    我想 if (self = [super init]) 检查是否分配返回值 [super init] self 是否成功( 经营价值 )因此 (self = nil) 实际上是 TRUE .

    我想 if ((self = [super init])) 检查的值是多少 自己 分配后( 变数值 )因此 ((self = nil)) 将是 FALSE .

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

    3 回复  |  直到 12 年前
        1
  •  20
  •   Ben Zotto sberry    16 年前

    他们都做同样的事情。这件事 if 计算是表达式内部的值,它是赋值中的赋值。所以什么时候 self 不是零,你进入 如果 块。

    第二个表单在它周围抛出parens,以消除任何关于条件中赋值的潜在编译器警告,这通常是不好的做法,可能是拼写错误。但这是惯用的objective-c,所以第一种方法可以。

        2
  •  12
  •   JeremyP    16 年前

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

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

    !=的优先级高于=的优先级,因此在第一种情况下,您将为 [super init] != nil (可能是真的)对自己,然后对if进行测试。

    就我个人而言,我也不在乎,但更愿意在测试之外明确地完成任务。这反映了我的编程背景,使我相信布尔值与整数和指针是不同的类型,并且赋值不是表达式,即使在C实现的情况下,我错了。

    self = [super init];
    if (self != nil) 
    
        3
  •  4
  •   Matthew Flaschen    16 年前

    “赋值表达式在赋值后具有左操作数的值”(c99),因此无论哪种方式,它都具有 变数值 如你所说。额外的括号没有区别(可能是警告除外)。

    推荐文章