180

私は Java を数年間使用してきましたが、最近まで、次の構造に出くわしたことはありません。

int count = isHere ? getHereCount(index) : getAwayCount(index);

これはおそらく非常に簡単な質問ですが、誰か説明できますか? 読み方は?私はそれがどのように機能するかを知っていると確信しています。

  • isHeretrue の場合、呼び出さgetHereCount()れます。
  • if isHereis falsegetAwayCount()が呼び出されます。

正しい?この構成は何と呼ばれますか?

4

16 に答える 16

208

はい、省略形です

int count;
if (isHere)
    count = getHereCount(index);
else
    count = getAwayCount(index);

これは条件演算子と呼ばれます。Java、C、C++、およびおそらく他の多くの言語で唯一の 3 項 (3 引数) 演算子であるため、多くの人が (誤って) 3 項演算子と呼んでいます。ただし、理論的には、別の三項演算子が存在する可能性がありますが、条件演算子は 1 つしか存在できません。

正式な名前はJava 言語仕様に記載されています。

§15.25 条件演算子 ? :

条件演算子? :は、1 つの式のブール値を使用して、他の 2 つの式のどちらを評価するかを決定します。

どちらの分岐も、戻り値を持つメソッドにつながる必要があることに注意してください。

2 番目または 3 番目のオペランド式が void メソッドの呼び出しであることは、コンパイル時エラーです。

実際、式ステートメントの文法 ( §14.8 ) により、void メソッドの呼び出しが発生する可能性のあるコンテキストで条件式を使用することは許可されていません。

したがって、doSomething()doSomethingElse()が void メソッドの場合、これを圧縮することはできません。

if (someBool)
    doSomething();
else
    doSomethingElse();

これに:

someBool ? doSomething() : doSomethingElse();

簡単な言葉:

booleanCondition ? executeThisPartIfBooleanConditionIsTrue : executeThisPartIfBooleanConditionIsFalse 
于 2009-04-28T15:30:36.970 に答える
33

他の人は妥当な範囲でこれに答えていますが、多くの場合「三項演算子」という名前が付いています。

私はペダンなので、演算子の名前が条件演算子または「条件演算子 ?:」であることを明確にしたいと思います。これは (3 つのオペランドがあるという点で) 三項演算子であり、現時点では Java で唯一の三項演算子です。

ただし、仕様は、その名前が条件演算子または「条件演算子 ?:」であることを明確に明確にしています。オペランドの数だけでなく、演算子の動作 (条件の評価) をある程度示すため、その名前で呼び出す方が明確だと思います。

于 2009-04-28T15:36:40.260 に答える
17

Sun Java Specificationによると、これは条件演算子と呼ばれています。セクション 15.25 を参照してください。あなたはそれが何をするかについて正しいです。

条件演算子 ? : 1 つの式のブール値を使用して、他の 2 つの式のどちらを評価するかを決定します。

条件演算子は構文的に右結合 (右から左にグループ化) であるため、 a?b:c?d:ef?f:g は a?b:(c?d:(e?f :g))。

ConditionalExpression:
        ConditionalOrExpression
        ConditionalOrExpression ? Expression : ConditionalExpression

条件演算子には 3 つのオペランド式があります。? は 1 番目と 2 番目の式の間に表示され、: は 2 番目と 3 番目の式の間に表示されます。

最初の式は boolean または Boolean 型である必要があります。そうしないと、コンパイル時エラーが発生します。

于 2009-04-28T15:35:13.667 に答える
7
condition ? truth : false;

条件が次の場合true、最初の式を評価します。条件が の場合false、2 番目の式を評価します。

これは条件演算子と呼ばれ、三項演算の一種です。

于 2009-04-28T15:34:42.607 に答える
5
int count = isHere ? getHereCount(index) : getAwayCount(index);

意味 :

if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}
于 2009-04-28T15:30:38.763 に答える
5

正確には、正確ではありません:

  1. isHere が true の場合、getHereCount()の結果が返されます
  2. それ以外の場合は、getAwayCount()の結果が返されます

その「返された」ことがとても重要です。これは、メソッドが値を返す必要があり、その値をどこかに割り当てる必要があることを意味します。

また、if-else バージョンと構文的に完全に同等というわけではありません。例えば:

String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;

if-else でコーディングすると、常により多くのバイトコードが生成されます。

于 2009-04-28T16:03:26.687 に答える
4

三項、条件付き。トマト、トマト。本当に価値があるのは、変数の初期化です。(私のように)変数が定義されている場所で変数を初期化するのが好きなら、条件付き三項演算子(両方であるため)を使用すると、その値に条件がある場合にそれを行うことができます。最終的なフィールドで特に注目されますが、他の場所でも役立ちます。

例えば:

public class Foo {
    final double    value;

    public Foo(boolean positive, double value) {
        this.value = positive ? value : -value;
    }
}

