Il seguente codice genera diversi risultati sotto la modalità di debug e modalità di rilascio (utilizzando Visual Studio 2008):In modalità di rilascio, il comportamento del codice non è come previsto
int _tmain(int argc, _TCHAR* argv[])
{
for(int i = 0; i < 17; i++)
{
int result = i * 16;
if(result > 255)
{
result = 255;
}
printf("i:%2d, result = %3d\n", i, result) ;
}
return 0;
}
L'uscita di modalità di debug, che è come previsto :
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
L'uscita della modalità di rilascio, dove i: 15 risultato non è corretto:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
Scegliendo "Ottimizzazione -> Non ottimizzare" in Visual Studio in modalità di rilascio, il risultato di output sarà corretto. Tuttavia mi piacerebbe sapere perché il processo di ottimizzazione potrebbe portare a output errati.
Aggiornamento:
Come suggerito da Mohit JainBy, stampe:
printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;
L'uscita modalità di rilascio è corretto:
i: 0, result = 0, i*16=0
i: 1, result = 16, i*16=16
(...)
i:14, result = 224, i*16=224
i:15, result = 240, i*16=240
i:16, result = 255, i*16=256
Questo sembra un bug del compilatore (e piuttosto significativo). – WhozCraig
@WhozCraig Aggiunge semplicemente l'output di 'i * 16' nel post e il risultato è corretto. –
@juanchopanza: Dalla mia esperienza con MS e correzioni di errori su VS, risolvono tali bug dopo che li hanno informati, ma non applicano quelle correzioni alle versioni precedenti di VS, quindi se uno è costretto per qualche motivo a usare un vecchio versione di VS, quindi uno è bloccato con tali bug fino a quando non è possibile eseguire l'aggiornamento a una versione più recente. – Kaiserludi