鑑於這種出發點:我應該明確trunc?
double y = readDoubleValue();
是否有任何C顯著差異++之間:
int x = y;
和
int x = trunc(y);
哪一個,我應該更喜歡哪個?如果其他人(包括我未來的自己:))讀取我的代碼,那麼在第二個代碼中,我更清楚地知道我確切知道我在做什麼,但它需要包含庫。
參考: Is there a trunc function in C++?
鑑於這種出發點:我應該明確trunc?
double y = readDoubleValue();
是否有任何C顯著差異++之間:
int x = y;
和
int x = trunc(y);
哪一個,我應該更喜歡哪個?如果其他人(包括我未來的自己:))讀取我的代碼,那麼在第二個代碼中,我更清楚地知道我確切知道我在做什麼,但它需要包含庫。
參考: Is there a trunc function in C++?
只需使用static_cast<int>(y)
會給你正在尋找的所有優點:
的原因,我也不會用trunc()
trunc()
不返回int。我可以想想一個或兩個情況下,我想擺脫小數部分,但我仍然想要的變量有幾個原因類型float
,我想操作x + 0.1f
保存小數部分。所以我仍然會懷疑你的意圖,也許你並不是指隱含的轉換。
或你可以在旁邊放一點點評論int x = y; // yes, I know what I'm doing
。
這也將給你所需要的清晰度。
+1 - 好答案。另一個原因是性能成本......在x86 sans SSE2/3上,一位程序員爲他的系統推斷出了40個週期(鏈接在末尾提供),並且轉換隻能在標準轉換從「double」到「int '存儲結果。鏈接:http://www.masmforum.com/board/index.php?PHPSESSID=786dd40408172108b65a5a36b09c88c0&topic=7758.0;prev_next=prev –
感謝您的回答。還有一個值得一提的計算優勢。無論如何,我現在的個人選擇是添加評論。 – Antonio
有人提到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
IMO你不應該。截斷是爲浮點類型定義的函數。它不會將類型更改爲整型。
int x = y;
在這裏你說你是一個int變量
int x = trunc(y);
這裏分配的東西你說你放下不論什麼原因,小數部分的部分,然後將其轉換
使用情況是在我看來相當不同。
爲什麼我會阻止在轉換前使用trunc
。在這種用例中,我可能更喜歡這種混淆。
如果我看着'trunc'版本,我會想'什麼?當然trunc不會......'然後我會浪費幾分鐘無故讀文檔。所以如果有的話,它爲我混淆了代碼。 – juanchopanza
這似乎是一個不常見的觀點,至少與編寫代碼的人必須保持一致,但*註釋可以!*。我會寫'int x = y; //故意截斷「或更好的東西(更好 - 解釋*爲什麼*,但我不知道這段代碼)。 – BoBTFish