jus*_*nhj 35 c c++ language-design
我的猜测是它只是简化了解析,但我看不清楚原因.
那么这有什么......
do
{
some stuff
}
while(test);
more stuff
Run Code Online (Sandbox Code Playgroud)
那比...更好
do
{
some stuff
}
while(test)
more stuff
Run Code Online (Sandbox Code Playgroud)
Joe*_*ite 57
因为你要结束陈述.语句以块(由大括号分隔)或分号结束."执行此操作时"这是一个单独的语句,并且不能以块结尾(因为它以"while"结尾),因此它需要一个分号,就像任何其他语句一样.
AnT*_*AnT 30
如果你看一下C++语法,你会看到迭代语句被定义为
而( 条件 ) 陈述
for( for-init-statement condition -opt ; expression -opt ) statement
做 声明 而( 表达 );
请注意,只有do-while语句最后有一个;.所以,问题是为什么do-while它与其他部分如此不同,以至于它需要额外的;.
让我们来仔细看看:既for和定期while与结束发言.但do-while带有控制结束表达封入().封闭的存在()已经允许编译器明确地找到控制表达式的结尾:外部闭合)指定表达式结束的位置,因此指定整个do-while语句结束的位置.换句话说,终止;确实是多余的.
但是,在实践中,这意味着,例如,以下代码
do
{
/* whatever */
} while (i + 2) * j > 0;
Run Code Online (Sandbox Code Playgroud)
虽然从语法的角度来看是有效的,但实际上会被解析为
do
{
/* whatever */
} while (i + 2)
*j > 0;
Run Code Online (Sandbox Code Playgroud)
这是正式的声音,但它并不是非常直观.我猜想由于这些原因,决定在do-while语句中添加一个更明确的终结符- 分号.当然,根据@Joe White的回答,还要考虑简单和简单的一致性:C中的所有普通(非复合)语句都以a结尾;.
小智 24
这是因为while语句在do-while循环中是有效的.
如果不需要分号,请考虑不同的行为:
int x = 10;
int y = 10;
do
while(x > 0)
x--;
while(x = y--);
Run Code Online (Sandbox Code Playgroud)
虽然我不知道答案,但一致性似乎是最好的论据.C/C++中的每个语句组都以
为什么要创建一个既不会执行的构造
考虑到一致性......
if (expr) statement;
do statement; while (expr);
for (expr; expr; expr) statement;
while (expr) statement;
Run Code Online (Sandbox Code Playgroud)
......所有这些流控制结构,以分号结尾.
但是,反驳我们可以注意到块语句形式,只有do while以分号分隔:
if (expr) { ... }
do { ... } while (expr);
for (expr; expr; expr) { }
while (expr) { }
Run Code Online (Sandbox Code Playgroud)
所以,我们有';' 或'}',但绝不是"裸"')'.
我们至少可以说每个语句都必须用;or 分隔},并且在视觉上可以帮助我们区分语句.
如果不需要分号,请考虑:
do statement1; while (expr1) statement2; do ; while (expr2) statement3; while (expr3) statement4;
Run Code Online (Sandbox Code Playgroud)
在视觉上将其解析为不同的语句是非常困难的:
do statement1; while (expr1)
statement2;
do ; while (expr2)
statement3;
while (expr3) statement4;
Run Code Online (Sandbox Code Playgroud)
相比之下,以下内容更容易解决,因为;在while条件告诉您向后寻找后do,并且下一个语句与之无关while:
do statement1; while (expr1); statement2; do ; while (expr2); statement3; while (expr3) statement4;
Run Code Online (Sandbox Code Playgroud)
是否重要,因为人们缩进他们的代码以使流程可以理解?是的,因为:
值得注意的是着名的预处理器do-while成语:
#define F(X) do { fn(X); } while (false)
Run Code Online (Sandbox Code Playgroud)
这可以替换如下:
if (expr)
F(x);
else
x = 10;
Run Code Online (Sandbox Code Playgroud)
... ...产量
if (expr)
do ( fn(x); } while (false);
else
x = 10;
Run Code Online (Sandbox Code Playgroud)
如果分号不是do while语句的一部分,则该if语句将被解释为:
if (expr)
do-while-statement
; // empty statement
else
x = 10;
Run Code Online (Sandbox Code Playgroud)
...并且,因为在if它之后有两个语句,它被认为是完整的,这使得else语句无法比拟.