2012-03-23 41 views
23

我認爲這只是返回一個int。還有什麼我應該知道的嗎? C/C++的差異?當你邏輯不是浮動時會發生什麼?

float a = 2.5; 
!a; // What does this return? Int? Float? 
+2

可能的答案[here](http://stackoverflow.com/questions/1969620/c-float-to-bool-conversion) – cctan 2012-03-23 03:32:55

回答

36

關於C++,引用C++ 11§5.3.1/ 9:

邏輯非操作者!根據上下文轉換爲bool的操作數;如果轉換後的操作數是falsefalse,則其值爲true。結果的類型是bool

那麼什麼是真正此相關的是static_cast<bool>(some_float) –報價行爲§4.12/ 1:

算術,無範圍的枚舉,指針,或指針的成員A型prvalue可轉換爲類型bool的價值。零值,空指針值或空成員指針值被轉換爲false;任何其他值轉換爲truestd::nullptr_t類型的價值可以轉換爲bool類型的價值;結果的值是false

把那些一起,2.5f是一個非零值,並且將因此計算爲true,其否定將計算爲false時。即,!a == false


關於C,引用C99§6.5.3.3/ 5:

邏輯非操作者!的結果是0如果操作數的值,如果比較值不等於01其操作數的比較等於0。結果爲int。表達式!E相當於(0==E)

I.e.最終結果與C++相同,除了類型。

+0

謝謝!我認爲這意味着在C我會得到一個int? – 2012-03-23 03:36:10

+1

@Nathan:是的,沒錯。回答編輯的細節。 – ildjarn 2012-03-23 03:39:01

+3

@NathanFig:對,C中'!'的結果總是一個'int'。 – caf 2012-03-23 03:40:41

0

見自己:

#include <iostream> 

int main() 
{ 
    float a = 2.5; 

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

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

「爲自己查看」的問題是,您可以觀察到未定義的或實現定義的行爲,它只會告訴您在特定的平臺/編譯器上發生了什麼,在知道希望在_well-defined_行爲中期望什麼時沒有用。 – ildjarn 2012-03-23 03:35:24

+0

您無法「期待」「實施定義」行爲中的任何內容。那麼,什麼是「明確的」對你來說意味着什麼? – 01100110 2012-03-23 03:37:27

+9

準確地說,這就是爲什麼如果行爲是實現定義的,那麼「爲自己查看」是無用的答案。感謝您同意我的觀點。 :-P – ildjarn 2012-03-23 03:41:27

7

here

如果恰好0.0F浮子將被轉換爲false,
這將是如果它不是exacly 0.0F也是如此!
Inifinity也將被轉換爲true。

+2

我不確定無限的否定,所以我在這裏查看的是輸出http://ideone.com/WWoJB#view_edit_box – 2012-03-23 04:41:11

+0

如果完全+ 0.0f,-0.0f有一點設置和倒置仍然有點設置 – 2012-03-23 16:58:40

+0

@dwelch我不知道,我想你學習一些新的東西每天 – cctan 2012-03-26 01:04:18

相關問題