Tim M
Tim M

Reputation: 487

Can't use IF NOT with a set in delphi

I have a set of chars which I define in the TYPE section as:

TAmpls = set of '1'..'9'';

In my function I declare a new variable, in the var section, with type Tampls using:

myAmpls : Tampls;

I then un-assign everything in myAmpls using:

myAMpls := [];

I then find an integer (I'll call it n). If this number is not assigned in my set variable, I want to assign it, for this I have tried using:

if not chr(n) in myAmpls then include(myAmpls,chr(n));

But the compiler throws an error saying:

'Operator not applicable to this operand type'

If I remove the 'not', the code compiles fine, why is this?

I would have thought that whether or not n was already in myAmpls was boolean, so why can't I use 'not'?

Upvotes: 1

Views: 10277

Answers (1)

David Heffernan
David Heffernan

Reputation: 613602

Delphi operator precedence is detailed in the documentation. There you will find a table of the operators listing their precedence. I won't reproduce the table here, no least because it's hard to lay out in markdown!

You will also find this text:

An operator with higher precedence is evaluated before an operator with lower precedence, while operators of equal precedence associate to the left.

Your expression is:

not chr(n) in myAmpls

Now, not has higher precedence than in. Which means that not is evaluated first. So the expression is parsed as

(not chr(n)) in myAmpls

And that is a syntax error because not cannot be used with a character operand. You need to apply parens to give the desired meaning to your expression:

not (chr(n) in myAmpls)

Upvotes: 8

Related Questions