Operator precedence of exponentiation (**) and complement (~)


#1

The operator precedence table at:

http://phrogz.net/ProgrammingRuby/language.html#table_18.4

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?

Thanks,
/-\

  The new Internet Explorer 8 optimised for Yahoo!7: Faster, Safer, 

Easier.


#2

2009/3/26 Andrew S. removed_email_address@domain.invalid:

 x = ~2**3

According to the japanese reference
manual(http://doc.loveruby.net/refm/api/view/spec/operator),
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]
-9

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

Regards,

Park H.


#3

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”

produces:

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.

Thanks,
/-\

  Enjoy a safer web experience. Upgrade to the new Internet Explorer 

8 optimised for Yahoo!7. Get it now.