2014-04-02 37 views
12
function A: Boolean; 
function B: Boolean; 

我(不小心)写了这个:为什么布尔表达式(带有副作用)不足作为语句?

A or B; 

取而代之的是:

if not A then 
    B; 

编译器拒绝第一种形式,我很好奇,为什么?

短路评估他们都会做同样的事情,他们不会?

澄清:我想知道为什么这个语言不是为了让我的表达作为一个陈述而设计的。

+0

其实,我很高兴这是不允许的,因为它是恕我直言,根本不可读。有趣的问题,但。 – jpfollenius

+1

因为Delphi还不是PHP的分形。 –

回答

5

简而言之,因为编译器期望statement并且您提供的表达式不是语句。

请参考documentation,您将找到有效声明的列表。您的表情无法在该列表中找到。

你在(现在删除的)评论中询问了为什么语言设计者选择不要将这样的表达算作一种陈述。但是这个问题意味着可能没有的目的。设计师没有决定不这样做是完全合理的。相反,他们从来没有考虑过这么做。语言通常旨在解决特定问题。设计师从来没有考虑过将这些表达方式看作是陈述,这是完全合理的。

5

第一种形式是一个表达式,其值是一个布尔值,而不是一个语句。

9

第一个是表达式。表达式被评估。表达式没有可见的副作用(如读取或写入变量)。表达式的两个操作数都是函数,可以有副作用,但为了产生副作用,必须执行一条语句。

第二个是声明。它比较表达式的结果并基于评估调用另一个函数。

令人困惑的部分是,在这种情况下,Delphi允许我们忽略函数的结果并将其作为函数执行。所以你期望A or B相同。但这是不允许的。这很好,因为行为不明确。例如,如果您已启用延迟评估。 A评估为真,B被称为是或否。

+2

值得指出的是,你可以只用相同的构造一个有效的语句,根据懒惰评估也会模糊执行'B'。 '如果(A或B)那么...'等 –

+0

“表达式没有可见的副作用(如读或写变量)。”写一个变量*是一个可见的副作用!更不用说那些函数调用也是表达式,这当然会有副作用。 – munificent

2

Delphi的核心是Pascal。 Pascal语言由Nicklaus Wirth设计并于1968年出版。我的用户手册和报告的副本始于1978年。它的设计思想有两个目的,作为一种教学语言,并且易于在任何给定机器上实现。在这方面他非常成功。

Wirth非常熟悉当时的其他语言(包括Fortran,Cobol,特别是Algol),并为特定目的作了一系列谨慎的选择。特别是,他仔细地将“行动”的概念与“价值观”分开。帕斯卡的'行为'是语言中的陈述,包括过程调用。 '值'包含函数调用。在这个和其他一些方面,这个语言和Algol非常相似。

声明和使用动作和值的语法是仔细保持相当分离的。语言和随它提供的库一般不会有这样的“副作用”。程序做事情和表达式计算价值。例如,'read'是一个过程,而不是一个函数,因为它检索一个值并在文件中前进,但'eof'是一个函数。

Pascal的大众市场版本是由Borland在20世纪80年代中期创建的,并且先后成为Windows和Delphi的Turbo Pascal。语言已经发生了很大的变化,并不是所有的都像沃斯设计的那样纯净。这是一个幸存下来的功能。

顺便提一句,帕斯卡没有短路评估。它有堆内存和集合,但没有对象。他们迟到了。

相关问题