その演算子がなければ、どんな名前でも、フィールドを非最終にするか、単に初期化するための関数を書く必要があります。実際、そうではありません。少なくとも Java では、if/else を使用して初期化できます。しかし、私はこれがよりきれいだと思います。

于 2009-04-28T16:34:45.287 に答える
3

条件演算子に似た新しい演算子の提案に興味があるかもしれません。null 安全な演算子は、次のようなコードを有効にします。

String s = mayBeNull?.toString() ?: "null";

自動ボックス化解除が行われる場合は特に便利です。

Integer ival = ...;  // may be null
int i = ival ?: -1;  // no NPE from unboxing

これは、JDK 7 の「Project Coin」の下でさらに検討するために選択されました。

于 2009-04-28T17:10:35.200 に答える
3

この構造は、コンピューター サイエンスおよびプログラミング技術では三項演算子と呼ばれます。
そしてウィキペディアは次の説明を提案しています:

コンピューター サイエンスでは、3 項演算子 (誤って 3 項演算子と呼ばれることもあります) は、3 つの引数を取る演算子です。引数と結果は異なる型にすることができます。C に似た構文を使用する多くのプログラミング言語は、条件式を定義する三項演算子 ?: を備えています。

Java だけでなく、この構文は PHP や Objective-C でも使用できます。

次のリンクでは、次の説明が提供されています。これは、理解するのに適しています。

三項演算子は、3 つの入力を操作する操作です。これは if-else ステートメントのショートカットであり、条件演算子とも呼ばれます。

Perl/PHP では、次のように機能します。
boolean_condition ? true_value : false_value

C/C++ では、次のように機能します。
logical expression ? action for true : action for false

これは、あまり複雑ではないいくつかの論理条件で読み取り可能な場合があります。それ以外の場合は、条件付きロジックの意図した組み合わせでIf-Else ブロックを使用することをお勧めします。

1 つのコード ステートメント行に対して、この三項演算子を使用してIf-Else ブロックを簡略化できます。
例えば:

if ( car.isStarted() ) {
     car.goForward();
} else {
     car.startTheEngine();
}

次と等しい場合があります。

( car.isStarted() ) ? car.goForward() : car.startTheEngine();

したがって、あなたの声明を参照すると:

int count = isHere ? getHereCount(index) : getAwayCount(index);

実際には、次のIf-Else ブロックと 100% 同等です。

int count;
if (isHere) {
    count = getHereCount(index);
} else {
    count = getAwayCount(index);
}

それでおしまい!
これが誰かの役に立てば幸いです!
乾杯!

于 2015-09-13T13:41:28.720 に答える
2

正しい。三項演算子呼ばれます。条件演算子と呼ぶ人もいます。

于 2009-04-28T15:30:31.087 に答える
2

その三項演算子(?:)

The ternary operator is an operator that takes three arguments. The first 
argument is a comparison argument, the second is the result upon a true 
comparison, and the third is the result upon a false comparison.
于 2017-04-25T12:48:52.823 に答える
0

私はたまたまこの演算子が本当に好きですが、読者を考慮に入れる必要があります。

コードのコンパクトさとそれを読むのに費やす時間のバランスを常にとる必要があり、その点でかなり深刻な欠陥があります。

まず第一に、オリジナルアスカーのケースがあります。彼はそれについて投稿し、回答を読むのに1時間費やしました。作者がすべてを書くのにどれくらい時間がかかりましたか?:彼の生涯を通してif/thenとして。確かに1時間ではありません。

第二に、Cのような言語では、条件文が最初にあることを単に知る習慣があります。Rubyを使用しているときにこれに気づき、次のような行に出くわしました。

callMethodWhatever(Long + Expression + with + syntax) if conditional

私が長い間Rubyユーザーだった場合、この行に問題はなかったでしょうが、Cから来て、行の最初に「callMethodWhatever」が表示されている場合は、実行されることを期待しています。?:はあまりわかりにくいですが、それでもリーダーを捨てるほど珍しいものです。

ただし、1行のスペースに3行のifステートメントを記述できると、おなかにとてもクールな感じがするという利点があります。それを否定することはできません:)しかし、正直なところ、その希少性のために、そこにいる人々の90%が必ずしも読みやすくなるとは限りません。

本当にブール値と値に基づく割り当てである場合、問題はありませんが、簡単に悪用される可能性があります。

于 2009-04-28T16:16:12.460 に答える
0

はい。それで合っています。?: 通常、「三項条件演算子」と呼ばれ、単に「三項演算子」と呼ばれることもあります。これは、標準の if/else 条件の簡略版です。

三項条件演算子

于 2009-04-28T15:33:33.607 に答える
0

これは条件演算子であり、if ステートメントを簡潔に記述するだけではありません。

値を返す式なので、他の式の一部として使用できます。

于 2009-04-28T15:35:25.677 に答える