2016-08-22 2 views
-1

Warum unterscheidet sich die Ausgabe in den beiden folgenden Fällen? Es war Teil eines größeren Problem, dass ich gedebuggt haben und bis auf die AusgabeKlammern bei Verwendung des ternären Operators

public static void main(String[] args) {  

     String test = "hello"; 
     System.out.println(call() + test.charAt(0)=='h'?1:0); 
    } 

static int call() 
    { 
     return 1; 
    } 

Ausgang verengt: 0

Aber wenn ich einen geklam- mert hinzufügen, erhalte ich die erwartete Ausgabe

public static void main(String[] args) {  

     String test = "hello"; 
     System.out.println(call() + (test.charAt(0)=='h'?1:0)); 
    } 

static int call() 
    { 
     return 1; 
    } 

Output: 2 (wie erwartet)

Im ersten Aufruf wird Call() + test.charAt (0) gegen 'h' ausgewertet und 1 und 0 entsprechend zugeordnet? Was bedeutet, dass {1 + ascii Wert von 'h'} == 105 wird gegen ascii Wert von 'h' ausgewertet, was 104 ist?

+3

Lesen Sie mehr über [Operator Vorrang] (https://docs.oracle.com/javase/tutorial/ java/nutsandbolts/operators.html). –

+0

@AndyTurner, bitte keine downvotes. Ich habe die Lösung selbst ziemlich gut herausgefunden. Die Antworten unten haben so viele Stimmen bekommen, dass die Leute diese Frage lesen. – saltandwater

+0

Ich habe die Frage nicht abgelehnt. –

Antwort

4

Es gibt eigentlich kein Problem, die Operatoren haben Unterschiedsrangfolge.

Wenn Sie die Verbindung überprüfen, dass Andy Turner in seinem Kommentar hinzugefügt werden Sie diese Tabelle

enter image description here

finden Wie Sie die additive (+ und -) sehen kann, hat eine höhere Priorität gegenüber dem ternären Operator. Aus diesem Grund:

call() + test.charAt(0)=='h'?1:0 
^^^^^^^^^^^^^^^^^^^^^^^ 
    High precedence  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     Less precedence 

So können Sie die Rangfolge Klammern verwenden ändern:

call() + (test.charAt(0)=='h'?1:0) 
      ^^^^^^^^^^^^^^^^^^^^^^^ 
       High precedence  
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
     Less precedence 
2

Der Punkt ist nicht die ternäre Operator, aber die Tatsache, dass + voran ==:

call() + test.charAt(0)=='h'?1:0 

in jeder Lese äquivalent zu

(call() + test.charAt(0)) == 'h'?1:0 

Auch == höherer Priorität hat dann ?, so dies entspricht

((call() + test.charAt(0)) == 'h') ? 1 : 0 
Verwandte Themen