C++ 还有什么问题吗?
“绞死其他人”的问题是什么?(这个名字对吗?) <> >遵循C++编码标准(忘记了哪一个) 将括号(块)与控制结构一起使用。所以我不知道 通常存在此问题(最后一个(?) 除此之外,还需要了解 外文代码如果能对其有一个坚实的理解就好了 这个问题。我记得读过一本关于它的书C++ 还有什么问题吗?,c++,pascal,C++,Pascal,“绞死其他人”的问题是什么?(这个名字对吗?) >遵循C++编码标准(忘记了哪一个) 将括号(块)与控制结构一起使用。所以我不知道 通常存在此问题(最后一个(?) 除此之外,还需要了解 外文代码如果能对其有一个坚实的理解就好了 这个问题。我记得读过一本关于它的书 帕斯卡已经很多年了,但我找不到那本书。如果其他属于哪个 if (a < b) if (c < d) a = b + d; else b = a + c; if(a
帕斯卡已经很多年了,但我找不到那本书。如果
其他属于哪个
if (a < b)
if (c < d)
a = b + d;
else
b = a + c;
if(a
(显然,您应该忽略缩进。)
这就是“绞死别人的问题”
C/C++通过一条规则来消除歧义,该规则规定,如果没有一个-if
,你就不能有一个-if
,而没有一个-else
,作为一个带有一个-else歧义else的-if
-body
这里有一些信息:
但经典的例子是:
if a then
if b then
x = 1;
else
y = 1;
vs
从langauge设计的角度来看这一点
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_标记时,解析器有两个选项,SHIFT或REDUCE。问题是选择哪一个需要解析器必须遵循的另一条规则。当给定此选项时,大多数解析器生成器默认为SHIFT 我看不出帕斯卡有什么问题
这个缩进不正确
if a then
if b then
x = 1;
else
y = 1;
从x=1后删除分号将使其正确缩进
if a then
if b then
x = 1;
else
y = 1;
这一个缩进正确
if a then
if b then
x = 1;
else
y = 1;
我相信这将是“悬而未决的其他”问题。老实说,我从来都不明白这个问题。我在语言领域缺乏经验,但我使用的每一种语言都能很好地定义行为。如果相反,问题是如果(1)如果(某个条件)a=1;否则b=1;例如,在C语言中,它是一个完全不同的控制流(与您发布的流相比)。@Steven:我不是C语言程序员,所以我可能错了,但我不知道只有一个编辑器“C/C++通过使用一条规则来消除歧义,该规则规定如果没有else作为if的主体,就不能使用if。”当然可以<代码>如果(a
@Peter:我通过插入几个连字符使这句话更加容易理解。8-)我认为解释C/C++规则的一个更简单的方法是通常的:else
总是绑定到最接近的匹配if
。从解析器的角度来看,问题是不能仅从语言语法中的结果来解决歧义。解析器需要额外的信息,特别是说明如何解析它的规则。(我所知道的所有语言都有一个规则,称C++与最新IF绑定),除了C++通常不使用Selp Read(即LR(k))解析器。也许不是。但是概念是一样的,我不想讨论所有可能的解析模式,因为它看起来并不相关。为什么Pascal没有这个问题?它既有复合块也有非复合块。很可能,Pascal定义了一个规则来解决歧义,就像大多数语言一样,这与根本没有问题并不完全相同。这是Pascal吗?它应该是x:=1,而不是x=1。