繁体   English   中英

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

[英]Is there any difference between '?:' and an if statement in objective c?

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

例:

如果声明:

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

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

是,有一点不同。

语义上是if / else语句的意思

if (condition)
  statements
else
  statements

而三元条件是

condition ? expression : expression

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

?:也是类型检查,这个

condition ? [self methodThatReturnsVoid] : [self methodThatReturnsInt]

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

杰克建议,有一点不同。 您可以将?:运算符重写为:

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

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

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

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

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的第二次调用而不会意识到另一个存在,更不用说也应该修改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM