2010-03-06 98 views
91

我無法在Apple文檔中找到它:數字在這裏表示後的「f」是什麼?這是來自C還是Objective-C?沒有把這個加到常數上有什麼區別嗎?Objective-C/C中的數字/浮點數後的「f」

CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); 

你能解釋爲什麼我不只是寫:

CGRect frame = CGRectMake(0, 0, 320, 50); 

回答

81
CGRect frame = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); 

使用浮點常量。 (常數0.0通常聲明在Objective-C雙;把一個f在末端 - 0.0F - 聲明常數作爲(32位)的浮點數。)

CGRect frame = CGRectMake(0, 0, 320, 50); 

使用將被自動轉換整數漂浮。

在這種情況下,兩者之間沒有(實際的)區別。

+24

理論上,編譯器可能不夠聰明,無法在編譯時將它們轉換爲浮點數,並會使用四個int-> float轉換(即最慢轉換之間的轉換)減慢執行速度。雖然在這種情況下幾乎不重要,但如果需要,指定正確的f總是更好:在表達式中,沒有右側說明符的常量可能會強制將整個表達式轉換爲double,並且如果處於緊密循環中,性能命中可能是顯。 – 2010-03-06 11:18:27

2

這是一個C的事情 - 浮點文字是雙精度(雙)默認情況下。添加一個f後綴使得它們具有單精度(浮點數)。

您可以使用整型在這裏指定的值,在這種情況下,將沒有什麼區別,但使用正確的類型是一個很好的習慣進入 - 一致性一般一件好事,如果你需要改變這些值稍後會讓你第一眼知道它們是什麼類型。

1

這幾乎可以肯定來自C語言,反映了使用'float'而不是'double'類型的願望。它與數字後綴L相似,表示它們是長整數。你可以使用整數,編譯器會自動轉換(對於這個特定的場景)。

2

從C.它表示浮點常量。您可以省略「f」和「.0」,並在您的示例中使用整數,因爲將int隱式轉換爲浮點數。

41

有時候會有差異。

float f = 0.3; /* OK, throw away bits to convert 0.3 from double to float */ 
assert (f == 0.3); /* not OK, f is converted from float to double 
    and the value of 0.3 depends on how many bits you use to represent it. */ 
assert (f == 0.3f); /* OK, comparing two floats, although == is finicky. */ 
4

源代碼中的浮點文字被解析爲double。將它賦值給一個float類型的變量會失去精度。很多精確度,你扔掉7位有效數字。 「f」後綴讓你告訴編譯器:「我知道我在做什麼,這是有意的,不要誤解我的意思。」

產生bug的機率不是那麼小btw。很多程序都在考慮浮點比較的錯誤或者假設0.1是完全可以代表的。

49

如果有疑問,請檢查彙編器輸出。比如寫一個小片斷最小的即是這樣

#import <Cocoa/Cocoa.h> 

void test() { 
    CGRect r = CGRectMake(0.0f, 0.0f, 320.0f, 50.0f); 
    NSLog(@"%f", r.size.width); 
} 

然後編譯它與-S選項彙編。

gcc -S test.m 

保存彙編輸出在test.s文件並刪除從常量.0f和重複編譯命令。然後執行新的test.s和前一個的diff。認爲應該表明是否存在真正的差異。我認爲太多的人有他們認爲編譯器所做的願景,但在一天結束時,人們應該知道如何驗證任何理論。

+11

+1「檢查裝配輸出」!非常有用的提示,瞭解金屬如何工作。 – 2010-06-25 07:19:30

+10

即使沒有任何'-O',輸出結果也是一樣的。我在i686-apple-darwin10-gcc-4.2.1(GCC) – kizzx2 2011-04-13 14:57:58

+2

我嘗試了上面的例子,LLVM版本7.0.0(clang-700.0.65)x86_64-apple-darwin15.0.0和.out文件是同樣如此。 – Nick 2015-08-21 00:00:22

0

它通常告訴編譯器該值是一個float,即浮點整數。這意味着它可以存儲整數,小數值和指數,例如10.41.2e+22

23

它告訴計算機這是一個浮點數(我假設你在談論c/C++)。如果數字後沒有f,則認爲它是雙精度或整數(取決於是否有小數)。

3.0f -> float 
3.0 -> double 
3 -> integer 
+0

是C++標準的這種約定的一部分,還是在編譯器中找到? – jxramos 2015-09-15 19:52:30

+1

據我所知,它是標準的一部分(如果我錯了,有人糾正我)。我可以找到的最快參考是http://open-std.org/jtc1/sc22/open/n2356/lex.html#lex.fcon,但如果您關心尋找它們,可能會有更多最新的參考資料。 – NickLH 2015-09-16 20:10:31

3

你所說的f可能是爲了告訴編譯器它正在使用float。當您省略f時,通常會翻譯爲雙倍。

兩者都是浮點數,但floatdouble使用更少的位(因此更小且精度更低)。