“?:”和目标c中的if语句之间有什么区别吗?

时间:2012-11-24 22:51:02

标签: objective-c if-statement conditional conditional-operator inline-if

使用'?:'条件和简单的'if-then-else'语句之间有区别吗?它只是另一种方式,或者它实际上使用更少的空间/花费更少的时间阅读比'if'语句?

示例:

如果声明:

if (item1.isEqualToString:@"2") //If statement
    [self doSomething];
else
    [self doSomethingElse];

item1.isEqualToString:@"2" ? [self doSomething] : [self doSomethingElse]; //'?:' statement

3 个答案:

答案 0 :(得分:17)

是的,有区别。

语义上if / else语句意味着

if (condition)
  statements
else
  statements

而三元条件是

condition ? expression : expression

因此,您可以将?:运算符的结果分配给某些内容,而不能使用if语句执行此操作。实际上?:运算符本身就是一个表达式,因此您可以将其嵌套在其他表达式中,甚至是其他表达式:运算符。

?:也是类型检查,这个

condition ? [self methodThatReturnsVoid] : [self methodThatReturnsInt]

引发错误,因为结果类型可能会根据条件发生变化。

答案 1 :(得分:6)

正如杰克建议的那样,存在差异。您可以将?:运算符重写为:

ExpressionType temp;
if (condition) {
    temp = trueExpression;
}
else {
    temp = falseExpression;
}
lvalue = temp;  // (Where "lvalue" refers to the receiver of the resulting value)

关于效率,几个机器指令集的硬件版本?:用于简单的情况,但不适用于更复杂的情况(他们会使用类似于上面的东西),所以很难说哪个更有效率的时候。

?:运算符的主要优点是它允许将条件运算嵌入到表达式中,而不得不使用if / else分解表达式,这可以使概念上(和视觉上)更简单代码,即使实际的机器复杂性没有显着降低(如果有的话)。

答案 2 :(得分:1)

为了追加Jack和Hot Licks提供的好答案,决定使用哪一部分是由必要性和部分风格决定的。例如,?:通常会减少冗余,这可以使代码更简单,更简单,更易于阅读和维护 - 没有更新if..else的一半而忘记另一半的风险。 e.g。

int result = SomeFunction(arg1, arg2, arg3, (someBool ? arg4a : arg4b));

VS

int result = -1;
if (someBool) {
    result = SomeFunction(arg1, arg2, arg3, arg4a);
} else {
    result = SomeFunction(arg1, arg2, arg3, arg4b);
}

这是一个简洁的简洁示例,但您可以想象,使用真实的参数名称和周围的复杂性,可能很容易从几个月后回来并修改对SomeFunction的第二次调用而不会意识到另一个存在,更不用说应该也可以修改。