00、语句表达式
GNU C对C语言标准作了扩展,允许在一个表达式里内嵌语句,允许在表达式内部使用局部变量、for循环和goto表达式,我们称之为语句表达式。其格式:
({ 表达式1; 表达式2; 表达式3; })
int main(void)
{
int x = 100;
int y = 9;
int c = ({x;y;});
printf("c = %d\n",c);
}
第 5 行,这样写合法吗?
答案是合法,结果输出 9
({
int y = foo();
int z;
if(y > 0)
z = y;
else
z = -y;
z;
})
这就是复合语句表达式。
1、一对圆括号在外边,一对大括号在里面。
2、复合语句可以有函数调用、变量赋值甚至是控制流代码块。
3、最后一条语句必须以分号结尾。
4,最后一条语句的值,将作为整个表达式的值
5、如果你在大括号里的最后一句用的是没有返回值的语句,则整个表达式的返回类型为 void,即没有合法的返回值
```c
#include <stdio.h>
int main(void)
{
int sum = 0;
sum =
({
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum = sum + i;
}
sum;
});
printf("sum = %d\n", sum);
return 0;
}
执行结果:
yang@haha:~/tmp$ gcc 6.c
yang@haha:~/tmp$ ./a.out
sum = 4950
在上面的程序中,通过语句表达式实现了从0到99的累加求和,因为语句表达式的值等于最后一个表达式的值,所以在 for 循环的后面,我们要添加一个 sum; 语句表示整个语句表达式的值。如果不加这一句,你会发现 sum=0。或者你将这一行语句改为100; 你会发现最后 sum 的值就变成了100,这是因为语句表达式的值总等于最后一个表达式的值。
01、C代码块
不同的语句,使用大括号{}括起来,就构成了一个代码块。C 语言允许在代码块里定义一个变量,这个变量的作用域也仅限于这个代码块内,因为编译器就是根据{}来做入栈出栈操作来管理变量的作用域的。如下面的程序:
#include <stdio.h>
int main(void)
{
int temp= 3;
printf("temp= %d\n", temp);
//代码块
{
int temp = 100;
printf("代码块 temp = %d\n", temp );
}
printf("temp= %d\n", temp );
return 0;
}
执行结果:
yang@haha:~/tmp$ gcc test.c
yang@haha:~/tmp$ ./a.out
temp = 3
代码块 temp = 100
temp = 3
goto语句和语句表达式结合使用
#include <stdio.h>
int main(void)
{
int sum = 0;
sum =
({
int sum = 0;
for (int i = 0; i < 100; i++)
{
sum = sum + i;
if (i == 10)
goto loop;
}
sum;
});
printf("sum = %d\n", sum);
loop:
printf("goto loop\n");
printf("sum = %d\n", sum);
return 0;
}
执行结果:
yang@haha:~/tmp$ gcc test.c
yang@haha:~/tmp$ ./a.out
goto loop
sum = 0