当我看到这个符号时,我感到非常惊讶。它是做什么的,它是什么样的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