Tôi giả định điều này chỉ trả về một int. Có điều gì khác đang xảy ra mà tôi nên biết không? Sự khác biệt C/C++?Điều gì xảy ra khi bạn hợp lý không phải là một phao?
float a = 2.5;
!a; // What does this return? Int? Float?
Tôi giả định điều này chỉ trả về một int. Có điều gì khác đang xảy ra mà tôi nên biết không? Sự khác biệt C/C++?Điều gì xảy ra khi bạn hợp lý không phải là một phao?
float a = 2.5;
!a; // What does this return? Int? Float?
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 sangbool
; giá trị của nó làtrue
nếu toán hạng được chuyển đổi làfalse
vàfalse
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ànhfalse
; bất kỳ giá trị nào khác được chuyển đổi thànhtrue
. Giá trị của loạistd::nullptr_t
có thể được chuyển đổi thành giá trị loạibool
; 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
!
là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ới0
. Kết quả có loạiint
. 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.
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";
}
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
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
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
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.
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 –
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 –
@ 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âu trả lời có thể có [tại đây] (http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan