2010-09-22 10 views
8

Tôi chỉ chạy vào dòng mã này:Nếu (gấp đôi) hợp lệ C++?

if(lineDirection.length2()){...} 

nơi length2 trả về một double. Nó loại câu đố tôi rằng 0,0 là tương đương với 0, NULL, và/hoặc false.

Đây có phải là phần của tiêu chuẩn C++ hoặc là hành vi không xác định không?

+1

Đồng thời xem phần NaN –

Trả lời

9

Đó là một hành vi rất nhiều tiêu chuẩn (Boolean chuyển đổi)

$ 4,12/1 - "Một rvalue của số học, liệt kê, con trỏ, hoặc con trỏ đến loại thành viên có thể được chuyển đổi sang một rvalue của giá trị số không, giá trị con trỏ null hoặc thành viên null giá trị con trỏ được chuyển thành false; bất kỳ giá trị nào khác được chuyển thành true. "

5

Có - so sánh là 0 (0,0) và trả về false nếu kết quả bằng 0, và ngược lại.

Hành vi được kế thừa từ C, xử lý so sánh tương tự theo cùng một cách.

0

Khi bạn so sánh không có toán tử, bạn đang so sánh "so với true", để mọi loại biến được chọn là boolean (trường hợp đơn giản) hoặc khác. Các kiểu biến số có giá trị sai của chúng được định nghĩa là "0", "0.0" hoặc hơn, vì vậy khi bạn so sánh chúng "so với true", so sánh của bạn sẽ trả về false.

7

Cần lưu ý rằng mã này cực kỳ giòn cho các biểu diễn dấu phẩy động. Mã này sẽ hoạt động nếu và chỉ khi giá trị dấu phẩy động chính xác là 0, điều này thực sự không có khả năng xảy ra trong hầu hết các trường hợp. Nó có thể không có trong trường hợp cụ thể này, nhưng nó chắc chắn nên được ghi lại/nhận xét nếu có. Trong thực tế tất cả các tình huống khác, bạn cần quyết định số "epsilon value" xác định phạm vi số dấu phẩy động mà bạn xem là "giống nhau" - nếu không, các so sánh của bạn rất có khả năng làm bạn ngạc nhiên ở góc (và thường không phải góc) các trường hợp.

+3

+1 để chỉ ra độ giòn của mã. Điều này sẽ phá vỡ trong nhiều điều kiện có thể không rõ ràng: 'double d = 0.0/-1.0; nếu (d) 'sản lượng sai, như' -0.0! = 0.0', và tương tự như vậy đối với nhiều hoạt động khác có thể mang lại giá trị '0' đủ gần với giá trị' 0' không chính xác ** '0.0' –

+0

Chỉ cần chắc chắn. Có thể mã "double x = 0.0; if (x) {cout <<" x không phải là null ";}" in "x không phải là null"? –

+3

@David Rodríguez - dribeas: Không, '-0.0 == 0.0', ngay cả khi các mẫu bit sẽ khác nhau. Điều này cực kỳ quan trọng. Biểu thức '(x == 0.0 || (1.0/x))' sẽ _not_ đánh giá '1.0/x' khi điều đó sẽ gây ra một phép chia bằng 0. – MSalters

0

Nếu length2 trả về 0.0, nó sẽ bị coi là sai. Nhưng bạn có thể nhận được kết quả đáng ngạc nhiên với so sánh này. Sử dụng tốt hơn giá trị epsilon như MadKeithV được đề xuất trong so sánh điểm nổi.