我给出了一个样本来说明我在第6行中的分配方式。
1 #include<stdio.h>
2
3 int main(int argc,char *argv[])
4 {
5 int a,b,c;
6 c = ({ a=5; b = a+1;});
7 printf("%d\n%d\n%d\n",a,b,c);
8 return 0;
9 }
我不确定{}
是什么。它不是数组int arr[]={1,2,3}
中使用的初始化列表。
更新 也许使用这种方法我可以在函数中定义一个函数,也可以在gcc中定义一个bug(版本4.7.2(Ubuntu / Linaro 4.7.2-2ubuntu1))
1 #include<stdio.h>
2 #include<math.h>
3 int main(int argc,char *argv[])
4 {
5 int a,b;
6 b = ({int cos(i){return 0;};a = 0;cos(a);});
7 printf("%d\n%d\n",a,b);
8 b = cos(0);
9 printf("%d\n%d\n",a,b);
10 return 0;
11 }
输出:
0
0
0
1
答案 0 :(得分:3)
({ a=5; b = a+1;})
是GNU扩展,expression statement。这不是标准C。
执行块中的语句,块中最后一个表达式的值是表达式语句的值。
所以
c = ({ a=5; b = a+1;});
将a
设置为5,然后将b
设置为a+1
(6),将c
设置为该值。
关于更新,
b = ({int cos(i){return 0;};a = 0;cos(a);});
另外使用另一个GNU扩展名nested functions。在expression语句的复合语句中,定义了嵌套函数cos
,隐藏了cos
中声明的名称math.h
,从而隐藏了cos(a)
中的最后一个表达式复合语句调用嵌套的本地定义。
在第8行,嵌套函数当然不在范围内,所以
b = cos(0);
从math.h
调用一个。