Expression evaluation is from left to right; parentheses and operator precedence modify this:
- When parentheses are encountered (other than those that identify
function calls) the entire subexpression between the parentheses is
evaluated immediately when the term is required.
- When the sequence:
term1 operator1 term2 operator2 term3
is
encountered, and operator2 has a higher precedence
than operator1, the subexpression (term2
operator2 term3) is evaluated first. The same rule is applied
repeatedly as necessary. Note, however, that individual terms
are evaluated from left to right in the expression (that is, as soon
as they are encountered). The precedence rules affect only the order
of operations.
For example,
* (multiply) has a higher priority
than
+ (add), so
3+2*5 evaluates
to
13 (rather than the
25 that would
result if strict left to right evaluation occurred). To force the
addition to occur before the multiplication, you could rewrite the
expression as
(3+2)*5. Adding the parentheses makes
the first three tokens a subexpression. Similarly, the expression
-3**2 evaluates
to
9 (instead of
-9) because the
prefix minus operator has a higher priority than the power operator.
The order of precedence of the operators is (highest at the top):
- + - ¬ \
- (prefix operators)
- **
- (power)
- * / % //
- (multiply and divide)
- + -
- (add and subtract)
- (blank) || (abuttal)
- (concatenation with or without blank)
- = > <
- (comparison operators)
- == >> <<
-
- \= ¬=
-
- >< <>
-
- \> ¬>
-
- \< ¬<
-
- \== ¬==
-
- \>> ¬>>
-
- \<< ¬<<
-
- >= >>=
-
- <= <<=
-
- /= /==
-
- &
- (and)
- | &&
- (or, exclusive or)
Examples:
Suppose the symbol
A is a variable whose value
is
3,
DAY is a variable whose value
is
Monday, and other variables are uninitialized.
Then:
A+5 -> '8'
A-4*2 -> '-5'
A/2 -> '1.5'
0.5**2 -> '0.25'
(A+1)>7 -> '0' /* that is, False */
' '='' -> '1' /* that is, True */
' '=='' -> '0' /* that is, False */
' '¬=='' -> '1' /* that is, True */
(A+1)*3=12 -> '1' /* that is, True */
'077'>'11' -> '1' /* that is, True */
'077' >> '11' -> '0' /* that is, False */
'abc' >> 'ab' -> '1' /* that is, True */
'abc' << 'abd' -> '1' /* that is, True */
'ab ' << 'abd' -> '1' /* that is, True */
Today is Day -> 'TODAY IS Monday'
'If it is' day -> 'If it is Monday'
Substr(Day,2,3) -> 'ond' /* Substr is a function */
'!'xxx'!' -> '!XXX!'
'000000' >> '0E0000' -> '1' /* that is, True */
Note: The last example would give a different answer if the
> operator
had been used rather than
>>. Because '0E0000'
is a valid number in exponential notation, a numeric comparison is
done; thus '0E0000' and '000000' evaluate as equal. The REXX order
of precedence usually causes no difficulty because it is the same
as in conventional algebra and other computer languages. There are
two differences from common notations:
- The prefix minus operator always has a higher priority than the
power operator.
- Power® operators (like
other operators) are evaluated left-to-right.
For example:
-3**2 == 9 /* not -9 */
-(2+1)**2 == 9 /* not -9 */
2**2**3 == 64 /* not 256 */