Trong ví dụ bên dưới, nếu bỏ ghi chú float f = 0.0;
,
và thay thế return(0.0 ? 1 : 0);
bằng return(f ? 1 : 0);
.
Đầu ra là NIL
.so sánh hằng số dấu chấm động - (0.0? 1: 0)
Đây là mã của tôi:
/* file main.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86
cl -W4 -MTd -O2 -TC main.c -Fetest */
#include <stdio.h>
int my_func(void)
{
/* float f = 0.0; */
return(0.0 ? 1 : 0);
}
int main(void)
{
printf("%s\n", (my_func() ? "ONE" : "NIL"));
return 0;
}
Trên một máy tính Windows 32-bit, sử dụng Visual Studio mã này kết quả đầu ra:
ONE
- Tại sao
my_func()
trả về giá trịtrue
(1)? - Trình biên dịch C diễn giải như thế nào biểu thức này
(0.0 ? 1 : 0)
?
Đây có phải là vấn đề thực tế mà bạn phải đối mặt không? Đây có phải là thứ bạn có thể làm trong mã thực không? :-) – paxdiablo
Tôi chỉ chạy cùng một mã và có "NIL" – John
Chỉ cần một shot trong bóng tối - có lẽ trình biên dịch của bạn là so sánh các giá trị hex mà không cắt ngắn? ví dụ (int) 0 tương đương với 0x000000, nhưng với độ chính xác của dấu phẩy động, bạn có thể sẽ không nằm trên giá trị chính xác đó – John