[Blitzmax 1.50] incorrect precedence order for self assign operators?
Community Forums/Bug Reports/[Blitzmax 1.50] incorrect precedence order for self assign operators?
| ||
Local offset:float = 4.0 Local correct:float = 2.0 Local wrong:float = 2.0 correct = correct * 0.5 + offset wrong :* 0.5 + offset Print correct Print wrong There may be a valid reason why the self assign operator is evaluated after the assigned value expression? |
| ||
My first thought was that 'wrong :* 0.5 + offset' was not valid code and would not compile. In C n++ would add 1 to n. But n++ is also an expression which has a value, the value of n after the increment. ( On second thought n++ is post increment. The increment takes place after the expression is evaluated. ) I was reading your code as (wrong :* 0.5) + offset which I thought would be invalid, assuming wrong :* 0.5 does not have a value. It just alters the variable wrong. The BlitzMax Language Reference has a section on expressions. But I think the self assign feature was added to the language later and the documentation was never updated. So that doesn't help. Apparently BlitzMax is expecting wrong :* expression, where everything after :* is the expression. Here is a different look at the issue, attempting to use n :+ 1 as if it had a value. n = 2 Print n Print n :+ 1 |
| ||
Yeah I just looked through the source ( here and here). The right hand expression is applied to the operator as this...a :* 5 + offset ' multiply assign statement with expression of '5 + offset' ^^^^^^^^^^ a = a * 5 + offset ' 1 expression made up of * and + expressions assigned to 'a' ^^^^^^^^^^^^^^ Ultimately ':operator' is treated as a statement. |
| ||
Under Help/Language/Variables/Assigning Variables Once declared, a variable's value may be changed using an assignment statement: Variable = Expression You can also perform 'modifying' assignments, which are shorthand for Variable = Variable Operator Expression. The syntax for modifying assignments is: I would assume that Expression referred to everything right of the assign operator, so wrong :* 0.5 + offset would be interpreted as wrong = wrong * (0.5 + offset) |
| ||
seems the glitch is the :* operator is this a becomes thing like MX2 has :=? I know in the past its supposed to be the same as blah = blah * but maybe it was changed somewhen |
| ||
The operator is functioning correctly. Notice that the description says Variable = Variable Operator Expression, it performs the operation on the entire expression on the right, not just the first term. It is intended to behave just like c++ *= operator #include <stdio.h> int main() { float offset = 4.0; float correct = 2.0; float wrong = 2.0; correct = correct * 0.5 + offset; wrong *= 0.5 + offset; printf("%f\n%f",correct,wrong); } outputs 5.000000 9.000000 same as BlitzMAX |
| ||
And there was me thinking it was just shorthand representation, but it indeed does make a difference in the way the calculation is performed. |