0

sのプリミティブな合計を返す単純な関数がありますが、NSNumber-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正しい値を返します。

私はそれを一方の方法で書くことを好みませんが、最初の方法の何が悪いのかわかりません。

4

1 に答える 1

4

演算子の優先順位。三項演算子はCで3番目に優先順位が低いため、条件付き部分に到達する前に加算が評価されます。括弧を使用します。

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]);
于 2013-01-29T20:06:33.473 に答える