4

「他にぶら下がっている」問題とは何ですか?(それは正しい名前ですか?)

C++ コーディング標準 (どの標準かは忘れました) に従って、私は常に制御構造でブラケット (ブロック) を使用します。したがって、私は通常、この問題を抱えていません (「if」は最後の(?) else に属します)。何年も前にパスカルに関する本で読んだことを覚えていますが、その本は見つかりません。

4

4 に答える 4

10

それ以外はあいまいです。

ここにいくつかの情報があります: http://theory.stanford.edu/~amitp/yapps/yapps-doc/node3.html

しかし、古典的な例は次のとおりです。

if a then
  if b then
     x = 1;
  else 
     y = 1;

対。

if a then
  if b then
     x = 1;
else 
  y = 1;
于 2009-09-24T20:35:13.753 に答える
7

はどちらifelse属しますか?

if (a < b)
    if (c < d)
        a = b + d;
    else
        b = a + c;

(明らかに、インデントは無視する必要があります。)

それが「ぶら下がり問題」です。

C/C++ は、 an- -with-an-の-bodyとしてan- if-without-an-を持つことはできないというルールを持つことで、あいまいさを取り除きます。elseififelse

于 2009-09-24T20:32:11.240 に答える
2

言語設計の観点からこれを見てください。

-の標準的なBNFのような文法if- else

Statement :-   .. STUFF..
          |    IfStatement

IfStatement :- IF_TOKEN '(' BoolExpression ')' Statement IfElseOpt

IfElseOpt :-   /* Empty */
          |    ELSE_TOKEN Statement

パーサーの観点から:

if (cond1) Statement1
   if (cond2) Statement2
else Statement3

ELSE_TOKENに到達すると、パーサーにはSHIFTまたはREDUCEの2つのオプションがあります。問題は、どちらを選択するかは、パーサーが従わなければならない別のルールを必要とすることです。このオプションを指定すると、ほとんどのパーサージェネレーターはデフォルトでSHIFTになります。

于 2009-09-24T22:31:29.087 に答える
-1

Pascal の問題がわかりませんか?

これは正しくインデントされていません。

if a then
  if b then
     x = 1;
  else
     y = 1;

x = 1 の後ろからセミコロンを削除すると、正しくインデントされます。

これは正しくインデントされています

if a then
  if b then
     x = 1;
else
  y = 1;
于 2009-10-15T09:24:47.900 に答える