在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 [2]轉換爲long
- 2. 將int轉換爲無符號long long
- 3. 當在HIVE中字符串被隱式轉換爲int時會發生什麼?
- 4. 爲什麼int的int隱式轉換爲long long int在C++中給出了意想不到的答案?
- 5. 當我將一個負值賦給一個unsigned int時會發生什麼?
- 6. long unsigned int和unsigned long int有什麼區別int
- 7. 「long long = int + int」先計算,然後鍵入轉換?
- 8. 如何將long int轉換爲char
- 9. 不能解決「警告:從'int'轉換爲'long unsigned int'」
- 10. 轉換一個int爲char *
- 11. 錯誤:無法從'long'轉換爲'int'
- 12. 爲什麼從int到Long的隱式轉換不可能?
- 13. 如果我將一個int變量初始化爲int以外的值,會發生什麼?
- 14. int [] copy = data; //當數據是數組時會發生什麼?
- 15. 將varchar值「0%」轉換爲數據類型int時發生轉換失敗int
- 16. 當我使用*(int *)&x分配一個常量值x時會發生什麼?
- 17. 爲什麼添加兩條短褲會返回一個int?
- 18. 如何解釋這個,當我們將signed char轉換爲int/hex時會發生什麼?
- 19. unsigned long long int
- 20. 使用短int int#
- 21. 爲什麼將一個int轉換爲一個bool會給出警告?
- 22. 將[Int?]轉換爲[Int]
- 23. 將IO Int轉換爲Int
- 24. 爲什麼TestID未被轉換爲INT?
- 25. 從int *轉換爲int&
- 26. 什麼(INT&)在C轉換++
- 27. C#無法從'long'轉換爲'int'(隨機數生成器)
- 28. 將當前時間轉換爲Int(Haskell)
- 29. 爲什麼const int會隱式轉換爲一個字節,但是變量int不會呢?
- 30. 從int []轉換爲int *
對,這裏是一個證明http://ideone.com/kaHKp – UmmaGumma 2011-03-17 16:27:04