2013-07-07 23 views
6

sto correndo i seguenti programmi in Visual C++ e Java:Comportamento di preincremento e il post-operatore in C e Java

Visual C++

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

uscita:

6 

Java:

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

uscita:

7 

Perché l'uscita in queste due lingue sono diverse? In che modo entrambe le lingue trattano gli operatori di pre e postincremento in modo diverso?

+0

In C e C++, l'ordine in cui vengono valutate le espressioni e l'ordine in cui vengono applicati gli effetti collaterali sono * * non specificato; il risultato varierà dall'implementazione alla realizzazione. I rispettivi standard lasciano un simile comportamento * indefinito * in modo che l'implementatore del compilatore non debba preoccuparsi di come gestire tali espressioni; qualsiasi risultato è considerato "corretto". Java e C#, OTOH, specificano che tutte le espressioni vengono valutate da sinistra a destra e che tutti gli effetti collaterali vengono applicati immediatamente, quindi espressioni come questa sono ben definite. –

risposta

2

In C/C++ comportamento è indefinito perché In questa espressione i viene modificato più di una volta senza un punto intermedio sequenza. leggi: What's the value of i++ + i++?

Ovviamente nel comportamento Java di this kind of codes è ben definito. Di seguito è la mia risposta per Java, passo dopo passo:

All'inizio i è 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

la tua risposta è molto buona per Java, ho aggiunto per c nella tua risposta, se non ti piace tornare alla tua versione. –

4

L'esempio C++ evoca un comportamento non definito. Non è necessario modificare un valore più di una volta in un'espressione. tra punti di sequenza. [Modificato per essere più preciso.]

Non sono sicuro se lo stesso vale per Java. Ma è certamente vero per C++.

Ecco un buon riferimento:
Undefined behavior and sequence points

+1

citazione per favore? Non ne ho mai sentito parlare ... solo che non era raccomandato. – Mgetz

+0

@Mgetz: modificato sopra per aggiungere un riferimento definitivo. Scorri verso il basso fino a "1) Tra il punto di sequenza precedente e quello successivo, un oggetto scalare deve avere il suo valore memorizzato modificato al massimo una volta dalla valutazione di un'espressione." –