2015-09-17 22 views
5

Dieses aufgetreten, während ich einen wurde die Bekämpfung ‚Cracking the Coding Interview‘ Frage:Java Zuweisungsoperator Verhalten vs C++

Schreiben Sie eine Funktion eine Reihe an seinem Platz zu tauschen (dh ohne temporäre Variablen)

habe ich beschlossen, meine Lösung in Java zu schreiben (weil ich zur Verwendung von Java in meinem Praktikum Interview plane.)

ich kam mit einer Lösung, die ich die richtige Antwort war fast sicher war (weil ich es tat in eine Zeile):

public static void main(String args[]) { 
     int a = 5; 
     int b = 7; 
     a = b - a + (b = a); 
     System.out.println("a: " + a + " b: " + b); 
    } 

Sicher genug, dieser Code führt das gewünschte Ergebnis aus. a == 7 und b == 5.

Jetzt ist hier der lustige Teil.

Dieser Code wird nicht in C++ ausgeführt, noch ist diese Lösung in der Rückseite des Buches.

Also meine Frage ist: Warum genau funktioniert meine Lösung? Ich nehme an, Java macht Dinge anders als andere Sprachen?

+0

Hinweis: xor ........... –

+1

Ich denke (b = a) gibt nichts in C++ zurück. Oder vielleicht liege ich falsch, ich kenne C++ nicht. – Sweeper

+1

Für Java: http://stackoverflow.com/questions/12850676/return-value-of-assignment-operator –

Antwort

5

Sieht die Java Language Specification, section 15.7 (Evaluation Order):

Die Programmiersprache Java garantiert, dass die Operanden von Operatoren erscheinen in einer bestimmten Auswertung ausgewertet werden nämlich von links nach rechts.

So in Java ist die Bewertungsreihenfolge gut definiert und erfüllt, was Sie erwarten.

Die C++ - Spezifikation bietet keine solche Garantie; in der Tat ist es Undefined Behavior, so dass das Programm buchstäblich alles tun könnte.

Zitiert aus dem cppreference, unter Hinweis darauf, dass keine Sequenzierung Regel existiert für Operanden-Sequenzierung Operatoren Arithmetik:

Wenn eine Nebenwirkung auf eine skalare Objekt unsequenced relativ zu einem Wert Berechnung ist es, den Wert der Verwendung derselben Skalarobjekt, das Verhalten ist undefined.

+2

"Wenn ein Nebeneffekt bei einem Skalarobjekt im Vergleich zu einer Wertberechnung mit dem Wert desselben Skalarobjekts nicht sequenziert ist, ist das Verhalten nicht definiert." ([cppreference] (http://en.cppreference.com/w/cpp/language/eval_order)), wobei zu beachten ist, dass keine Sequenzregel existiert, um Operanden für arithmetische Operatoren zu sequenzieren. – Amadan

+0

@Amadan danke, ich habe das aufgenommen –