35

私の推測では、構文解析が簡単になっただけですが、その理由は正確にはわかりません。

だからこれは何を持っていますか...

do
{
  some stuff
}
while(test);

more stuff

それはより良いです...

do
{
  some stuff
}
while(test)

more stuff
4

8 に答える 8

57

あなたは声明を終わらせているからです。ステートメントは、ブロック (中括弧で区切られた) またはセミコロンで終了します。「do this while this」は単一のステートメントであり、ブロックで終了できないため (「while」で終了するため)、他のステートメントと同様にセミコロンが必要です。

于 2009-06-02T22:33:46.497 に答える
31

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のすべての通常の(複合ではない)ステートメントは、で終わり;ます。

于 2009-10-25T20:38:39.757 に答える
24

これは、do-while ループ内で while ステートメントが有効だからです。

セミコロンが必要ない場合のさまざまな動作を検討してください。

int x = 10;
int y = 10;

do 
  while(x > 0)
    x--;
while(x = y--);
于 2009-06-02T22:46:05.320 に答える
9

答えはわかりませんが、一貫性が最良の議論のようです。C/C++ のすべてのステートメント グループは、

  1. セミコロン
  2. ブレース

どちらでもない構造を作成するのはなぜですか?

于 2009-06-02T22:34:21.253 に答える
7

フロー制御ステートメントの一貫性

一貫性を考慮して...

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;

対照的に、以下は条件が を逆方向にシークするように指示し、次のステートメントがそれに接続されていないことを伝えた;直後として、より簡単に解決されます。whiledowhile

do statement1; while (expr1); statement2; do ; while (expr2); statement3; while (expr3) statement4;

人々がフローを理解できるようにコードをインデントしていることを考えると、それは問題でしょうか? はい、理由:

  • 人々は時々間違いを犯します (または、コードがマッサージされたときに一時的に間違いを犯します)。視覚的に目立つ場合、それはより簡単に修正されることを意味します。
  • マクロの置換により、多くのステートメントが 1 行にまとめられる可能性があり、トラブルシューティングや QA の実行中に、プリプロセッサの出力を視覚的に確認する必要がある場合があります。

プリプロセッサの使用への影響

また、有名なプリプロセッサの 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 whileif

if (expr)
    do-while-statement
; // empty statement
else
    x = 10;

...そして、ifの後に 2 つのステートメントがあるため、完全であると見なされ、elseステートメントは一致しません。

于 2011-04-13T03:16:23.160 に答える
3

C はセミコロンで終了します (一方、Pascal はセミコロンで区切られます)。そこにセミコロンをドロップすると一貫性がなくなります。

率直に言って、do ループで while を再利用するのは嫌いです。repeat-until の方が混乱が少ないと思います。しかし、それはそれが何であるかです。

于 2009-06-02T22:35:00.443 に答える
1

do.....while();私の答えは、ループの終了にセミコロンを含めなかった場合、コンパイラが混乱する可能性があるということです。これがないと、次のことは明確ではありません。

  1. ドはいつ終わるの?
  2. while の場合、do ループの直後に別のループが続きます。

do......whileそのため、条件が false の場合にループがここで終了することを示すために、ループの最後にセミコロンを含めます。

于 2011-09-24T15:19:35.400 に答える
1

C/C++ では、空白は構造に寄与しません (Python の例のように)。C/C++ では、ステートメントはセミコロンで終了する必要があります。これは許可されています:

do
{
  some stuff; more stuff; even more stuff;
}
while(test);
于 2009-06-02T22:34:29.460 に答える