前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C语言(复合语句表达式)

C语言(复合语句表达式)

作者头像
用户2617681
发布2019-08-08 16:05:26
2.5K1
发布2019-08-08 16:05:26
举报
文章被收录于专栏:秘籍酷秘籍酷

some times,你需要用双括号来括住一堆复合语句,看起来怪怪的,但在某些场合你还真只能这么干!

拓展:

以下的东东被称为“复合语句表达式”:

({

int y = foo();

int z;

if(y > 0) z = y;

else z = -y;

z;

})

first of all,我们先得罗列一下语法点:

1,一对圆括号在外边,一对大括号在里面。

2,复合语句可以有函数调用、变量赋值甚至是控制流代码块。

3,最后一条语句必须以分号结尾。

4,最后一条语句的值,将作为整个语句表达式的值。

secondly,那它有什么用呢?复杂宏。

有时候一条宏语句很长,而且还需要进行赋值运算,那就要用复合语句表达式了。

例如:

#define MAX(a,b) \

({ \

typeof(a) _a = (a); \

typeof(b) _b = (b); \

(void)(&_a == &_b); \

_a>_b ? _a : _b;\

})

int x=1, y=2, m;

m = MAX(x, y);

thirdly,使用复合语句表达式的宏跟普通函数有什么区别?

复合语句表达式中定义的任何临时变量在其所在语句结束时被释放,而函数总定义的任何临时变量在函数return的时候被释放。

例如:

#define macro(a) \

({typeof(a) b=(a); b+3;})

template<typename T> T fun(T a)

{

T b=a;

return b+3;

}

然后调用如下函数:

void foo()

{

macro(X());

fun(X());

}

此时带参宏跟函数是有些微妙的差异的:宏中的X将在初始化完a之后立即被释放,而函数中的X将在整个函数return之后被释放。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 秘籍酷 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档