2016-04-14 15 views
0

次の文は問題なく動作しますが、理由を説明できる人がいますか?&&の前に追加のかっこが必要な印象を受けましたか?しかし、たとえ()が見つからなくても、まだ動作します。短い言葉でJava If and Or Stat

if(returnt.getInt("date", iLoop) == Util.getBusinessDate() 
    && returnt.getInt("ins_type", iLoop) == Ref.getValue(SHM_USR_TABLES_ENUM.INSTRUMENTS_TABLE, "DEPO") 
    || returnt.getInt("ins_type", iLoop) == Ref.getValue(SHM_USR_TABLES_ENUM.INSTRUMENTS_TABLE, " DEPO2")) 
{...} 
+1

どのような小切手が作られていると思いますか? – Stultuske

+3

論理AND演算子は、論理OR演算子よりも優先順位が高くなります。優先順位は、式のどの順番で評価されるかを決定します。 – Ralf

答えて

4

あなたの文は

if (A && B || C) { 


1 1 1 => true 
0 1 1 => true 
0 0 1 => true 
1 1 0 => false 

よう&ある& "難しい" し、 "||" をバインドします最初に評価されます。

あなたは

if ((A && B) || C) { 

のようなブラケットを設定した場合、結果は同じです。この場合に

if (A && (B || C)) { 

1 1 1 => true 
0 1 1 => false 
0 0 1 => false 
1 1 0 => true 

ブラケットB内の式のようにブラケットを設定した場合、最初にC

にbracktes内の式(& & B)が評価され、その結果が比較され、|| Cが最初に評価され、次に& &が評価されます。

だから...あなたは何を表現/確認したいのですか?

+1

0 && 0 => 0. so 0 || 1は1ですか? –

+1

ああ、そうだよ。私はそれを頭の中で乱した。私の悪い。 :) – Thomas

-3

あなたが必要であり、それらは暗黙のJavaで宣言していると思う余分なブラケット;)

+0

コメントありがとうございました。要するに、余分な括弧を追加しても、コードは期待どおりに機能しませんか?私は、一緒にテストして、それは違いはありません。 – user3890637

4

私の古い大学教授は、余分な括弧はキッシュを食べる人のためにと女の子のためのものであることを、おそらくかなり不適切、と言っていました。

オペレータの優先順位表を心得てください。コードは次いで==が最初に評価され、すなわち

if (((returnt.getInt("date", iLoop) == Util.getBusinessDate()) 
    && (returnt.getInt("ins_type", iLoop) == Ref.getValue(
     SHM_USR_TABLES_ENUM.INSTRUMENTS_TABLE, "DEPO"))) 
     || (returnt.getInt("ins_type", iLoop) == Ref.getValue(
     SHM_USR_TABLES_ENUM.INSTRUMENTS_TABLE, " DEPO2"))) { 

&&||と等価です。後者の2つは短絡しているので、結果が分かれば評価は停止します。

あなたが経験したように、私が貼り付けたバージョンはとかなりわかります。は読みにくいです。

+1

"あなたが読み上げるのがかなり困難になるまで貼り付けたバージョンを見つけることができます - いくつかの空白を追加してグループを強調するために意図を使うのではなく); – Thomas

+0

しかし、' if(((vulgar? – Bathsheba

+1

はい、それは厄介に見えますが、私はおそらく '=='式のまわりで小括弧を使いません。ほとんどの場合理解されています。 – Thomas

-2

==&&よりも高い優先度を持つためです。

+0

これはあまり関係ありません。問題は '&&'と '||'です。 – Thomas

+0

彼は '&&'の前に大括弧を入れたいと思っています。それらが括弧を必要とする唯一の状況は、==が&& – ACV

1

だから、だから、コンパイラはこぶし2つのIを比較し

int val1 = returnt.getInt("date", iLoop); 
int val2 = Util.getBusinessDate(); 
int val3 = returnt.getInt("ins_type", iLoop); 
int val4 = Ref.getValue(SHM_USR_TABLES_ENUM.INSTRUMENTS_TABLE, "DEPO"); 
int val5 = returnt.getInt("ins_type", iLoop); 
int val6 = Ref.getValue(SHM_USR_TABLES_ENUM.INSTRUMENTS_TABLE, " DEPO2"); 

if (val1 == val2 && val3 == val4 || val5 == val6) {......... 

それを破ることができます。電子

val1 == val2 

、これがtrueの場合にのみ(理由& &の)場合には、2回の検査のいずれかが真のあなたを返す場合意味

val3 == val4 || val5 == val6 

で次のパートに行く場合if文が真である

コンパイラは、このような部分にチェックを分割します。これは、この読みやすさを向上させるために角括弧を追加するだけです。

+0

よりも高くないことを理解していないときです。要するに、追加のかっこを追加するかどうかの違いはありませんか? – user3890637

+0

あなたの例ではありません –