0

誰かが次のような C++ コードを書いているのを見たことがあります。

if (something is true)
    for (int i = 0; i < max; i++) {
        //do something
        line 1;
        line 2;
        line 3;
        ....
        ....
    }
else
    ....

次のコードと同じように機能します。

if (something is true) {  //note the bracket here
    for (int i = 0; i < max; i++) {
        //do something
        line 1;
        line 2;
        line 3;
        ....
        ....
    }
}
else
    ....

forコンパイラがループ ブロックをif句内にネストされた 1 行として処理したかどうか疑問に思っています。括弧内の複数行のコードを常に 1 行として扱うことはできますか? コンパイラがこれをどのように解析および分析するのか、私にはよくわかりません。

4

5 に答える 5

5

読者を混乱させやすいかもしれませんが、これは確かに正しいコードです。if-statement は、次の最初のステートメントをそのステートメントと見なしますthen。間のコード{}は通常、ブロックまたは複合ステートメントと見なされ、その中にステートメントが含まれます。同様に、forステートメントは、それに続く最初のステートメントであるループ本体を含む 1 つのステートメントと見なされます (これもブロックになる可能性があります)。

于 2013-09-11T17:27:30.110 に答える
2

それらは実際には「線」ではなく、ステートメントです。たとえば、あなたの

line 1;
line 2;
line 3;

次のように書き換えることができ、次のように有効です。

line 1; line 2; line 3;

したがって、コンパイラは実際には行ではなくステートメントを調べています。

文法で定義された単一のステートメントは、次のいずれかと見なされます (多少簡略化されています)。

1) セミコロンで終わる単純なステートメント (上記のように)

また

2) 括弧で囲まれた 1 つ以上の単純なステートメントであるステートメント ブロックとして{}

于 2013-09-11T17:32:57.987 に答える
2

ifブラケットのないステートメントは、次の単一ステートメント (forループ) を実行する本体の一部と見なすため、最初のケースは正常に実行されます。for ループの本体は、ループ自体の一部です。

ループ自体に括弧がなければ、ループの最初のステートメントだけが実行されます。

于 2013-09-11T17:25:54.450 に答える
2

{}複合ステートメントまたはブロックを定義します。

制御構造の導入により、複合ステートメントまたはブロックという新しい概念を導入する必要があります。ブロックは、すべての C++ ステートメントと同様にセミコロン (;) で区切られたステートメントのグループですが、中括弧で囲まれたブロックにグループ化されています: { }:

cplusplus.com から:制御構造

制御構造は次のifように定義されます。

if (condition) statement

これstatementは、単一の命令/ステートメント、またはcompound statement. いずれにせよ、それは次に実行されるステートメントです。

for (;;) statement反復構造と呼ばれる特殊なタイプの制御構造です。

したがって、

//The control structure is going to apply to the next statement
if (condition)
    for (;;) //This for loop is the next statement. It applies to the next statement.
    {
        //The next statement is a compound statement.
    }
于 2013-09-11T17:42:56.450 に答える
0

はい、if ステートメントの後に括弧がない場合、条件が真であれば次の行を処理します。次の行は for 文なので、1 つのコマンドとして扱います。

于 2013-09-11T17:26:15.350 に答える