Il seguente codice richiama UB?Il seguente codice richiama UB?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
Il seguente codice richiama UB?Il seguente codice richiama UB?
int main(){
volatile int i = 0;
volatile int* p = &i;
int j = ++i * *p;
}
sì che è indefinito Comportamento perché si sta tentando di violare la seconda regola ..
Lo standard prevede che
1) Tra il precedente e il successivo punto di sequenza di un oggetto ha la propria valore memorizzato modificato al massimo una volta dalla valutazione di un'espressione.
2) Inoltre, è possibile accedere al valore precedente solo per determinare il valore da memorizzare.
Nota: L'ordine di valutazione degli operandi di *
operatore specificato e *p
non è altro che i
.
Intendi l'operatore '*' immagino ... –
Sì typo: P ....... modificato il mio post :) –
@Prasoon: Non è giusto modificare i post di altri solo per formattare il loro codice con il tuo preferito stile di indentazione. Non hai letto le linee guida StackOverflow - "Rispetto all'autore originale"? (> _ <) –
Sì - o ++ I o * p (che sono io) può essere valutato prima.
ma indipendentemente dall'ordine di valutazione il risultato sarebbe lo stesso giusto? –
No. Se ++ i viene valutato per primo, si ha 1 * 1. Se * p viene valutato per primo, si ha 1 * 0. –
Oops! Come potrei non accorgermene! Grazie per la risposta! –
@Prasoon: Non è corretto modificare i post di altri solo per formattare il codice con il proprio stile di indentazione preferito. Non hai letto le linee guida StackOverflow - "Rispetto all'autore originale"? (> _ <) –