在C++中,如果我有一個短整型數組並將其作爲參數傳遞給一個採用長整型數組的函數,函數是否會將短陣列的每個值轉換爲長整型或將整個數組被重新解釋爲n/2元素的長整數數組?當一個短int []自動轉換爲long int []時會發生什麼?
0
A
回答
5
你不能,因爲沒有可以使用的自動轉換。
請記住,你不能按值傳遞數組給一個函數:數組參數實際上只是一個指針參數,所以下面兩個是一樣的:
void f(long a[]);
void f(long* a);
當你傳遞一個數組一個函數,該數組隱式轉換爲指向其初始元素的指針。因此,鑑於long data[10];
,下面兩個是相同的:
f(data);
f(&data[0]);
有從short*
到long*
的隱式轉換,因此,如果data
被宣佈爲short data[10];
,你會得到一個編譯錯誤。
您將需要顯式轉換short*
到long*
,使用reinterpret_cast
,但不會轉化「N short
元素的數組」到「N long
元素的數組,」它會重新解釋指向的數據作爲「[某些數量的] long
元素的數組」,這可能不是你想要的。
您需要創建long
元素的新數組,並從short
的數組中的元素複製到的long
數組:
short data[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
long data_as_long[10];
std::copy(data, data + 10, data_as_long);
f(data_as_long);
或者,你可能會考慮改變你的函數是一個模板,可以接受一個指向任何類型的元素的數組:
template <typename T> void f(T*);
或者,更先進的解決方案,最通用的方法,這樣做將有你的函數取一個迭代器範圍。這樣,你可以傳遞任何類型的迭代器(包括指向數組的指針)。另外,它提供了一種自然而簡單的方法來確保數組的長度正確傳遞,因爲長度不是顯式傳遞的,而是由參數決定的。
template <typename Iterator> void f(Iterator first, Iterator last);
const unsigned length_of_data = 10;
long data_array[length_of_data];
std::vector<long> data_vector(length_of_data);
f(data_array, data_array + length_of_data); // works!
f(data_vector.begin(), data_vector.end()); // also works!
1
不,一個好的編譯器會給出錯誤。糟糕的編譯器會給出奇怪的結果。
重鑄一次一個單個元件是常見的,因此不會造成困難,但指針傳遞到期望一種類型的對象的功能和接收另一個是I Love Lucy排序災難。
相關問題
- 1. 從int轉換爲long long
- 2. 如何將一個long int轉換爲一個int C
- 3. 將int [2]轉換爲long
- 4. 將int轉換爲無符號long long
- 5. 將字符串轉換爲long long int
- 6. 當在HIVE中字符串被隱式轉換爲int時會發生什麼?
- 7. 長長爲int和int爲long long轉換
- 8. 從'long int'無效轉換爲'long int *'-fpermissive
- 9. 爲什麼這會被轉換爲int?
- 10. 爲什麼int的int隱式轉換爲long long int在C++中給出了意想不到的答案?
- 11. 當我將一個負值賦給一個unsigned int時會發生什麼?
- 12. long unsigned int和unsigned long int有什麼區別int
- 13. C++轉換的int * LONG
- 14. 「long long = int + int」先計算,然後鍵入轉換?
- 15. 有理數轉換爲long int
- 16. 如何將long int轉換爲char
- 17. 不能解決「警告:從'int'轉換爲'long unsigned int'」
- 18. 當您在C#中將枚舉強制轉換爲int時,發生了什麼?
- 19. 當我將int轉換爲字符串時,實際發生了什麼?
- 20. 轉換一個int爲char *
- 21. 錯誤:無法從'long'轉換爲'int'
- 22. 爲什麼從int到Long的隱式轉換不可能?
- 23. 可能有損從long轉換爲int
- 24. 將int product隱式轉換爲long?
- 25. 將Const char *轉換爲Unsigned long int - strtoul
- 26. C++轉換錯誤:從短int *無效轉換爲short int
- 27. int [] copy = data; //當數據是數組時會發生什麼?
- 28. 如果我將一個int變量初始化爲int以外的值,會發生什麼?
- 29. 錯誤:從'int(*)()'無效轉換爲'long unsigned int'
- 30. 將varchar值「0%」轉換爲數據類型int時發生轉換失敗int
對,這裏是一個證明http://ideone.com/kaHKp – UmmaGumma 2011-03-17 16:27:04