2016-07-28 29 views
3
class Tester { 
    public static void main(String[] arg) { 
     byte b=10; 
     b +=(b<127)?b>-128? b+=10 :0 :5; 
     System.out.println(b); 
    } 
} 

ich weiß, dass die Bedingungen true und übernahmen die Kontrolle b+=10 so jetzt ausgewertet werden logisch ist b+=b+=10; den Wert von b und 10 Zugabe, die 20 auswertet, Zuweisen zu b. Jetzt kann ich es nicht weiter bewerten.Ich erwarte die Ausgabe 40 zu sein, aber ich habe 30

+2

Bitte formatieren Sie Ihren Code klarer, siehe oben, wie ich es gemacht habe –

+0

Was ist los, dass diese Aussage? Sie haben 2 Zuweisungen in der gleichen Zeile ... –

+0

Mögliches Duplikat von [Warum ist "a^= b^= a^= b;" anders als "a^= b; b^= a; a^= b;"] (http://stackoverflow.com/questions/22044163/why-is-abab-different-from-abbaab) –

Antwort

2

JLS 15.7.1. Evaluate Left-Hand Operand First hat ein ähnliches Beispiel:

Wenn die Bedienungsperson eine Verbindung-Zuweisungsoperator ist (§15.26.2), dann Auswertung des linken Operandensowohl die Erinnerung an die Variable enthält, die das linker Operand bezeichnet und Abrufen und Speichern des Wertes dieser Variablen zur Verwendung in der implizierten Binäroperation.

Beispiel 15.7.1-2. Implizite linke Operanden In Betreibern der Verbindung Assigment

Im folgende Programm die beiden Zuweisungsanweisungen beide holen und denken Sie daran, den Wert des linken Operanden, die 9, vor dem rechten Operanden der Additionsoperator ausgewertet wird, an welchem ​​Punkt die Variable 3.

class Test2 { 
    public static void main(String[] args) { 
     int a = 9; 
     a += (a = 3); // first example 
     System.out.println(a); 
     int b = 9; 
     b = b + (b = 3); // second example 
     System.out.println(b); 
    } 
} 

Dieses Programm erzeugt den Ausgang gesetzt:

12 
12 

daher in Ihrem Fall wird der ursprüngliche Wert von b (10) erinnert und auf das Ergebnis des ternären bedingten Operators hinzugefügt (die 20 ist, da der Wert von b+=10 das Ergebnis dieses Ausdrucks ist), geben Sie 30

1

Erste (b<127) ausgewertet was true so bewegt er b>-128? b+=10 in diesem b>-128 ausgewertet zu trennen, welche auch true ist so zu b+=10 bewegt er die b = 20 und fügt an der linken Seite des Ausdrucks macht in welcher Wert von 10 ist in b gespeichert. So b+=(b=20) macht b=30

+0

Wenn das der Fall wäre, dann macht b = 20 b gleich zwanzig, und dann würde' b + = (b = 20) 'es schaffen 40. Der entscheidende Schritt ist, dass als allererstes der ursprüngliche Wert von b gespeichert wird (10) und dass der zusammengesetzte Zuweisungsoperator den Wert der rechten Seite des Ausdrucks zum ursprünglichen gespeicherten Wert von addiert linke Seite. –