这种分配方式是否定义明确?

时间:2013-04-13 11:15:18

标签: c

我给出了一个样本来说明我在第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 

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调用一个。