2016-04-14 12 views
0

Die folgende Anweisung funktioniert ohne Probleme, aber bitte kann jemand erklären warum, ich hatte unter dem Eindruck, es sollte eine zusätzliche Reihe von Klammern vor der && sein? Aber selbst mit dem () fehlt es immer noch.Java Wenn und Oder Anweisung

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

Welcher Check wird Ihrer Meinung nach durchgeführt? – Stultuske

+3

Der logische UND-Operator hat eine höhere Priorität als der logische ODER-Operator. Die Priorität bestimmt, in welcher Reihenfolge Ausdrücke Ihres Ausdrucks ausgewertet werden. – Ralf

Antwort

4

in kurzen Worten Ihre Aussage ist wie

if (A && B || C) { 


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

die & & bindet "härter", dann die "||" so wird es zuerst ausgewertet.

, wenn Sie die Klammern wie

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

das Ergebnis gesetzt ist das gleiche. Zunächst wird die Expression innerhalb neigbaren Metallbügel (A & & B) wird ausgewertet und dann wird das Ergebnis im Vergleich zu C

wenn Sie Klammern wie

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

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

in diesem Fall den Ausdruck in der Klammer B gesetzt || C wird zuerst ausgewertet, und dann wird & & ausgewertet.

Also ... Es hängt davon ab, was Sie ausdrücken/überprüfen möchten?

+1

0 && 0 => 0. so 0 || 1 ist 1? –

+1

Ach ja, du hast Recht. Ich habe es in meinem Kopf versaut. Mein Fehler. :) – Thomas

-3

Die zusätzliche Halterung Sie denken, sind notwendig, erklären diese werden implizit durch Java;)

+0

Vielen Dank an alle für Ihre Kommentare. Kurz gesagt, wenn ich die zusätzliche Klammer von nicht hinzufügen, wird der Code immer noch wie erwartet funktionieren? Ich habe mit und ohne getestet und es macht keinen Unterschied. – user3890637

4

Mein alter Universitätsprofessor verwendet, vielleicht eher unpassend zu sagen, dass überschüssige Klammern Quiche Esser sind und für Mädchen.

Lernen Sie Ihre Operator-Vorrang-Tabellen auswendig. Der Code entspricht

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"))) { 

heißt== zuerst ausgewertet wird, dann &&, dann ||. Beachten Sie, dass die letzten beiden kurzgeschlossen sind, so dass die Auswertung stoppt, sobald das Ergebnis bekannt ist.

Wenn Sie erfahrener werden, finden Sie die Version, die ich eingefügt habe erheblich schwieriger zu lesen.

+1

"Sie werden feststellen, dass die Version, die ich eingefügt habe, wesentlich schwieriger zu lesen ist" - nicht, wenn Sie Leerzeichen hinzufügen und die Absicht verwenden, Gruppen hervorzuheben;) – Thomas

+0

Aber finden Sie nicht if ((vulgär? – Bathsheba

+1

Ja, es sieht ekelhaft aus.Ich würde wahrscheinlich keine Klammern für '== Ausdrücke verwenden, aber sie werden in den meisten Fällen verstanden. Es ist wahrscheinlicher, dass Entwickler mehr Probleme mit der Präzedenz von' && 'über' || 'haben könnte dort Klammern verwenden. – Thomas

-2

Weil == höhere Priorität hat als &&.

+0

Das ist nicht einmal relevant, die Frage betrifft '&&' und '||'. – Thomas

+0

Er möchte Klammern vor '&&' setzen. Die einzige Situation, wenn er diese Klammern dort haben wollte, wenn er nicht versteht, = = ist höher als && – ACV

1

lässt es So brechen

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) {......... 

So der Compiler die Faust zwei i vergleicht.e

val1 == val2 

Wenn und nur wenn (wegen der & &) das wahr ist es zum nächsten Teil gehen die

val3 == val4 || val5 == val6 

Welche, wenn einer der beiden Schecks Mittel liefert true Ihre if-Anweisung wird wahr

Der Compiler wird die Prüfungen in Teile wie diese brechen Sie müssten nur Klammern hinzufügen, um dies lesbarer zu machen.

+0

Also kurz gesagt macht es keinen Unterschied, ob ich die zusätzlichen Klammern hinzufüge oder nicht? – user3890637

+0

Nicht für Ihr Beispiel Nr –