Don't confuse "operator precedence" and "order of evaluation".
precedence tells you how the results of individual parts of the
calculation are combined. For instance, 1+2*3+4 will give 11 (i.e.
multiplication is higher precedence than addition, so the 2 is
multiplied by the 3 and then that is used in the lower precedence
addition). If you wanted different, you would need brackets ...
(1+2)*(3+4) would give you 21 (3*7).
order of evaluation (for LC) is left to right (regardless of precedence
!!).
Try this cute test case
global C
function getnext
add 1 to C
return C
end getnext
on mouseUp
put 0 into C
put getnext()+getnext()*getnext()+getnext()
end mouseUp
this results in 11 - i.e. 1 + 2*3 + 4
If evaluation order had followed precedence then it would have been 3 +
(1*2) + 4 ---> 9
The similar rules apply when evaluating logical expressions in a test
condition, with the additional proviso that LC will stop evaluating the
terms of the expression as soon as the eventual result is determined. So,
on mouseUp
put 0 into C
if getnext() > 0 and getnext() < 2 and getnext()< 3 and getnext()<3
then
put "that's a surprise"
else
put getnext()
end if
end mouseUp
produces 3 (first term is true, second term is false and at that point
we know the whole expression must be false, so we stop evaluating -
therefore the next call to getnext() produces 3
-- Alex.
On 06/10/2011 01:26, Pete wrote:
I just read the section in the manual about operator precedence and I think
perhaps I'm even more confused than I was! It details a strict order of
precedence which seems to contradict the knowledge that condition evaluation
proceeds from left to right and stops as soon as a false one is found.
Maybe I'll try a few test cases.
Pete
Molly's Revenge<http://www.mollysrevenge.com>
_______________________________________________
use-livecode mailing list
use-livecode@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription
preferences:
http://lists.runrev.com/mailman/listinfo/use-livecode