[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. |