1

まず、GCC の man ページのスクリーンショットを投稿させてください。

ここに画像の説明を入力

デモ コードの 2 番目のバンドルのすぐ上の文は、「'else' がそれを囲む 'if' に属することはあり得ない」と書かれているため、私を混乱させます。著者の考えを理解しようとする限り、最も内側の if ステートメントはif(b)andfoo();です。彼は、「囲んでいる 'if'」と言ったとき、if(b) を参照するつもりでした。しかし、私の推測が正しければ、デモ コードは次のようになります。

    {
       if(a)
          {
             if(b)
                foo();
          }
       else
          bar();
    }

私は正しいですか?問題は、「囲んでいる 'if' 」とは何かということです。

4

2 に答える 2

4

「内包する」とは、if別の (「内部」) if が「内包」されているものです。

あなたを混乱させる文は正しいです。この段落では、最初の例と同じ結果を得るには、2 番目の例に示すように括弧を配置する必要があると述べています (ただし、からの警告はありませんgcc)。

例 1 のインデントで示されているコードが必要な場合は、その例が正しいでしょう。

文の意味は次のとおりです。例1では、else句は inner に属してifいますが、これは偶然にすぎない可能性があります(例の動作が必要な場合)。例 2 のようにコードを記述した場合、これを意図した「方法はありません」。

于 2013-10-06T14:23:38.370 に答える
1

著者の考えを理解しようとする限り、最も内側の if ステートメントは if(b) と foo(); です。

はい。そして the elseis は it の節であり、それを囲む if の節ではありません。

彼は、「囲んでいる 'if'」と言ったとき、if(b) を参照するつもりでした。

いいえ、彼/彼はelse、 が最も内側に属し、囲んでいるものではないことを明確にする方法について議論していました。つまり、コンパイラがこの警告をスローしないようにします。

それ以外は、2 つの例は機能的に同一です。唯一の違いは、警告が発生することです。中括弧を使用したバージョンは、これら 2 つとは機能的に異なります。これによりelse、囲みの a 句が作成されif(a)ます。

于 2013-10-06T14:30:09.460 に答える