首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于选择和迭代语句的新块范围

用于选择和迭代语句的新块范围
EN

Stack Overflow用户
提问于 2014-10-13 10:16:53
回答 1查看 229关注 0票数 2

在用于迭代的C99语句和selection语句中,有新的块作用域,我理解ifwhile等本身是块作为它们的子语句,也没有{ }

C11规范:

6.8.4:

selection语句是一个块,其作用域是其封闭块作用域的严格子集。每个关联的子语句也是一个块,其作用域是选择语句作用域的严格子集。

6.8.5

迭代语句是一个块,其作用域是其封闭块作用域的严格子集。循环体也是一个块,其作用域是迭代语句作用域的严格子集。

但如果我这么做了

代码语言:javascript
运行
复制
if( (int a = 10) == 10 ) // error: expected expression before '==' token
   int j = 10; // error: expected expression before 'int'

GCC给了我错误。

如何验证C99的新规则?

有人能给我举几个有用的例子吗?

EN

回答 1

Stack Overflow用户

发布于 2014-10-13 12:00:17

我阅读了Straustrup的一篇文章,他在文章中讨论了C和C++的集成问题。正如我们所看到的,问题似乎还没有解决。甚至语句定义也有根本的不同。在C中,if语句的控制表达式可以是一个表达式。因此,例如,这个语句

代码语言:javascript
运行
复制
if ( const char *p = std::strchr( "Hello", 'H' ) ) { /*...*/ }

在C++中有效,但类似的语句

代码语言:javascript
运行
复制
if ( char *p = strchr( "Hello", 'H' ) ) { /*...*/ }

维德不在C。

但无论如何,您的if语句既不是C++中的vaid,也不是C.)

代码语言:javascript
运行
复制
if( (int a = 10) == 10 )

可以有表达式或声明。来自C++标准

代码语言:javascript
运行
复制
condition:

expression
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26337616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档