Domanda

int i=2;
i = ++i + ++i + ++i;

Il che è più corretto? Il risultato di Java di 12 o C = 13. Oppure, se non è una questione di correttezza, si prega di elaborare.

È stato utile?

Soluzione

Non c'è nulla come più corretto. In realtà è indefinito e la sua chiamata errore di sequenza Point. http://en.wikipedia.org/wiki/Sequence_point

Altri suggerimenti

Java garantisce ( § 15.7.1 ) che saranno valutate da sinistra a destra, dando 12. In particolare, ++ ha una precedenza che +. Quindi si lega prima quelli, poi associa le operazioni di addizione da sinistra a destra

i = (((++i) + (++i)) + (++i));

§15.7.1 dice l'operando di sinistra viene valutata per prima, e §15.7.2 dice entrambi gli operandi vengono valutati prima dell'operazione. Così si valuta come:

i = (((++i) + (++i)) + (++i));
i = ((3 + (++i)) + (++i)); // i = 3;
i = ((3 + 4) + (++i)); // i = 4;
i = (7 + (++i)); // i = 4;
i = (7 + 5); // i = 5;
i = 12;

In C, è comportamento indefinito di modificare una variabile due volte senza un punto sequenza tra.

Il risultato Java ha senso per me perché gli operatori danno il risultato che ci si aspetta, ma nessun programma serio dovrebbe contenere una dichiarazione come questa.

EDIT: Sto divertito che questa risposta una frase è stata la mia più alta risposta segnato della serata (rispetto alle decine di altre risposte che ho postato, alcune con pagine di esempi di codice). Così è la vita.

In C questo è un comportamento indefinito. Non v'è alcun comportamento corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top