#### 14.2.7 Macro Expressions ¶

Macro expressions are used in conditional expansion and loops, which are described in the following sections. A macro expression may use the following operators, listed in descending order of operator precedence:

`()`

  Parentheses override the default operator precedence.

`!EQ !NE !GT !LT !GE !LE = ~= <> > < >= <=`

  Relational operators compare their operands and yield a Boolean result, either ‘`0`’ for false or ‘`1`’ for true.

  These operators always compare their operands as strings. This can be surprising when the strings are numbers because, e.g., `1 < 1.0` and `10 < 2` both evaluate to ‘`1`’ (true).

  Comparisons are case sensitive, so that `a = A` evaluates to ‘`0`’ (false).

`!NOT ~`
`!AND &`
`!OR |`

  Logical operators interpret their operands as Boolean values, where quoted or unquoted ‘`0`’ is false and anything else is true, and yield a Boolean result, either ‘`0`’ for false or ‘`1`’ for true.

Macro expressions do not include any arithmetic operators.

An operand in an expression may be a single token (including a macro argument name) or a macro function invocation. Either way, the expression evaluator unquotes the operand, so that `1 = '1'` is true.