私の推測では、構文解析が簡単になっただけですが、その理由は正確にはわかりません。
だからこれは何を持っていますか...
do
{
some stuff
}
while(test);
more stuff
それはより良いです...
do
{
some stuff
}
while(test)
more stuff
私の推測では、構文解析が簡単になっただけですが、その理由は正確にはわかりません。
だからこれは何を持っていますか...
do
{
some stuff
}
while(test);
more stuff
それはより良いです...
do
{
some stuff
}
while(test)
more stuff
あなたは声明を終わらせているからです。ステートメントは、ブロック (中括弧で区切られた) またはセミコロンで終了します。「do this while this」は単一のステートメントであり、ブロックで終了できないため (「while」で終了するため)、他のステートメントと同様にセミコロンが必要です。
C ++の文法を見ると、反復ステートメントが次のように定義されていることがわかります。
while( 条件 ) ステートメント
for( for-init-statement condition -opt ; expression -opt ) ステートメント
ステートメントを 実行するwhile( 式 );
do-while
ステートメントのみ;
が最後にあることに注意してください。だから、問題は、なぜそれが他のdo-while
ものと非常に異なっているので、それがその余分なものを必要とするのかということ;
です。
よく見てみましょう:両方for
と通常はステートメントwhile
で終わります。ただし、で囲まれた制御式で終わります。その囲みの存在により、コンパイラーは制御式の終わりを明確に見つけることができます。外側の閉じは、式が終了する場所、つまりステートメント全体が終了する場所を指定します。言い換えれば、終了は確かに冗長です。do-while
()
()
)
do-while
;
ただし、実際には、たとえば、次のコードを意味します
do
{
/* whatever */
} while (i + 2) * j > 0;
文法の観点からは有効ですが、実際には次のように解析されます。
do
{
/* whatever */
} while (i + 2)
*j > 0;
これは正式には健全ですが、実際には直感的ではありません。do-while
このような理由から、ステートメントにさらに明示的なターミネータ(セミコロン)を追加することが決定されたと思います。もちろん、@ Joe Whiteの回答によると、単純で単純な一貫性についても考慮されています。Cのすべての通常の(複合ではない)ステートメントは、で終わり;
ます。
これは、do-while ループ内で while ステートメントが有効だからです。
セミコロンが必要ない場合のさまざまな動作を検討してください。
int x = 10;
int y = 10;
do
while(x > 0)
x--;
while(x = y--);
答えはわかりませんが、一貫性が最良の議論のようです。C/C++ のすべてのステートメント グループは、
どちらでもない構造を作成するのはなぜですか?
一貫性を考慮して...
if (expr) statement;
do statement; while (expr);
for (expr; expr; expr) statement;
while (expr) statement;
...これらすべてのフロー制御構造は、セミコロンで終わります。
しかし、ブロックステートメント形式のうち、do while
セミコロンで区切られているのは次のとおりです。
if (expr) { ... }
do { ... } while (expr);
for (expr; expr; expr) { }
while (expr) { }
したがって、「;」があります。または '}' ですが、決して「裸の」 ')' ではありません。
少なくとも、すべてのステートメントは;
または}
で区切る必要があると言えます。視覚的にステートメントを区別するのに役立ちます。
セミコロンが不要な場合は、次のことを考慮してください。
do statement1; while (expr1) statement2; do ; while (expr2) statement3; while (expr3) statement4;
それを明確なステートメントに視覚的に解決することは非常に困難です。
do statement1; while (expr1)
statement2;
do ; while (expr2)
statement3;
while (expr3) statement4;
対照的に、以下は条件が を逆方向にシークするように指示し、次のステートメントがそれに接続されていないことを伝えた;
直後として、より簡単に解決されます。while
do
while
do statement1; while (expr1); statement2; do ; while (expr2); statement3; while (expr3) statement4;
人々がフローを理解できるようにコードをインデントしていることを考えると、それは問題でしょうか? はい、理由:
また、有名なプリプロセッサの do-while イディオムも注目に値します。
#define F(X) do { fn(X); } while (false)
これは、次のように置き換えることができます。
if (expr)
F(x);
else
x = 10;
...収量...
if (expr)
do ( fn(x); } while (false);
else
x = 10;
セミコロンがステートメントの一部でない場合、ステートメントは次のように解釈されます。do while
if
if (expr)
do-while-statement
; // empty statement
else
x = 10;
...そして、if
の後に 2 つのステートメントがあるため、完全であると見なされ、else
ステートメントは一致しません。
C はセミコロンで終了します (一方、Pascal はセミコロンで区切られます)。そこにセミコロンをドロップすると一貫性がなくなります。
率直に言って、do ループで while を再利用するのは嫌いです。repeat-until の方が混乱が少ないと思います。しかし、それはそれが何であるかです。
do.....while();
私の答えは、ループの終了にセミコロンを含めなかった場合、コンパイラが混乱する可能性があるということです。これがないと、次のことは明確ではありません。
do......while
そのため、条件が false の場合にループがここで終了することを示すために、ループの最後にセミコロンを含めます。
C/C++ では、空白は構造に寄与しません (Python の例のように)。C/C++ では、ステートメントはセミコロンで終了する必要があります。これは許可されています:
do
{
some stuff; more stuff; even more stuff;
}
while(test);