基于形式Pascal EBNF definition(第69-75页),我看到Pascal只支持3种基本类型:Integer,Real和String。
在C中,任何与0
不同的值都可以解释为true
字面值。 Pascal并不像C一样工作。当Pascal没有布尔类型时,它如何处理条件表达式?
答案 0 :(得分:8)
Pascal标准明确定义了布尔类型的语法和语义。
从您链接的文件中引用:
6.4.2.2必需的简单类型
应存在以下类型:
...
℃。 布尔型。所需的类型标识符布尔值应表示布尔类型。布尔型应为序数型。值应为由所需常量标识符 false 和 true 表示的真值的枚举,以便 false 是真即可。 (第16页)
值 true 和 false 对应于EBNF生产:
constant = [ sign ] (constant-identifier | number) | string
可以产生:
constant = constant-identifier
(因为[ sign ]
是可选的)
constant-identifier
只是identifier
。
此外:
6.7.2.3布尔运算符
...
Boolean-expression = expression .
Boolean-expression必须是表示Boolean-type值的表达式。 (第49页)
表6(在下页)定义了比较运算符的操作数和结果类型(==
,<=
,>=
,<>
,{{1} },<
和>
)。在所有情况下,结果类型都是“布尔型”。
最后:
6.8.3.4 If-statements
如果if语句的Boolean-expression产生值 true ,则应执行if语句的语句。如果Boolean-expression产生值 false ,则不应执行if语句的语句,并且应执行else-part的语句(如果有)。 (第54页)
答案 1 :(得分:4)
EBNF没有描述类型系统,它描述了语法,只描述了语法。但请注意,如果声明变量,则它具有类型:
variable-declaration =
identifier-list ":" type .
类型定义为:
type =
simple-type | structured-type | pointer-type | type-identifier .
而type-identifier
只是identifier
可以是boolean
,但EBNF不会告诉你。你必须看看标准的其余部分。 ISO 7185定义了Pascal方言,相关章节为6.4.2.2:
值应为由所需常数标识符
false
和true
表示的真值的枚举...
在Pascal中,你可能会得到这样的代码:
program BooleanDemo;
var
myBool : boolean;
n : integer;
begin
n := 5;
myBool := n > 4;
if myBool then
writeln('myBool is true')
else
writeln('myBool is false')
end.
尝试自己运行此代码,您会看到实际上有一个布尔类型,它的工作方式与您期望的完全相同。