什么是“挂别的”问题?(这个名字对吗?)
遵循 C++ 编码标准(忘了哪个),我总是使用带有控制结构的括号(块)。所以我通常不会遇到这个问题(最后一个(?) else 属于哪个“if”),但是为了理解外部代码中可能存在的问题,最好对这个问题有一个深刻的理解。我记得很多年前在一本关于帕斯卡的书中读到过它,但我找不到那本书。
其他暧昧。
这里有一些信息: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;
属于哪个if
?else
if (a < b)
if (c < d)
a = b + d;
else
b = a + c;
(显然你应该忽略缩进。)
这就是“挂别的问题”。
C/C++ 通过制定一条规则来消除歧义,即您不能将 an- if
-without-an-else
作为if
an- if
-with-an- 的 -body else
。
从语言设计的角度来看。
-的标准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。问题是选择哪个需要解析器必须遵循的另一个规则。给定此选项时,大多数解析器生成器默认为 SHIFT。
我没有看到 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;