在用于迭代的C99语句和selection语句中,有新的块作用域,我理解if
、while
等本身是块作为它们的子语句,也没有{ }
。
C11规范:
6.8.4:
selection语句是一个块,其作用域是其封闭块作用域的严格子集。每个关联的子语句也是一个块,其作用域是选择语句作用域的严格子集。
6.8.5
迭代语句是一个块,其作用域是其封闭块作用域的严格子集。循环体也是一个块,其作用域是迭代语句作用域的严格子集。
但如果我这么做了
if( (int a = 10) == 10 ) // error: expected expression before '==' token
int j = 10; // error: expected expression before 'int'
GCC给了我错误。
如何验证C99的新规则?
有人能给我举几个有用的例子吗?
发布于 2014-10-13 12:00:17
我阅读了Straustrup的一篇文章,他在文章中讨论了C和C++的集成问题。正如我们所看到的,问题似乎还没有解决。甚至语句定义也有根本的不同。在C中,if语句的控制表达式可以是一个表达式。因此,例如,这个语句
if ( const char *p = std::strchr( "Hello", 'H' ) ) { /*...*/ }
在C++中有效,但类似的语句
if ( char *p = strchr( "Hello", 'H' ) ) { /*...*/ }
维德不在C。
但无论如何,您的if语句既不是C++中的vaid,也不是C.)
if( (int a = 10) == 10 )
可以有表达式或声明。来自C++标准
condition:
expression
attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list
https://stackoverflow.com/questions/26337616
复制相似问题