Đoạn mã dưới đây tạo ra kết quả khác nhau dưới chế độ debug và chế độ phát hành (sử dụng Visual Studio 2008):Trong chế độ phát hành, hành vi mã không như mong đợi
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;
}
Kết quả của chế độ debug, được như mong đợi :
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 240
i:16, result = 255
kết quả của chế độ phát hành, trong đó i: 15 kết quả là không đúng:
i: 0, result = 0
i: 1, result = 16
(...)
i:14, result = 224
i:15, result = 255
i:16, result = 255
Bằng cách chọn "Tối ưu hóa -> Không tối ưu hóa" trong Visual Studio trong chế độ phát hành, kết quả đầu ra sẽ chính xác. Tuy nhiên tôi muốn biết lý do tại sao quá trình tối ưu hóa có thể dẫn đến đầu ra sai.
Cập nhật:
Theo đề nghị của Mohit JainBy, in theo:
printf("i:%2d, result = %3d, i*16=%d\n", i, result, i*16) ;
Các chế độ phát hành ra là đúng:
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
Trông giống như lỗi trình biên dịch (và một lỗi khá quan trọng ở đó). – WhozCraig
@WhozCraig Chỉ cập nhật đầu ra của 'i * 16' trong bài đăng và kết quả là chính xác. –
@juanchopanza: Từ kinh nghiệm của tôi với MS và sửa lỗi cho VS họ sửa lỗi như vậy sau khi họ được thông báo về họ, nhưng không áp dụng các bản sửa lỗi cho phiên bản cũ hơn của VS, vì vậy nếu một lý do buộc phải sử dụng Phiên bản của VS, sau đó một là bị mắc kẹt với các lỗi như vậy cho đến khi người ta có thể nâng cấp lên một phiên bản mới hơn. – Kaiserludi