4

什么是“挂别的”问题?(这个名字对吗?)

遵循 C++ 编码标准(忘了哪个),我总是使用带有控制结构的括号(块)。所以我通常不会遇到这个问题(最后一个(?) else 属于哪个“if”),但是为了理解外部代码中可能存在的问题,最好对这个问题有一个深刻的理解。我记得很多年前在一本关于帕斯卡的书中读到过它,但我找不到那本书。

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- if-without-an-else作为ifan- if-with-an- 的 -body else

于 2009-09-24T20:32:11.240 回答
2

从语言设计的角度来看。

-的标准BNF类语法:ifelse

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。问题是选择哪个需要解析器必须遵循的另一个规则。给定此选项时,大多数解析器生成器默认为 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 回答