Win a copy of Functional Reactive Programming this week in the Other Languages forum!
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic

Evaluation Order.

 
Vicken Karaoghlanian
Ranch Hand
Posts: 522
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
from this code


the result is true, false, false
the part i don't understand is that the '&&' operator has a higher priority over '||' therfore it'll be evaluated first, but this is not what is happening.
for a strange reason '||' is evaluated first.
any ideas why?
 
Barkat Mardhani
Ranch Hand
Posts: 787
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I do not understand how b and c are fales. They should be true....
 
Hanna Habashy
Ranch Hand
Posts: 532
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
hi:
boolean x = (a = true) || (b = true) && (c = true); this statement is equilvalent to: boolean x = (a = true) || ((b = true)) && (c = true));
In short ciruit operator OR, if the left side is true, the right side is not evaluated. In the previouse statement <a=true> then the right statement will never be evaluated, and b & c will stay false.
 
Steve Lovelace
Ranch Hand
Posts: 125
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
My understanding: operator precedene does not directly dictate order of evaluation - it dictates how operands get associated with operators. Evaluation proceeds from left to right. So as mentioned above
a + b * c
is treated as:
a + (b * c) and evaluation goes from left to right
as opposed to:
(b * c) + a
You can convince yourself of this with:
 
Vicken Karaoghlanian
Ranch Hand
Posts: 522
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
you are probably right Steve, however operator evaluation order sometimes gets really uncomfortable.
there is a lot of question regarding this matter in 'Dan Chisholm' exams, for instance...

this is evaluated as: a=(int)((1)+(++a + a++))
Steve, what do you think about this:
to evaluate an expression:
1) Use brackets to seperate operators with higher priorities.
2) always start evaluating from left to right.
for example: a = a + b * c;
1) a = a + (b * c)
2) start evaluating from L --> R
 
Steve Lovelace
Ranch Hand
Posts: 125
  • Mark post as helpful
  • send pies
  • Quote
  • Report post to moderator
I think that is exactly what compilers are supposed to be doing.
HOWEVER, quoting from Kernighan & Ritchie "...writing code that depends on order of evaluation is a bad programming practive in any language."
HOWEVER, I believe Java specifies left-to-right order more rigorously than the C specification does: evaluation order
 
  • Post Reply
  • Bookmark Topic Watch Topic
  • New Topic