在Objective C中,'?:'和if语句有什么区别吗?

9

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

例如:

if语句:

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

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

1
注意:你不能使用“==”来比较两个字符串。请使用isEqualToString:代替。 - rmaddy
抱歉,我是临时打的。现在已经修正了。 - cory ginsberg
使用属性语法进行方法调用被认为是不好的做法。 - rmaddy
好的,下次会知道。 - cory ginsberg
2
你上面的代码实际上无法运行,你只能在不带参数的方法调用(或者遵循 setter 命名约定的参数)上使用属性语法。 - Louis Gerbarg
3个回答

18

是的,有所不同。

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

if (condition)
  statements
else
  statements

三目运算符是一种条件语句

condition ? expression : expression

你可以使用 ?: 运算符将结果分配给某个东西,而使用 if 语句则无法这样做。实际上,?: 运算符本身就是一个表达式,因此您可以将其嵌套在其他表达式中,甚至是其他 ?: 运算符中。

?: 运算符也经过类型检查,这

condition ? [self methodThatReturnsVoid] : [self methodThatReturnsInt]

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


谢谢!现在使用它的时候更有意义了。 - cory ginsberg

6

就像Jack所说的那样,这里有一个区别。您可以将?:运算符重写为:

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

关于效率,有几种机器指令集在硬件中实现了 ?: 用于简单情况,但在更复杂的情况下(需要使用类似上述方法),就无法确定哪种更有效。 ?: 操作符的主要优势是允许将条件操作嵌入表达式中,而不必使用 if/else 分割表达式,这可以使代码在概念上(和视觉上)更简单,尽管实际的机器复杂性并没有显着减少(如果有的话)。

1
补充一下Jack和Hot Licks提供的好答案,选择使用哪种方式部分取决于必要性,部分取决于风格。例如,?:通常可以减少冗余,从而产生更简单、更短的代码,易于阅读和维护——不会有更新if..else的一半并忘记另一半的风险。例如:
int result = SomeFunction(arg1, arg2, arg3, (someBool ? arg4a : arg4b));

对比

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

这是一个简洁的示例,但您可以想象,在实际参数名称和周围的复杂性下,几个月后回来修改对 SomeFunction 的第二次调用可能很容易忘记其他存在,更不用说也应该进行修改。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接