2013-08-02 75 views
12

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)?
+1

Đâ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

+7

Tôi chỉ chạy cùng một mã và có "NIL" – John

+1

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

Trả lời

8

này trông giống như một lỗi trong trình biên dịch của Microsoft mà bạn nên gửi đến Connect. Tôi đã có thể sao chép nó trong Visual Studio Express 2010, nhưng không phải trong gcc: http://ideone.com/8qPRJd.

Bất kỳ biểu thức nào đánh giá thành giá trị số nguyên 0 phải tương đương với false. Đây chính là cách nó hoạt động với biến số float và cũng giống như vậy khi tôi thử nó với một số double.

+0

Tôi đồng ý. (BTW đánh bại tôi bằng 3 phút) – chux

+0

Lưu ý rằng không có chuyển đổi sang một loại số nguyên xảy ra trong float_expr: expr1: expr2. Thay vào đó, biểu thức đầu tiên của biểu thức có điều kiện là bắt buộc để có loại vô hướng và được so sánh với số không của loại đó (6.5.15: 4 trong C11). if (0.5) printf (…); in (và nếu (-0.0) printf (…); không). –

+0

Ngay cả với '/ Od' bạn có thể kiểm tra danh sách lắp ráp ... nó thẳng loại bỏ' (0.0? 1: 0) 'và thêm' mov eax, 1'. Tôi muốn nói một lỗi. Đặt một chữ '0.0' trong một if-expr làm cho assembly thích hợp được tạo ra (ngay cả khi tối ưu). – user7116

0

trở lại (0,0 1: 0) biên soạn để quay trở lại cố định 1. Trong trường hợp khác, biến dấu chấm động đã thực sự đánh giá, và 0.0 không tương đương với 0.

Các vấn đề liên quan