2012-03-23 19 views

Trả lời

36

Về C++, trích dẫn C++ 11 §5.3.1/9:

Các toán hạng của toán tử phủ định logic ! được ngữ cảnh chuyển đổi sang bool; giá trị của nó là true nếu toán hạng được chuyển đổi là falsefalse nếu không. Loại kết quả là bool.

Vì vậy là những gì thực sự liên quan ở đây là hành vi của static_cast<bool>(some_float) – trích dẫn §4.12/1:

Một prvalue của số học, liệt kê unscoped, con trỏ, hoặc con trỏ đến loại thành viên có thể được chuyển đổi sang giá trị của loại bool. Giá trị bằng không, giá trị con trỏ null hoặc giá trị con trỏ thành viên null được chuyển đổi thành false; bất kỳ giá trị nào khác được chuyển đổi thành true. Giá trị của loại std::nullptr_t có thể được chuyển đổi thành giá trị loại bool; giá trị kết quả là false.

Đưa những với nhau, 2.5f là một giá trị khác không và do đó sẽ đánh giá để true, mà khi phủ nhận sẽ đánh giá để false. I.e., !a == false.


Về C, trích dẫn C99 §6.5.3.3/5:

Kết quả của các nhà điều hành phủ định logic !0 nếu giá trị của toán hạng của nó so sánh không công bằng để 0, 1 nếu giá trị của toán hạng của nó so sánh với 0. Kết quả có loại int. Biểu thức !E tương đương với (0==E).

I.e. kết quả thực là giống như với C++, ngoại trừ kiểu.

+0

Cảm ơn! Tôi giả định điều này có nghĩa là trong C tôi muốn có được một int? –

+1

@Nathan: Vâng, đúng vậy. Trả lời chỉnh sửa với chi tiết. – ildjarn

+3

@NathanFig: Phải, kết quả của '!' Trong C luôn là 'int'. – caf

0

Xem cho chính mình:

#include <iostream> 

int main() 
{ 
    float a = 2.5; 

    if (!a) 
     std::cout << !a << "\n"; 

    else 
     std::cout << !a << "\n"; 
} 
+9

Vấn đề với việc "nhìn thấy chính mình" là bạn có thể quan sát hành vi không xác định hoặc được xác định, điều này chỉ cho bạn biết điều gì xảy ra trên nền tảng/trình biên dịch cụ thể của bạn, điều này không hữu ích khi biết những gì mong đợi về hành vi _well-defined_ . – ildjarn

+0

Bạn không thể "mong đợi" bất cứ điều gì từ hành vi "thực hiện xác định". Vậy "được xác định rõ" nghĩa là gì đối với bạn? – 01100110

+9

Chính xác, đó là lý do tại sao "xem cho chính mình" là một câu trả lời vô ích nếu hành vi được xác định thực hiện. Cảm ơn bạn đã đồng ý với quan điểm của tôi. :-P – ildjarn

7

Từ here

Một float sẽ được chuyển đổi sang false nếu chính xác của nó 0.0f,
Nó sẽ cũng đúng nếu nó không exacly 0.0f!
Inifinity cũng sẽ được chuyển thành true.

+2

Tôi không chắc chắn về sự phủ định của vô cực, vì vậy tôi đã kiểm tra ở đây là đầu ra http://ideone.com/WWoJB#view_edit_box –

+0

nếu chính xác + 0.0f, -0.0f có một bộ bit và ngược lại vẫn có một chút thiết lập –

+0

@ dwelch Tôi không biết điều đó, tôi đoán bạn học điều gì đó mới hàng ngày – cctan

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