C 块变成表达式: ( {int a = 1; int b = 2; a+b;} ) equals 3

发布于 2024-11-30 15:01:24 字数 629 浏览 0 评论 0原文

在阅读http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects时,我遇到了这个例子:

\#define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK?

您可以像函数一样使用它,即 max(1,2) 是一个表达式计算结果为 2。

我的问题是,({ statment-list last-expression; }) 构造如何计算为最后表达式的值?具体来说,a 的作用是什么?这个构造的解析树是什么样的?我认为 { } 总是意味着复合语句,并且语句没有值。我尝试深入研究C语法,但仍然无法解决这个问题。

While reading http://en.wikipedia.org/wiki/C_preprocessor#Multiple_evaluation_of_side_effects, I came across this example:

\#define max(a,b) \
   ({ typeof (a) _a = (a); \
       typeof (b) _b = (b); \
     _a > _b ? _a : _b; }) // WHY DOES THIS LINE WORK?

Which you can use exactly like a function, i.e. max(1,2) is an expression evaluating to 2.

My QUESTION is, How does ({ statment-list last-expression; }) construct evaluate to the value of last-expression? Specifically, what does a parse tree of this construct look like? I thought { } always meant a compound-statement, and statements have no values. I tried digging around in the C grammar and still couldn't figure this problem out.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瞎闹 2024-12-07 15:01:24

这是一个名为语句表达式的 GCC 扩展。这不是标准C。

This is a GCC extension called Statement Expressions. It's not standard C.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文