10_GNU C之语句表达式

本文介绍了GCC对C语言的扩展,包括语句表达式和代码块的概念。语句表达式允许在表达式中使用局部变量、for循环和goto,其值由最后一个表达式决定。示例代码展示了如何使用语句表达式进行累加求和,并通过代码块管理变量作用域。同时,文章还提到了goto语句在语句表达式中的应用,以及如何结合使用实现特定的控制流程。
摘要由CSDN通过智能技术生成

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
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值