2014-01-08 63 views
8

鑑於這種出發點:我應該明確trunc?

double y = readDoubleValue(); 

是否有任何C顯著差異++之間:

int x = y; 

int x = trunc(y); 

哪一個,我應該更喜歡哪個?如果其他人(包括我未來的自己:))讀取我的代碼,那麼在第二個代碼中,我更清楚地知道我確切知道我在做什麼,但它需要包含庫。

參考: Is there a trunc function in C++?

+2

如果我看着'trunc'版本,我會想'什麼?當然trunc不會......'然後我會浪費幾分鐘無故讀文檔。所以如果有的話,它爲我混淆了代碼。 – juanchopanza

+3

這似乎是一個不常見的觀點,至少與編寫代碼的人必須保持一致,但*註釋可以!*。我會寫'int x = y; //故意截斷「或更好的東西(更好 - 解釋*爲什麼*,但我不知道這段代碼)。 – BoBTFish

回答

6

只需使用static_cast<int>(y)會給你正在尋找的所有優點:

  1. 截斷
  2. 鑄造
  3. 爲了清晰明確的轉換。

的原因,我也不會用trunc()

  1. 它不是常見的,大概別人讀你的代碼將不得不審查的文件(這就是爲什麼我做了,但同樣,我不是專家)
  2. 無論如何你仍然使用隱式轉換,trunc()不返回int。
  3. 對我來說是不夠明確,閱讀你的代碼和文檔後,我問自己這樣的:「他的意圖鑄造爲int,或者你只是想要一個浮動沒有小數部分」

我可以想想一個或兩個情況下,我想擺脫小數部分,但我仍然想要的變量有幾個原因類型float,我想操作x + 0.1f保存小數部分。所以我仍然會懷疑你的意圖,也許你並不是指隱含的轉換。

你可以在旁邊放一點點評論int x = y; // yes, I know what I'm doing
這也將給你所需要的清晰度。

+2

+1 - 好答案。另一個原因是性能成本......在x86 sans SSE2/3上,一位程序員爲他的系統推斷出了40個週期(鏈接在末尾提供),並且轉換隻能在標準轉換從「double」到「int '存儲結果。鏈接:http://www.masmforum.com/board/index.php?PHPSESSID=786dd40408172108b65a5a36b09c88c0&topic=7758.0;prev_next=prev –

+0

感謝您的回答。還有一個值得一提的計算優勢。無論如何,我現在的個人選擇是添加評論。 – Antonio

+1

有人提到trunc調用將被「優化」; (http://gcc.godbolt.org/# {%22version%22%3A3%2C%22filterAsm%22%3A {%22labels%22%3Atrue%2C%22directives% 22%3Atrue%2C%22commentOnly%22%3Atrue}%2C%22compilers%22%3A [{%22source%22%3A%22%23include%20 \%22math.h \%22 \ n \ NINT%20test%28double %20input%29%20 {\ N%20%20return%20input%3B \ N} \ n \ NINT%20test2%28double%20input%29%20 {\ N%20%20return%20trunc%28input%29%3B \ N} \ N%22%2C%22compiler%22%3A%22%2Fusr%2Fbin%2FG%2B%2B-4.8%22%2C%22options%22%3A%22-O2%20-fomit幀指針%20-行軍%3Dnative%22}]}) – Antonio

0

IMO你不應該。截斷是爲浮點類型定義的函數。它不會將類型更改爲整型。

int x = y;在這裏你說你是一個int變量

int x = trunc(y);這裏分配的東西你說你放下不論什麼原因,小數部分的部分,然後將其轉換

使用情況是在我看來相當不同。

爲什麼我會阻止在轉換前使用trunc。在這種用例中,我可能更喜歡這種混淆。

+0

假設截斷的結果是int,爲什麼'trunc(3.1f)'不等於'3'的值明智? – RedX

+0

那麼'trunc(3.1f)'不是'int'和''float''。我知道它後來被轉換。我不知道,這可能是OCD喜歡的東西,知道它不是確切的價值,所以無論如何雙重轉換/截斷的意義何在。 – luk32

+0

值得注意的是它應該是相同的。 IEEE浮點可以精確地表示所有32位整數。類型上你是對的。 – RedX

相關問題