我見過的代碼,人們初始化浮點型變量是這樣的:初始化(C)時0.0f的意義是什麼?
float num = 0.0f;
是否有這之間的差異顯著,只是在做下面的下面?
float num = 0;
謝謝.. :)
我見過的代碼,人們初始化浮點型變量是這樣的:初始化(C)時0.0f的意義是什麼?
float num = 0.0f;
是否有這之間的差異顯著,只是在做下面的下面?
float num = 0;
謝謝.. :)
float x = 0有一個從int到float的隱式類型轉換。
float x = 0.0f沒有這樣的類型轉換。
float x = 0.0具有從double到float的隱式類型轉換。
根據編譯器的不同,隱式類型轉換可能要求編譯器生成額外的代碼。
嘛,嚴格地說,0是一個整數,所以float num = 0
需要從整數鑄造浮動。但是我想編譯器會爲你做這件事。我想人們使用0.0f
爲了強調這是一個浮點數,所以沒有人錯誤的整數。
Paul R已經寫了答案。你的第二個例子有一個整數初始化值。
您應該始終使用與正在初始化的變量相同類型的初始化程序。這可以避免在編譯時(理想情況下)或運行時(懶惰的編譯器:這是懶惰的,但?)的任何轉換。也許更重要的是,在一般情況下,轉換會導致一些奇怪的事情。
這裏的轉換應該完全符合預期,但它仍然是很好的風格並避免了編譯器警告。
用相同類型的文字常量初始化變量只是一種很好的做法。在這種情況下,你有一個浮點變量,你應該用一個浮點常量來初始化它,即0.0f
,而不是一個int(0
),然後它被隱式地轉換爲浮點數。
可能的原因是,他們曾經寫的東西,如:
float f = 1/i; // i an integer
已經調試,他們發誓永遠充分裝點文字,以獲得正確類型:
float f = 1.0f/i;
在這種情況下, .0
是確保劃分是浮點數,而不是整數除法。 f
是因爲不需要在double
中完成操作 - 我預計執行的可能性更大,其中1.0/i
由於沒有益處(軟件浮點仿真,無差別優化)而顯着更慢,而其中1.0f
明顯更慢沒有任何好處(如果double比float更快,那是因爲你有fp硬件,所以兩者之間的轉換速度會非常快,所以不會引入顯着的減速)。
一個你坐進裝飾文字的習慣,你可能會寫:
float f = 0.0f;
即使它有完全一樣float f = 0.0;
或float f = 0;
同樣的效果。
當然,作者本人可能沒有經歷過這個啓示,他們可能只是繼承了其他人的風格。
我只是寫0
。
R ..在評論中指出另一個答案,寫0也有一個好處,即當將來更改f
的類型時,不必更新文字以匹配。如果分配是自定義分開,然後改變:
float f = something
// some time later
f = 0.1f;
到:
double f = something;
// some time later
f = 0.1f;
可能是一個錯誤。最好使用0.1
,並讓編譯器在必要時截斷浮動。你可能會爭辯說,使用float
根本就是空間優化(如果不是時間的話),處理float和double之間任何差異的負擔應該算作執行該優化的開發人員成本。
我沒有看到任何理由使用這個初始化過程。但是,對於涉及浮點文字的操作,這將會很有用。例如, ;
float a=0.43, b;
b = 0.5*a + 2.56*a*a;
沒有後綴的浮點文字被認爲是雙打。因此,對於這種計算,「a」將被加倍輸入,RHS評估的最終答案將是雙倍。在分配過程中,RHS的雙倍值被浮動並賦值爲「b」。如果機器沒有雙精度FPU,則會降低性能。爲了避免這種情況,並使用float進行整個計算。後綴被使用。例如,
float a=0.43, b;
b = 0.5f*a + 2.56f*a*a;
許多重複,例如, [在目標C/C中的數字/浮動後的「f」)(http://stackoverflow.com/questions/2391818/f-after-number-float-in-objective-cc) – 2011-03-04 21:24:23
他們可能會離開f 。一朝被蛇咬十年怕井繩。 – 2011-03-04 21:25:11