以下语法有效:
while (int i = get_data())
{
}
Run Code Online (Sandbox Code Playgroud)
但以下不是:
do
{
} while (int i = get_data());
Run Code Online (Sandbox Code Playgroud)
我们可以通过标准草案N4140第6.4节了解原因:
1 [...]
condition: expression attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list2条件规则既适用于选择陈述,也适用于
for和while陈述(6.5).[...]
和第6.5节
1迭代语句指定循环.
iteration-statement:while( condition ) statementdostatementwhile( expression ) ;
相反,你被迫做一些丑陋的事情:
int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
Run Code Online (Sandbox Code Playgroud)
这是什么理由?
以下是无效代码:
int i = 0, double j = 2.0;
Run Code Online (Sandbox Code Playgroud)
标准草案说明了原因:
[N4140/7.1.6]
2作为一般规则,最多一个类型说明符被允许在完全DECL说明符-SEQ声明的或在一个 类型说明符序列或尾随类型说明符-SEQ.此规则的唯一例外情况如下:-
const可以与除自身之外的任何类型说明符组合使用.-
volatile可以与除自身之外的任何类型说明符组合使用.-
signed或unsigned可以结合char,long,short,或int.-
short或者long可以结合使用int.-
long可以结合使用double.-
long可以结合使用long.
是的,它可以防止愚蠢的事情int int,但我发现上面发布的无效代码没有任何问题.引用[N4140/7],简单声明包含一个decl-specifier-seq opt init-declarator-list opt ;
[N4140/8]然后表明init-declarator-list包含一个init-declarator-list,init-declarator,
和初始化声明符 …