On 03/14/2012 01:20 AM, Nick Sabalausky wrote:
"Timon Gehr"<timon.g...@gmx.ch> wrote in message
>> << >>> // 8 shift operators
== !=> < >=<= \ // 9 relational operators
!> !< !>= !<=<>\
!<> <>= !<>= in \
!in is !is
& // 10 bitwise AND (ambiguous with 9)
^ // 11 bitwise XOR (ambiguous with 9)
| // 12 bitwise OR (ambiguous with 9)
Ah, see, that's what I was tripping up on. I thought there seemed to be
something slightly odd going on with those (and then from there I started
second-guessing everything). It seemed almost like these had both ordered
priorities *and* the same priority.
So how exactly does this part work then?
It is a special case. If a bitwise operator appears next to a relational
operator, then the expression has to be parenthesised for
disambiguation. You can think of it as a partial order:
...
|
shift operators
^ ^
/ \
/ bitwise AND
/ \
/ bitwise XOR
/ \
relational operators bitwise OR
^ ^
\ /
\ /
\ /
\ /
logical AND
^
|
logical OR
^
|
...
The precedence of bitwise operators cannot be compared with the
precedence of relational operators, and D disallows programs that cannot
be parsed unambiguously.