SmileBASIC will automatically optimize parts of expressions that use numerical constants and operators.
This means you can write code like this:
FOR I=0 TO 16-1 ...
'and it won't be any slower than:
FOR I=0 TO 15 ...
Note that SB will not use mathematical simplification. For example:
'will not simplify to
To make SB simplify it, the multiplication of 2*3 must be done first, either X*(2*3) or 2*3*X
Logical and comparison operators are not simplified (&& || > < >= <= == !=), nor are any string operations (string+string, string*number).
It seems that during these optimizations, SB will convert all values into floats, do the operations, and then convert them back into integers if possible.
This is different from how operations are normally done.
For example, / will always do floating point division. The output will never be an integer, even if you do something like
However, during precompilation, 7/1 will actually become an integer, because the result is 7.0 (which can be converted to an integer).
Certain operators that allow integer input will actually work differently during runtime:
PRINT 2147483647*2 '4294967294
PRINT X%*2 '-2
PRINT 2147483647+1 '2147483648
PRINT X%+1 '-2147483648
(This was discovered by SquareFingers and Calc84Maniac (https://smilebasicsource.com/forum?ftid=101) a long time ago but I completely forgot about it)