2010-11-19 8 views
-2

Mein Freund hat mir einen Witz:"C - C++" Witz über postfix/prefix Betrieb Bestellung

Frage: Was ist der Unterschied zwischen C und C++ ist?

A. Nichts, denn: (C - C++ == 0)

Ich habe versucht, zu ändern, und blieb stecken.

Blick auf diesen Code:

public class Test { 
    public static void main(String args[]) { 
     int c = 10;   
     System.out.println(c++ - c); 
     System.out.println(++c - c);   
    } 
} 

Warum es zurück:

-1 
0 

Ich verstehe, Postfix und Prefix Zuwachs. Warum ist das nicht das Ergebnis?

0 
1 
+4

Posted Code eine Warnung (Beispiel http://codepad.org/UPBqO38B) berichten ist niether C noch C++, retag bitte –

+2

Geck ... sin Wann haben sich Witze voll und ganz der Wahrheit angepasst? Indem sie die Regeln verbiegen, machen sie etwas lustig. Wenn Sie das wörtlich nehmen wollten, ist 'C - C++' ein UNDEFINIERTES VERHALTEN! – thecoshman

+3

@thecoshman: In C oder C++ ist es, aber nicht in allen Sprachen, die C-ähnliche Syntax verwenden. –

Antwort

10

Da in dem ersten Beispiel c beginnt 10. c++ Inkrementen c und liefert 10, so dass nun der zweite c zu 11 wertet, da sie inkrementiert wurde. Der ultimative ausgewertete Ausdruck ist also 10 - 11, was -1 entspricht.

Im zweiten Beispiel erhöht ++c erneut c, gibt aber 12 zurück, da es sich um ein Vorinkrement handelt. Die zweite c ergibt ebenfalls 12, da dies der neue Wert ist, der in c gespeichert ist. So schließlich, dass die Expression als 12 - 12 ausgewertet wird, die 0.

+0

Diese Antwort ist völlig falsch. Beide Beispiele haben ein undefiniertes Verhalten. –

+2

In Java? Bist du dir da sicher? – cdhowie

1

Der Unterschied entspricht ist in den Operatoren Sie verwenden ++ C und C++

C++ den Wert erhöhen, bevor es in der Berechnung verwendet wird ++ c bei der Berechnung wird der Wert erhöht, nachdem es auch

verwendet wird

Antwort des cdhowie erklärt es besser

1

Ob es gibt 0 oder -1 für die erste println und 0 oder 1 für die zweite ist nicht definiert. Es steht dem Compiler frei, zuerst die linke oder rechte Seite zu bewerten, und ob die Inkremente bis zur Auswertung der rechten Seite wirksam geworden sind, hängt vom Compiler ab (und tatsächlich könnte der Compiler einmal eine Sache machen und einmal die weiter)

Die Inkremente werden nur bei der nächsten sequence point garantiert. Subtraktion ist kein Sequenzpunkt.

EDIT: Bah, schrieb diese Antwort, wenn die Frage mit C/C++ markiert wurde. Sequence points don't apply to Java. Ich habe die Antwort gelassen, falls andere finden es sinnvoll, wenn man bedenkt, C/C++ Ausdrücke

+0

Es ist nicht undefiniert "Ob es 0 oder -1 für den ersten Ausdruck und 0 oder 1 für den zweiten Ausdruck gibt". Es ist undefiniertes Verhalten. Das heißt, es könnte 0, -1, 42, eine Zahl größer als 'INT_MAX', oder sogar Ihren Computer explodieren. –

+0

Wahr. In der Praxis wird es eine der Optionen sein, die ich angegeben habe. Aber du hast recht, du kannst dich nicht darauf verlassen –

2

Da c++ - c(c - c-incremented-by-one) wird, was -1 und ++c - c wird (c-incremented-by-one - c-incremented-by-one) die 0.

0

ist, weil der Zuwachs vor der ausgeführt wird, Operation in einem Fall, während die Inkrementierung nach der Operation in dem anderen Fall durchgeführt wird.

int c = 10; 
System.out.println(c); // output 10 
System.out.println(c++); // outputs 10 
System.out.println(c); // output 11 
System.out.println(++c); // output 12 
System.out.println(c); // output 12 
0

Das ist der Unterschied zwischen Postfix und Präfix Inkrement.

Hier ist ein schöner Text dazu:

http://www.java-samples.com/showtutorial.php?tutorialid=249

„Sowohl der Inkrementoperator (++) und der Dekrementoperator (-) gibt es in zwei Varianten:. Präfix und Postfix Die Vorsilbe Sorte geschrieben vor dem Variablennamen (++ myAge), die Postfix-Variante wird nach (myAge ++) geschrieben

In einer einfachen Anweisung ist es nicht wichtig, was Sie verwenden, sondern in einer komplexen Anweisung, wenn Sie inkrementieren (oder dekrementiert) eine Variable und dann das Ergebnis einer anderen Variablen zuzuordnen, ist es sehr wichtig. Der Präfix-Operator ist vor der Zuweisung ausgewertet, wird das Postfix danach ausgewertet.

Die Semantik des Präfix ist dies: Inkrementieren Sie den Wert und holen Sie es dann. Die Semantik von Postfix ist anders: Hol den Wert und inkrementiere das Original.

Dies kann zunächst verwirrend sein, aber wenn x eine ganze Zahl, deren Wert 5 und Sie schreiben

int a = ++ x; Sie haben den Compiler angewiesen, x zu erhöhen (6) und dann diesen Wert zu holen und ihn a zuzuweisen. Somit ist ein ist jetzt 6 und x ist jetzt 6.

Wenn nach dies zu tun, schreiben Sie

int b = x ++; Sie haben jetzt den Compiler angewiesen, den Wert in x (6) zu holen und ihn b zuzuordnen, und dann zurückzugehen und x zu erhöhen. Somit b ist nun 6, aber x ist jetzt 7. Listing unten zeigt die Verwendung und die Auswirkungen beiden Typen.“

0

ich diesen C++ Code verwenden

Der Grund ist einfach. Der Operator ++ erstellt eine Kopie von der var, erhöhe den Wert und gebe dann das kopierte val zurück Unter der Annahme, dass die Operatoren von links nach rechts ausgewertet werden, wird es 10-10 (dann inc C) passieren, also immer 0. In den meisten Fällen ist je nach Reihenfolge 'undefiniertes Verhalten' und einige Compiler wie gcc wird

int main() 
{ 
int c=10; 
printf("%d", c-c++); 
}