小编use*_*360的帖子

为什么不能在do while循环的表达式部分中声明变量?

以下语法有效:

while (int i = get_data())
{
}
Run Code Online (Sandbox Code Playgroud)

但以下不是:

do
{
} while (int i = get_data());
Run Code Online (Sandbox Code Playgroud)

我们可以通过标准草案N41406.4节了解原因:

1 [...]

condition:
     expression
     attribute-specifier-seqopt decl-specifier-seq declarator = initializer-clause
     attribute-specifier-seqopt decl-specifier-seq declarator braced-init-list

2条件规则既适用于选择陈述,也适用于forwhile陈述(6.5).[...]

和第6.5

1迭代语句指定循环.

      iteration-statement: 
             while ( condition ) statement
             do statement while ( expression ) ;

相反,你被迫做一些丑陋的事情:

int i = get_data();
do
{
} while ((i = get_data())); // double parentheses sic
Run Code Online (Sandbox Code Playgroud)

这是什么理由?

c++ declaration do-while

32
推荐指数
4
解决办法
5260
查看次数

为什么你不能在声明中有多个decl-specifier-seq?

以下是无效代码:

int i = 0, double j = 2.0;
Run Code Online (Sandbox Code Playgroud)

标准草案说明了原因:

[N4140/7.1.6]

2作为一般规则,最多一个类型说明符被允许在完全DECL说明符-SEQ声明的或在一个 类型说明符序列尾随类型说明符-SEQ.此规则的唯一例外情况如下:

- const可以与除自身之外的任何类型说明符组合使用.

- volatile可以与除自身之外的任何类型说明符组合使用.

- signedunsigned可以结合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,

初始化声明符 …

c++

12
推荐指数
1
解决办法
507
查看次数

标签 统计

c++ ×2

declaration ×1

do-while ×1