2012-12-05 19 views
11

Eventuali duplicati:
Could anyone explain these undefined behaviors (i = i++ + ++i , i = i++, etc…)
increment values in printfIn C/C++ è x [i] * y [i ++] sempre uguale a x [i] * y [i]

Ho due doppi array x e e intero i. La mia domanda è se la dichiarazione:

double res = x[i] * y[i++]; 

è sempre uguale alla dichiarazione:

double res = x[i] * y[i]; 
i++; 

E 'possibile che alcuni compilatori cambierebbero x[i] * y[i++] in y[i++] * x[i], che ovviamente produce risultati diversi?

+0

Perché è importante? Se vuoi un ordine specifico, basta scriverlo in questo ordine. –

+0

@BoPersson. Ho pensato di scrivere spiegazioni perché ne ho bisogno, ma non volevo rovinare la domanda. A breve, ho bisogno di accelerare la funzione 'double vectors_dot_product (double * x, double * y, int n);' e ho trovato che 'x [i] * y [i ++] + x [i] * y [i ++] +. ..; 'è più veloce di' x [i] * y [i] + x [i + 1] * y [i + 1] + ...; ' – Serg

risposta

13

No - x[i] + y[i++] ha un comportamento non definito. Stai modificando il valore di i e anche utilizzando il valore i senza un punto di sequenza intermedio, che restituisce un comportamento non definito .


  1. In C++ 11 standard ha eliminato la terminologia "punto sequenza", ma l'effetto rimane la stessa - i due sono non ordinata rispetto all'altro.
+1

+1 prima risposta con la lingua corretta. – slebetman

+3

Questo non ha nulla a che fare con la commutatività dell'operatore di moltiplicazione. Se l'operazione era 'x [i] - y [i ++]' (che non può essere invertita), il comportamento di 'i' in questa situazione sarebbe ancora indefinito. –

8

No, non è definito quando si verifica l'incremento.

+8

Non solo quando si verifica l'incremento. Il comportamento è ** interamente ** non definito: modifica 'i' e ne legge il valore senza un punto di sequenza intermedio. –

+1

@Pete: Bene, quando verrà il fattorino della pizza alla mia porta? ;) – fredoverflow

+2

@FredOverflow - chiedi al tuo fornitore di compilatori. –

1

No,

valore i ++ + i ++ sono undefined in C e C++.

se si legge una variabile due volte in un'espressione in cui viene anche scritta, il risultato non è definito. Non farlo. Un altro esempio è:

v[i] = i++; 

Undefined significa COMPILER DIPENDENTE.
Alcuni compilatori potrebbero avvertirti anche come non definiti perché l'ordine di valutazione. Un'ottima reference per C++

1http://www.stroustrup.com/bs_faq2.html#evaluation-order

+0

Ha ancora bisogno di un po 'di lavoro - 'v [i] = i ++;' non è definito anche se potrebbe non coinvolgere alcuna funzione o passare argomenti a tutti. –

+0

@GrijeshChauhan, grazie per il link. – Serg

+0

@Serg: Welcome serg! Mi fa piacere se posso aiutare :) –

6

Il codice modifica i e usa il valore senza un punto intermedio sequenza, in modo che il comportamento è indefinito. La definizione della lingua non impone alcun requisito qui.

+0

Interessante che tu, tra tutti, non menzioni il fatto che C++ 11 non usa più il "punto di sequenza". :-) –

+0

@JerryCoffin: a volte è meglio mantenere le cose semplici. –

+0

+1. C'è qualcosa da dire per la semplicità di "abbandona la fede, voi tutti che entrate qui". –

Problemi correlati