3

我给出了一个示例来说明我在第 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 中定义一个错误(版本 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 
4

1 回答 1

3
({ a=5; b = a+1;})

是一个 GNU 扩展,一个表达式语句。这不是标准的C。

块中的语句被执行,块中最后一个表达式的值就是表达式语句的值。

所以

c = ({ a=5; b = a+1;});

设置a为 5,然后设置ba+1(6),然后c设置为该值。


关于更新,

b = ({int cos(i){return 0;};a = 0;cos(a);});

另外使用另一个 GNU 扩展,嵌套函数。在表达式语句的复合语句中,cos定义了一个嵌套函数,隐藏在 中cos声明的名称math.h,因此cos(a)复合语句中的最后一个表达式调用嵌套的局部定义。

在第 8 行,嵌套函数当然不在作用域内,所以

b = cos(0);

调用来自 的那个math.h

于 2013-04-13T11:17:48.607 回答