什么是“悬挂其他”问题? (这是正确的名字吗?)
遵循C ++编码标准(忘记哪一个)我总是 使用带有控制结构的括号(块)。所以我没有 通常有这个问题(最后(?)的“如果” 否则属于),但为了解可能的问题 外国代码,如果对它有一个坚定的理解,那就太好了 这个问题。我记得在一本书中读过这篇文章 很多年前Pascal,但我找不到那本书。
答案 0 :(得分:10)
暧昧其他。
此处有一些信息:http://theory.stanford.edu/~amitp/yapps/yapps-doc/node3.html
但经典的例子是:
if a then
if b then
x = 1;
else
y = 1;
VS
if a then
if b then
x = 1;
else
y = 1;
答案 1 :(得分:8)
if
属于哪个else
?
if (a < b)
if (c < d)
a = b + d;
else
b = a + c;
(显然你应该忽略缩进。)
这就是“悬而未决的问题”。
C / C ++通过一条规则表明你不能拥有 - if
- 没有 - else
作为if
- 身体来摆脱歧义 - if
- 与 - 一个 - else
答案 2 :(得分: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。问题是选择哪个需要解析器必须遵循的另一个规则。给定此选项时,大多数解析器生成器默认为SHIFT。
答案 3 :(得分:-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;