Objective-C:奇怪的三元行为

时间:2013-01-29 20:02:08

标签: objective-c ternary-operator

我有一个简单的函数返回NSNumber s的原始总和,但如果它们是-1,则不计算它们:

- (NSInteger)total {
    return [[self obj1] integerValue] == -1 ? 0 : [[self obj1] integerValue] + 
           [[self obj2] integerValue] == -1 ? 0 : [[self obj2] integerValue] +
           [[self obj3] integerValue] == -1 ? 0 : [[self obj3] integerValue];
}

在这种情况下,total将始终返回0.

但如果我这样写:

- (NSInteger)total {
    NSInteger ret = 0;
    ret += [[self obj1] integerValue] == -1 ? 0 : [[self obj1] integerValue];
    ret += [[self obj2] integerValue] == -1 ? 0 : [[self obj2] integerValue];
    ret += [[self obj3] integerValue] == -1 ? 0 : [[self obj3] integerValue];
    return ret;
}

total将返回正确的值。

我没有偏好以一种方式写它,但我没有看到第一种方式有什么问题。

1 个答案:

答案 0 :(得分:4)

运营商优先权。三元运算符在C中具有第三低的优先级,因此在可以到达条件部分之前评估加法。使用括号:

return ([[self obj1] integerValue] == -1 ? 0 : [[self obj1] integerValue]) + 
       ([[self obj2] integerValue] == -1 ? 0 : [[self obj2] integerValue]) +
       ([[self obj3] integerValue] == -1 ? 0 : [[self obj3] integerValue]);