Forum: Ruby Operator precedence of exponentiation (**) and complement (~)

Announcement (2017-05-07): is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see and for other Rails- und Ruby-related community platforms.
Andrew S. (Guest)
on 2009-03-26 08:03
(Received via mailing list)
The operator precedence table at:

states that the exponentiation operator (**) has higher precedence than
the complement operator (~). Ditto for operator precedence in Python.

Yet the following program:

 x = ~2**3
 print x, "\n"      # prints -27 in Ruby; prints -9 in Python

surprised me by printing -27 (I am using ruby 1.8.6).

BTW, the following program prints -9 in both Ruby and Python:

 x = ~(2**3)
 print x, "\n"

Is this a Ruby bug?


      The new Internet Explorer 8 optimised for Yahoo!7: Faster, Safer,
Heesob P. (Guest)
on 2009-03-26 08:52
(Received via mailing list)
2009/3/26 Andrew S. <removed_email_address@domain.invalid>:
>  x = ~2**3
According to the japanese reference
this is not a bug.
I guess this precedence change was made on ruby 1.8.0

C:\work\ruby168\bin>ruby -v -e 'p ~2**3'
ruby 1.6.8 (2002-12-24) [i586-mswin32]

C:\work\ruby180\bin>ruby -v -e 'p ~2**3'
ruby 1.8.0 (2003-08-04) [i386-mswin32]


Park H.
Andrew S. (Guest)
on 2009-03-26 22:07
(Received via mailing list)
Heesob P. wrote:
> ruby 1.8.0 (2003-08-04) [i386-mswin32]
> -27

Thanks. Here's another one that surprised me. Running:

y = 5 % x = 3
print "x=", x, " y=", y, "\n"


x=3 y=2

That is, it seems that:

y = 5 % x = 3

is being parsed as:

y = 5 % (x = 3)

despite the % operator having a higher precedence than the = operator.
I expected it to be parsed as:

y = (5 % x) = 3

producing a syntax error.

If this is a deliberate feature, I'd be interested in learning more
about it.
If anyone knows a good reference on the Ruby parser, please let me know.


      Enjoy a safer web experience. Upgrade to the new Internet Explorer
8 optimised for Yahoo!7. Get it now.
This topic is locked and can not be replied to.