Java とは何ですか?:オペレーターが電話をかけてきましたが、何をするのですか?
-
18-09-2019 - |
質問
私は数年間 Java を使ってきましたが、最近までこの構造に遭遇したことがありませんでした。
int count = isHere ? getHereCount(index) : getAwayCount(index);
これはおそらく非常に単純な質問ですが、誰か説明できますか?どうやって読むのですか?私はそれがどのように機能するかをよく知っていると確信しています。
- もし
isHere
それは本当です、getHereCount()
と呼ばれます、 - もし
isHere
偽ですgetAwayCount()
と呼ばれます。
正しい?この構造は何と呼ばれますか?
解決
はい、これは次の短縮形です
int count;
if (isHere)
count = getHereCount(index);
else
count = getAwayCount(index);
それはと呼ばれています 条件演算子. 。多くの人が(誤って)それを呼んでいます 三項演算子, なぜなら、これは Java、C、C++、そしておそらく他の多くの言語で唯一の 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
他のヒント
その他ますが、多くの場合、名前を「三項演算子」で、合理的な範囲でこれに答えています。
私はPEDANTなので、私はそれが明確な演算子の名前は、条件演算子または「?条件演算子:」であることを確認したいと思います。これは、のの三項演算子(それは3つのオペランドを持っているという点で)だと、現時点ではJavaで唯一の三項演算子であることを起こるます。
しかし、スペックはかなりあります明確には、その名の条件演算子かであることをの「条件演算子?:」絶対に曖昧でないこと。私は、それがある程度(条件を評価)にオペレータの振る舞いを示してではなく、それが持っているだけでどのように多くのオペランドとして、その名前によって、それを呼び出すことが明確だと思います。
のSun Java仕様するによると、 、それは条件付きオペレータと呼ばれています。セクション15.25を参照してください。あなたはそれが何のようだね。
条件演算子? :評価されるべき他の二つの表現のかを決定するために、1つの式のブール値を使用しています。
。は、条件演算子は右結合構文的である(それ基右から左へ)、その結果、B:C:D?E F:?gはBと同じ意味:(C D :( ?E F:G))
ConditionalExpression:
ConditionalOrExpression
ConditionalOrExpression ? Expression : ConditionalExpression
条件演算子は、三のオペランド式を有します。 ?第一および第二の表現の間表示され、そして:第二及び第三の式の間に表示される
。最初の式がBoolean型またはブールでなければならない、またはコンパイル時エラーが発生します。
厳密に言えば、正確には正しくありません:
- isHere が true の場合、 結果 getHereCount() の 戻ってきた
- それ以外の場合は 結果 getAwayCount() の 戻ってきた
この「返す」ということがとても大切です。それはメソッドを意味します しなければならない 値とその値を返す しなければならない どこかに配属される。
また、それは ではない正確に 構文的には if-else バージョンと同等です。例えば:
String str1,str2,str3,str4;
boolean check;
//...
return str1 + (check ? str2 : str3) + str4;
if-else を使用してコーディングすると、常にバイトコードが増加します。
int count = isHere ? getHereCount(index) : getAwayCount(index);
を意味します:
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
condition ? truth : false;
条件がtrue
されている場合は、そして、最初のパラメータを返します。条件がfalse
ある場合は、2番目のパラメータを返します。
これは条件演算子に呼ばれると、それは<のhref =」のタイプですhttp://en.wikipedia.org/wiki/Ternary_operation」のrel = "nofollowをnoreferrer">三項演算します。
三元、条件。トマト、tomatoh。それは何のために本当に価値のあるのは、変数の初期化です。 (私のように)あなたは彼らが定義されている変数を初期化するのが好きであれば、条件付きの三項演算子は、(それが両方あるため)、その値についてのコンディショナリティーがある場合にそれを行うことを許可。あまりにも、最終的分野で特に注目すべきはなく、別の場所に有用ます。
例えば:ます。
public class Foo {
final double value;
public Foo(boolean positive, double value) {
this.value = positive ? value : -value;
}
}
その演算子なし - どんな名前で - 。あなたはフィールド非finalをしたり、それを初期化するために、単純に関数を記述する必要がありますが、の実は、そうではない - 場合は、それはまだ使用して初期化することができます/他に、少なくともJavaのインチしかし、私は、このクリーナーを見つけます。
この構造は次のように呼ばれます 三項演算子 コンピュータサイエンスとプログラミング技術の博士号を取得。
そして ウィキペディア 次のような説明を提案してください。
コンピューター サイエンスでは、三項演算子 (誤って 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 ブロック 条件付きロジックの意図した組み合わせを使用します。
簡略化できます If-Else ブロック この三項演算子を 1 つのコード ステートメント行に使用します。
例えば:
if ( car.isStarted() ) {
car.goForward();
} else {
car.startTheEngine();
}
次と同じになる可能性があります。
( car.isStarted() ) ? car.goForward() : car.startTheEngine();
したがって、あなたの声明を参照すると、次のようになります。
int count = isHere ? getHereCount(index) : getAwayCount(index);
実際には、次のものと 100% 同等です。 If-Else ブロック:
int count;
if (isHere) {
count = getHereCount(index);
} else {
count = getAwayCount(index);
}
それでおしまい!
これが誰かの役に立てば幸いです!
乾杯!
その三項演算子(:?)
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.
あなたは提案に興味があるかもしれませんA>条件演算子に似ているいくつかの新しい演算子のために。 nullで安全な演算子は、このようなコードが有効になります:
String s = mayBeNull?.toString() ?: "null";
オートアンボクシングが行われる場所それは特に便利である。
Integer ival = ...; // may be null
int i = ival ?: -1; // no NPE from unboxing
これは JDK 7の下にさらに検討するのために選択されている「プロジェクトコイン。」
実際には3つの以上の引数を取ることができます。私たちは数天気を確認したい場合たとえば、私たちはこれを行うことができ、正、負またはゼロである。
String m= num > 0 ? "is a POSITIVE NUMBER.": num < 0 ?"is a NEGATIVE NUMBER." :"IT's ZERO.";
、それ以外の他の場合には、場合使用するよりも優れている。
これは、条件演算子だし、それはif文の書き込みだけの簡潔な方法よりも多くのです。
は、それが他の式の一部として使用することができる値を返す式であるので
はい、あなたは正しいです。 ?:一般的に、多くの場合、単に「三項演算子」と呼ばれ、「三項条件演算子」と呼ばれています。 /他の条件付きかどうかは、標準の簡略版です。
私は本当にこの演算子のように起こるのが、読者は考慮すべきである。
あなたはいつもそれを読んで過ごした時間とコードのコンパクトさのバランスを取る必要があり、その中で、それはかなり深刻な欠陥を持っています。
まず、オリジナルアスカーの場合があります。彼はちょうどそれについて投稿や回答を読んで時間を過ごしました。 ?どのように長いそれは、すべてを書くために、著者を取っただろう。彼の全体の生命のコースを通して、その後/かのように。ない時間を確認してくださいする。
第二に、Cのような言語では、あなたは単に条件文は、行の最初のものであることを知っているのが習慣に取得します。私はルビーを使用していたときに、このことに気づいなどのラインに出くわします:
callMethodWhatever(Long + Expression + with + syntax) if conditional
私はRubyのユーザーに長い時間だった場合は、私はおそらくあなたが行の最初のものとして「callMethodWhatever」を見たとき、あなたはそれが実行されることを期待し、この回線に問題があったが、Cから来ていません。 :?それほど不可解な、しかし読者をオフにスローするように十分まだ珍しいです。
。利点は、しかし、あなたがラインの1のスペースで3ラインif文を書くことができ、あなたのおなかで本当にクールな感じです。しかし、正直なところ、必ずしもより読みやすいそこに人々の90%によって、単に、その希少性の:)ことを否定することはできません。
それは本当にブールや価値観に基づいて割り当てている場合は、私はそれで問題ありませんが、それは簡単に悪用されることができます。
条件式は、文の中がない場合は、明示的で、完全に異なるスタイルです。
構文は次のとおりです。 ブール表現?式1:式2;
この条件式の結果が
ブール式が真である場合は、式1;
それ以外の結果はexpression2をされています。
は、あなたが最大の変数NUM1とNUM2の大きな数を割り当てたいとします。あなたは、単に条件式を使用して文を書くことができます。 最大=(NUM1> num2の)? NUM1:num2の;
注:シンボル?そして、:条件式に一緒に表示されます。彼らは、条件演算子を形成し、それは3つのオペランドを使用するためにも三項演算子と呼ばれます。これは、Javaで唯一の三項演算子です。
から引用した:Y.ダニエル梁ページによってイントロのJavaプログラミング第10版に126から127