2013-07-07 4 views
6

ich die folgenden Programme in Visual C renne ++ und Java:Verhalten von Vorinkrement und Postinkrement Operator in C und Java

Visual C++

void main() 
{ 
    int i = 1, j; 
    j = i++ + i++ + ++i; 
    printf("%d\n",j); 
} 

Ausgang:

6 

Java:

public class Increment { 
    public static void main(String[] args) { 
     int i = 1, j; 
     j = i++ + i++ + ++i; 
     System.out.println(j); 
    } 
} 

Ausgang:

7 

Warum der Ausgang in diesen beiden Sprachen unterschiedlich sind? Wie behandeln die beiden Sprachen pre- und postincrement-Operatoren anders?

+0

In C und C++ sind die Reihenfolge, in der Ausdrücke ausgewertet werden, und die Reihenfolge, in der die Nebenwirkungen angewendet werden, * unspezifiziert *; Das Ergebnis wird von Implementierung zu Implementierung variieren. Die entsprechenden Standards lassen ein solches Verhalten * undefiniert *, so dass der Compilerimplementierer sich nicht darum kümmern muss, wie er mit solchen Ausdrücken umgehen soll; Jedes Ergebnis wird als "korrekt" betrachtet. Java und C#, OTOH an, dass alle Ausdrücke von links nach rechts ausgewertet werden und dass alle Nebenwirkungen sofort angewandt werden, so Ausdrücke wie diese sind gut definiert. –

Antwort

2

In C/C++ Verhalten, weil in diesem Ausdruck nicht definiert ist i mehr als einmal ohne eine dazwischenliegende Sequenz Punkt geändert wird. lesen: What's the value of i++ + i++?

Natürlich in Java Verhalten von this kind of codes ist gut definiert. Unten ist meine Antwort für Java, Schritt für Schritt:

Am Anfang i ist 1.

j = i++ + i++ + ++i; 
// first step, post increment 
j = i++ + i++ + ++i; 
// ^^^ 
j = 1 + i++ + ++i; 
// now, i is 2, and another post increment: 
j = i++ + i++ + ++i; 
// ^^^^^^^^^ 
j = 1 + 2 + ++i; 
// now, i is 3 and we have a pre increment: 
j = i++ + i++ + ++i; 
// ^^^^^^^^^^^^^^^^ 
j = 1 + 2 + 4; 
j = 7; 
+0

Ihre Antwort für Java ist sehr gut, habe ich für c in Ihrer Antwort, wenn Sie Rolle nicht zu Ihrer Version gerne zurück. –

4

Die C++ Beispiel ruft nicht definiertes Verhalten. Sie dürfen einen Wert nicht mehr als einmal in einem Ausdruck ändern. zwischen Sequenzpunkten. [Editiert, um genauer zu sein.]

Ich bin nicht sicher, ob das gleiche für Java wahr ist. Aber es ist sicherlich wahr von C++.

Hier ist eine gute Referenz:
Undefined behavior and sequence points

+1

Zitat bitte? Ich habe noch nie davon gehört ... nur dass es nicht empfohlen wurde. – Mgetz

+0

@Mgetz: Oben bearbeitet, um eine definitive Referenz hinzuzufügen. Blättern nach unten zu „1) zwischen dem vorherigen und nächsten Sequenzpunkt ein Skalar-Objekt wird seine gespeicherte Wert modifiziert höchstens einmal durch die Auswertung eines Ausdrucks haben.“ –

Verwandte Themen