这种任务分配方式是否定义清晰?

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的一个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 

https://dev59.com/v3I-5IYBdhLWcg3w3cnS - DCoder
也许对我来说,gcc -pedantic -wall 是一个不错的选择。 - yuan
1个回答

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

表达式语句是GNU扩展,不是标准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扩展嵌套函数。在表达式语句的复合语句内部,定义了一个嵌套函数cos,遮蔽了math.h中声明的名称cos,因此复合语句中的最后一个表达式cos(a)调用了嵌套的本地定义。

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

b = cos(0);

调用来自math.h的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接