當我看到這個符號時,我感到非常驚訝。它是做什麼的,它是什麼樣的C概念?什麼是「int * a =(int [2]){0,2};」準確地做?
10
A
回答
19
這是C99標準第6.5.2.5節定義的複合字面值。
它不是C++語言的一部分,因此C++編譯器不編譯它並不奇怪。 (或Java或Ada編譯器)
複合文字的值是由 初始值設定項列表初始化的未命名對象的值。如果複合文字出現在函數體外部,則對象 具有靜態存儲持續時間;否則,它具有與 封閉塊關聯的自動存儲持續時間。
所以不,它不會破壞堆棧。編譯器爲該對象分配存儲空間。
括號放在類型中,然後是一個初始化列表 - 它不是一個強制轉換,因爲在C99語法中,初始化列表沒有意義;相反,它是應用於產生給定類型對象的類型的後綴運算符。您不是創建{ 0, 3 }
並將其轉換爲數組,您正在使用值0和3初始化int[2]
。
至於爲什麼它的使用,我看不到一個很好的理由在你的單行線,雖然它可能是一個可以被重新分配在其他一些陣列點帶面,所以這是一個較短的方式這樣做的前兩行:
int default_a[] = { 0, 2 };
int *a = default_a;
if (some_test) a = get_another_array();
我已經找到了通過臨時工會職能
// fills an array of unions with a value
kin_array_fill (array, (kin_variant_t) { .ref = value })
-2
0
(int [2])告訴編譯器,下面的表達式應該被轉換爲int [2]。這是必需的,因爲可以將{0,2}轉換爲不同的類型,如long [2]。 Cast在編譯時發生 - 而不是運行時。
整個表達式在內存中創建一個數組,並將a指向該數組。
1
- 在堆棧上爲[數組]兩個
int
s分配空間。 - 將兩個
int
的[數組]分別填入值0
和2
。 - 聲明類型爲
int*
的局部變量,併爲該變量分配兩個int
的[數組]的地址。
6
這是C99結構有用,稱爲複合文字。
從2005年5月委員會節6.5.2.5草案:
即由 帶括號的類型名稱後面 初始化 的brace-封閉列表後綴表達式是字面的化合物。它提供了一個 未命名對象,其值由初始值列表 給出。
...
實施例1的文件的範圍定義
int *p = (int []){2, 4};
初始化p 指向一個 陣列2個整數的第一元件,所述第一具有 的價值二和第二,四。 這個複合詞 的表達式必須是常量。 未命名對象的持續時間爲靜態存儲 。
相關問題
- 1. int A [] = {}是什麼意思?
- 2. swap(int&a,int&b)和swap(int * a,int * b)。有什麼區別?
- 3. 「int k =((int)i)」是做什麼的?
- 4. 什麼是(int - > int) - >(int - > int)是什麼意思?
- 5. `int a [6] [(2,2)]`array是什麼意思?
- 6. Java-有效地做.setBounds(int,int,int,int);
- 7. 爲什麼sizeof(a)16? (sizeof int是4)
- 8. static int a和int a有什麼區別?
- 9. double a = a + int b和int a + = double b之間的區別是什麼?
- 10. 克++ __static_initialization_and_destruction_0(INT,INT) - 什麼是
- 11. int * p =&a ++和int * p =&++ a
- 12. 什麼樣的變量是int * [2]?如在分層int * p2 [2]
- 13. java.io.BufferedWriter.min(int a,int b)的含義是什麼?
- 14. int * ptr =(int *)(&a + 1);
- 15. 什麼是 「int *(* PFP)();」在C做?
- 16. FileOutputStream.write(int b)是做什麼的?
- 17. 是什麼(INT - > INT)是什麼意思?
- 18. 什麼是A <int(int)>是什麼意思?這個技術的名字是什麼?
- 19. DotNet - 什麼是int *?
- 20. 什麼是INT 21h?
- 21. Java中的int a [5],int a [],int a [] = {2,3}之間的區別
- 22. Easymock.and(int,int)的用法是什麼?
- 23. int test [] = new int [0]是什麼意思?
- 24. Java中的++ int是什麼?
- 25. 減地圖<'a, int>
- 26. 什麼是C#中的int?
- 27. 1 ==(int)0.5 * 2 => false,1 ==((int)0.5 * 2)=> true,爲什麼?
- 28. public void add(int a,int ... b){
- 29. 將本地方法定義爲公共本機synchronized int doSum(int a,int b)是否正確?
- 30. int values []是什麼意思?
在C模式下編譯時無法用VC++進行編譯。你試過什麼編譯器? – AraK 2010-06-11 14:49:00
它適用於GCC,所以也許它不在C標準? – Dpp 2010-06-11 14:53:36
我猜你是對的 - 這是另一個GCC擴展。不知道你從中獲得什麼。 – 2010-06-11 14:56:13