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
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 and 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への2番目の呼び出しを、他の呼び出しが存在することに気付かずに変更するのは簡単であると想像できます。 。

于 2012-11-25T21:43:02.067 に答える