5.6.9.8 Logical Operators
Logical operators are simple data operators that perform bitwise computations on their operands.
-
logical-operator-expression = not-operator-expression / and-operator-expression / or-operator-expression / xor-operator-expression / imp-operator-expression / eqv-operator-expression
Static semantics:
§ Logical operators are statically resolved as simple data operators.
§ A logical operator is invalid if the declared type of any operand is an array or a UDT.
§ For unary logical operators, the operator has the following declared type, based on the declared type of its operand:
|
Operand Declared Type |
Operator Declared Type |
|---|---|
|
Byte |
Byte |
|
Boolean |
Boolean |
|
Integer |
Integer |
|
Any floating-point or fixed-point numeric type, Long, String, String * length or Date |
Long |
|
LongLong |
LongLong |
|
Variant |
Variant |
§ For binary logical operators, the operator has the following declared type, based on the declared type of its operands:
|
Left Operand Declared Type |
Right Operand Declared Type |
Operator Declared Type |
|---|---|---|
|
Byte |
Byte |
Byte |
|
Boolean |
Boolean |
Boolean |
|
Byte or Integer |
Boolean or Integer |
Integer |
|
Boolean or Integer |
Byte or Integer |
Integer |
|
Any floating-point or fixed-point numeric type, Long, String, String * length or Date |
Any numeric type except LongLong, String, String * length or Date |
Long |
|
Any numeric type except LongLong, String, String * length or Date |
Any floating-point or fixed-point numeric type, Long, String, String * length or Date |
Long |
|
LongLong |
Any numeric type, String, String * length or Date |
LongLong |
|
Any numeric type, String, String * length or Date |
LongLong |
LongLong |
|
Any type except an array or UDT |
Variant |
Variant |
Runtime semantics:
§ Logical operators are first evaluated as simple data operators.
§ If the value type of any operand is an array, UDT or Error, runtime error 13 (Type mismatch) is raised.
§ Before evaluating the logical operator, its non-Null operands undergo Let-coercion to the operator’s effective value type.
§ For unary logical operators, the effective value type is determined as follows, based on the value type of the operand:
|
Operand Value Type |
Effective Value Type |
|---|---|
|
Byte |
Byte |
|
Boolean or Integer or Empty |
Integer |
|
Long |
Long |
|
LongLong |
LongLong |
|
Single |
Single |
|
Double or String |
Double |
|
Currency |
Currency |
|
Date |
Date (however, the operand is Let-coerced to Double instead) |
|
Decimal |
Decimal |
|
Null |
Null |
§ For binary logical operators, if either operator is null, the effective value type is determined as follows, based on the value types of the operands:
|
Left Operand Value Type |
Right Operand Value Type |
Effective Value Type |
|---|---|---|
|
Byte or Null |
Byte |
Byte |
|
Byte |
Byte or Null |
Byte |
|
Boolean or Null |
Boolean |
Boolean (however, the operands are Let-coerced to Integer instead) |
|
Boolean |
Boolean or Null |
Boolean (however, the operands are Let-coerced to Integer instead) |
|
Byte, Boolean, Integer, Null or Empty |
Integer or Empty |
Integer |
|
Integer or Empty |
Byte, Boolean, Integer, Null or Empty |
Integer |
|
Byte |
Boolean |
Integer |
|
Boolean |
Byte |
Integer |
|
Any floating-point or fixed-point numeric type, Long, String, Date or Empty |
Any numeric type except LongLong, String, Date, Null or Empty |
Long |
|
Any numeric type except LongLong, String, Date, Null or Empty |
Any floating-point or fixed-point numeric type, Long, String, Date or Empty |
Long |
|
LongLong |
Any numeric type, String, Date or Empty |
LongLong |
|
Any numeric type, String, Date or Empty |
LongLong |
LongLong |
|
Null |
Null |
Null |
The value type of a logical operator is determined from the value the operator produces:
If the logical operator produces a value other than Null, the operator’s value type is its effective value type. The operator’s result value is Let-coerced to this value type.
Otherwise, if the logical operator produces Null, the operator’s value is Null.