9

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

例子:

如果声明:

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

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

3 回答 3

18

是,有一点不同。

从语义上讲,if/else 语句意味着

if (condition)
  statements
else
  statements

而三元条件是

condition ? expression : expression

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

?: 也经过类型检查,这

condition ? [self methodThatReturnsVoid] : [self methodThatReturnsInt]

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

于 2012-11-24T22:53:35.160 回答
6

正如杰克所建议的那样,这是有区别的。您可以将运算符重写?:为:

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

至于效率,一些机器指令集?:在简单情况下具有在硬件中实现的版本,但对于更复杂的情况(他们会使用类似于上述的东西)则没有,所以很难说哪个更有效。

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

于 2012-11-24T23:14:04.933 回答
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 的第二次调用而没有意识到另一个调用存在,更不用说也应该修改.

于 2012-11-25T21:43:02.067 回答