为什么布尔表达式(带副作用)不足以作为语句?

Jen*_*off 12 delphi expression language-design delphi-xe2

function A: Boolean;
function B: Boolean;
Run Code Online (Sandbox Code Playgroud)

我(意外地)写道:

A or B;
Run Code Online (Sandbox Code Playgroud)

而不是:

if not A then
  B;
Run Code Online (Sandbox Code Playgroud)

编译器拒绝第一个表单,我很好奇为什么?

通过短路评估他们会做同样的事情,不是吗?

澄清:我想知道为什么这种语言的设计不允许我的表达作为陈述.

Too*_*the 9

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

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

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

  • 值得指出的是,您可以构建一个有效的语句,该语句也会根据延迟评估模糊地执行"B".`if(A或B)然后......`等 (2认同)

Ond*_*lle 5

第一种形式是一个表达式,它的计算结果为布尔值,而不是语句.


Dav*_*nan 5

简单地说,因为编译器期望一个语句,并且您提供的表达式不是语句.

查阅文档,您将找到有效语句的列表.您的表达式无法在该列表中找到.

你在(现已删除的)评论中询问为什么语言设计者选择不将这样的表达作为一个陈述.但是这个问题意味着可能没有的目的.设计师没有决定不这样做,这是完全合情合理的.相反,他们从不考虑首先做这件事.语言通常旨在解决特定问题.设计师根本没有考虑将这些表达式视为陈述,这是完全合情合理的.