回答
沒有區別;按照標準(§5.2.3):
一個簡單類型說明符(7.1.5),後面跟着一個帶括號的表達式列表,根據表達式列表構造一個指定類型的值。如果表達式列表是單個表達式,那麼類型轉換表達式與相應的表達式(5.4)是等價的(在定義中,如果定義的話)。
由於問題指定了type(value)
和(type)value
之間的差異,所以絕對沒有區別。
當且僅當您處理以逗號分隔的列表的值可能會有差異。在這種情況下:
如果表達式列表指定比單個值時,類型應與適當聲明的構造(8.5,12.1)的一類,並且表達T(X1,X2,...)相當於聲明T t(x1,x2,...);對於一些發明的臨時變量t,其結果是t的值作爲右值。
正如Troubadour指出的那樣,某些名稱的類型type(value)
版本根本無法編譯。例如:
char *a = (char *)string;
將編譯,但:
char *a = char *(string);
不會。相同類型使用不同的名稱(例如,用typedef
創建)可以工作,雖然:
typedef char *char_ptr;
char *a = char_ptr(string);
僅適用於內置類型。 – Troubadour 2009-10-30 21:35:33
恩,不,沒有區別。 +1 – 2009-10-30 21:37:18
嗯,也許:)但是untypedef'ed指針類型呢? – Troubadour 2009-10-30 21:44:16
沒有區別; C++標準(1998和2003版)明確了這一點。嘗試下面的程序,確保你使用了一個兼容的編譯器,比如免費預覽http://comeaucomputing.com/tryitout/。
#include <cstdlib>
#include <string>
int main() {
int('A'); (int) 'A'; // obvious
(std::string) "abc"; // not so obvious
unsigned(a_var) = 3; // see note below
(long const&) a_var; // const or refs, which T(v) can't do
return EXIT_SUCCESS;
}
注:unsigned(a_var)
是不同的,但確實顯示單程那些確切的令牌可能意味着別的東西。它聲明瞭一個類型爲unsigned的變量a_var
,根本不是變體。 (如果你熟悉函數指針或數組,考慮如何在一個類型像void (*pf)()
或int (*pa)[42]
使用周圍p
一個括號。)
(警告產生,因爲這些語句不使用的價值和在一個真正的程序中,幾乎可以肯定是一個錯誤,但一切仍然有效,我只是沒有心在一切排列後改變它。)
不錯的代碼格式,是那個意圖嗎? – squelart 2010-03-05 23:42:14
@squelart:一開始不是,但一旦接近,我就開始工作了,只是沒有心情去改變它,以擺脫警告。 – 2010-03-06 04:25:07
當兩者都是強制轉換時沒有區別,但有時'類型(價值)'不是演員。
下面是從N3242標準草案,第8.2.1節的例子:
struct S
{
S(int);
};
void foo(double a)
{
S w(int(a)); // function declaration
S y((int)a); // object declaration
}
在這種情況下 'INT的(a)' 不是鑄造因爲 'A' 是不是一個值,它是一個參數名稱被冗餘括號包圍。該文件指出
從函數式 演員和6.8中提到的也可以發生在一個聲明的上下文 聲明之間的相似性引起的歧義。在這種情況下,選擇範圍在函數 聲明與一個冗餘的括號參數 名稱和一個具有函數樣式類型的對象聲明作爲 初始值設定項。正如6.8中提到的含糊之處一樣, 決議是考慮任何可能是聲明聲明的構造。
在C沒有type (value)
,而在C/C++兩者type (value)
(type) value
和允許。
爲了說明用C你的選擇++(只有一個具有安全檢查)
#include<boost/numeric/conversion/cast.hpp>
using std::cout;
using std::endl;
int main(){
float smallf = 100.1;
cout << (int)smallf << endl; // outputs 100 // c cast
cout << int(smallf) << endl; // outputs 100 // c++ constructor = c cast
cout << static_cast<int>(smallf) << endl; // outputs 100
// cout << static_cast<int&>(smallf) << endl; // not allowed
cout << reinterpret_cast<int&>(smallf) << endl; // outputs 1120416563
cout << boost::numeric_cast<int>(smallf) << endl; // outputs 100
float bigf = 1.23e12;
cout << (int)bigf << endl; // outputs -2147483648
cout << int(bigf) << endl; // outputs -2147483648
cout << static_cast<int>(bigf) << endl; // outputs -2147483648
// cout << static_cast<int&>(bigf) << endl; // not allowed
cout << reinterpret_cast<int&>(bigf) << endl; // outputs 1401893083
cout << boost::numeric_cast<int>(bigf) << endl; // throws bad numeric conversion
}
- 1. 兩種(類型)值和類型(值)有什麼區別?
- 2. couchbase中文檔類型和鍵值類型之間的區別
- 3. C#中值類型和引用類型之間有什麼區別?
- 4. 類型巴貝爾和jsx之間的區別是什麼
- 5. cl_datatype和通常數據類型之間的區別是什麼
- 6. 對象,*和沒有類型之間的區別是什麼?
- 7. 類型別名和類型lambda之間的區別
- 8. 超類和超類型之間的區別以及子類和子類型之間的區別
- 9. 類「類型」和特定類型之間的關係是什麼?
- 10. h:commandbutton類型之間的區別究竟是什麼?
- 11. 這些多態類型之間的區別是什麼?
- 12. 泛型類中這些語句之間的區別是什麼?
- 13. Haskell類型簽名中類型「a」和類型「t」之間的區別是什麼?
- 14. 原始類型和包裝類之間的主要區別是什麼?
- 15. 類型ClientLibraryFolder的embed []和dependencies []之間有什麼區別?
- 16. 路徑依賴類型和依賴類型之間有什麼區別?
- 17. 泛型類型和泛型類型定義有什麼區別?
- 18. ruby中類的類型和超類的區別是什麼?
- 19. HTML文檔類型和內容類型之間的區別?
- 20. 實體類型和關係類型之間的真正區別?
- 21. 引用類型和對象類型之間的區別?
- 22. 類型[] varName和類型varName []之間的區別?
- 23. 類型轉換和類型轉換之間的區別?
- 24. Swift中類型和明確展開類型之間的區別
- 25. 內容類型和enctype之間有什麼區別
- 26. 價值和價值2之間的區別是什麼
- 27. Haskell中的類型和數據類型有什麼區別?
- 28. C#&CLI與值類型和構造函數有什麼區別?
- 29. 指針和值接收器類型有什麼區別?
- 30. 相同數據類型的結構和數組之間的區別是什麼?
東西沒有提到:'(類型)值;'和'類型(值);'是不同的 - 後者定義一個名爲「值」的變量。 – 2015-07-22 20:41:26