不能在delphi中使用IF NOT

Tim*_*ram 1 delphi if-statement set

我有一组字符,我在TYPE部分中定义为:

TAmpls = set of '1'..'9'';
Run Code Online (Sandbox Code Playgroud)

在我的函数中,我在var部分中声明了一个新变量,类型为Tampls:

myAmpls : Tampls;
Run Code Online (Sandbox Code Playgroud)

然后,我使用以下命令取消分配myAmpls中的所有内容:

myAMpls := [];
Run Code Online (Sandbox Code Playgroud)

然后我找到一个整数(我称之为n).如果我的set变量中没有分配这个数字,我想分配它,为此我尝试使用:

if not chr(n) in myAmpls then include(myAmpls,chr(n));
Run Code Online (Sandbox Code Playgroud)

但编译器抛出错误说:

'Operator not applicable to this operand type'
Run Code Online (Sandbox Code Playgroud)

如果我删除'not',代码编译得很好,为什么会这样?

我原以为n是否已经在myAmpls中是布尔值,为什么我不能使用'not'?

Dav*_*nan 6

Delphi运算符优先级在文档中有详细说明.在那里,您将找到列出其优先级的运算符表.我不会在这里重现这个表格,不仅仅是因为它很难在降价中展示!

你也会发现这个文字:

优先级较高的运算符在优先级较低的运算符之前进行求值,而优先级相同的运算符在左侧关联.

你的表达是:

not chr(n) in myAmpls
Run Code Online (Sandbox Code Playgroud)

现在,not优先级高于in.这意味着not首先评估.所以表达式被解析为

(not chr(n)) in myAmpls
Run Code Online (Sandbox Code Playgroud)

这是一个语法错误,因为not不能与字符操作数一起使用.你需要应用parens来为你的表达提供所需的含义:

not (chr(n) in myAmpls)
Run Code Online (Sandbox Code Playgroud)

  • 如果编译器发出'Operator'而不是"不适用于"Char"type",那就太好了.叹. (2认同)