Полагаю, вы также можете получить предупреждение о нечисловом значении, если опустить "()".
Как нормальное математическое правило, скобки решаются первыми, поэтому в
"a".(strlen('ab')-strlen('a'))
strlen('ab')
равно 2 и,
strlen('a')
равно 1,
таким образом, 2-1 = 1, и это конкрементно с 'a', таким образом, становится 'a1'.
А когда вы уберете скобки,
"a".strlen('ab')-strlen('a')
затем выполняется слева направо, так что
strlen('ab')
concate с 'a', который дает a2
- затем 'a2', который не является числовым, вычитается с
strlen('a')
, который равен 1., поэтому отображается предупреждение.
- Но 'a2' вынужден быть преобразован в числовое значение, таким образом, становится 0, так что наконец
- 0 - 1 = -1