我無法在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);
我無法在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);
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);
使用將被自動轉換整數漂浮。
在這種情況下,兩者之間沒有(實際的)區別。
這是一個C的事情 - 浮點文字是雙精度(雙)默認情況下。添加一個f後綴使得它們具有單精度(浮點數)。
您可以使用整型在這裏指定的值,在這種情況下,將沒有什麼區別,但使用正確的類型是一個很好的習慣進入 - 一致性一般一件好事,如果你需要改變這些值稍後會讓你第一眼知道它們是什麼類型。
這幾乎可以肯定來自C語言,反映了使用'float'而不是'double'類型的願望。它與數字後綴L相似,表示它們是長整數。你可以使用整數,編譯器會自動轉換(對於這個特定的場景)。
從C.它表示浮點常量。您可以省略「f」和「.0」,並在您的示例中使用整數,因爲將int隱式轉換爲浮點數。
有時候會有差異。
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. */
源代碼中的浮點文字被解析爲double。將它賦值給一個float類型的變量會失去精度。很多精確度,你扔掉7位有效數字。 「f」後綴讓你告訴編譯器:「我知道我在做什麼,這是有意的,不要誤解我的意思。」
產生bug的機率不是那麼小btw。很多程序都在考慮浮點比較的錯誤或者假設0.1是完全可以代表的。
如果有疑問,請檢查彙編器輸出。比如寫一個小片斷最小的即是這樣
#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
。認爲應該表明是否存在真正的差異。我認爲太多的人有他們認爲編譯器所做的願景,但在一天結束時,人們應該知道如何驗證任何理論。
它通常告訴編譯器該值是一個float
,即浮點整數。這意味着它可以存儲整數,小數值和指數,例如1
,0.4
或1.2e+22
。
它告訴計算機這是一個浮點數(我假設你在談論c/C++)。如果數字後沒有f,則認爲它是雙精度或整數(取決於是否有小數)。
3.0f -> float
3.0 -> double
3 -> integer
你所說的f
可能是爲了告訴編譯器它正在使用float。當您省略f
時,通常會翻譯爲雙倍。
兩者都是浮點數,但float
比double
使用更少的位(因此更小且精度更低)。
理論上,編譯器可能不夠聰明,無法在編譯時將它們轉換爲浮點數,並會使用四個int-> float轉換(即最慢轉換之間的轉換)減慢執行速度。雖然在這種情況下幾乎不重要,但如果需要,指定正確的f總是更好:在表達式中,沒有右側說明符的常量可能會強制將整個表達式轉換爲double,並且如果處於緊密循環中,性能命中可能是顯。 – 2010-03-06 11:18:27