Правила для смешанных типов
Общего неявного преобразования нет. У каждого оператора есть короткий список понятных ему сочетаний
типов. Любое другое сочетание не вызывает ошибку. Оно молча даёт Integer 0 (или false для
сравнения порядка), и скрипт продолжает работу. Так сделано намеренно, чтобы одно странное значение
не прерывало действие на полпути. Но это значит и то, что выражение с ошибкой в типах не срабатывает
молча, поэтому, если результат выглядит неправильно, проверьте его через UtilityPrint.
| Оператор | Допустимые сочетания → результат | Всё остальное |
|---|---|---|
+ | Text + Text → Text (конкатенация) Integer + Integer → Integer смесь Integer/Real → Real | 0 |
- * | Integer ∘ Integer → Integer смесь Integer/Real → Real | 0 |
/ | Integer / Integer → Integer с отбрасыванием дробной части в сторону нуля (-7 / 2 равно -3)смесь Integer/Real → Real деление на ноль → 0 или 0.0, без ошибки | 0 |
== != | один тип → сравнение по значению (Text точно и с учётом регистра, Window по дескриптору) Integer и Real → численное сравнение ( 5 == 5.0) | никогда не равны: 1 == true, "5" == 5 и w == 0 — все false |
< <= > >= | два числа (смесь Integer/Real допустима) → числовой порядок Text и Text → порядковое сравнение с учётом регистра (кодовые единицы UTF-16: "Z" < "a") | false для всех четырёх, поэтому !(a < b) здесь не означает a >= b |
&& || ! | любые типы, через истинность → Bool | |
& | ^ | Integer ∘ Integer → Integer | 0 (операнд Bool или Real тоже: true & true равно 0) |
<< >> | Integer на Integer 0–63 → Integer. >> сохраняет знак: -16 >> 2 равно -4. | 0, в том числе при сдвиге меньше 0 или больше 63 |
унарный - | Integer → Integer, Real → Real | 0 |
~ | Integer → Integer (~0 равно -1) | 0 |
Преобразование между типами:
| Из → в | Как |
|---|---|
| Integer → Real | автоматически при передаче в параметр встроенной функции, объявленный как Real; в остальных случаях n * 1.0 (любая арифметика с Real даёт Real) |
| Real → Integer | MathRound(r) (половины округляются от нуля), MathFloor(r) или MathCeil(r) |
| что угодно → Text | StringFormat("{0}", value, "") |
| Bool → Integer | if (b) n = 1; else n = 0; |
| Text → число | StringToNumber(text, false) для того, что ввёл человек (в его региональном формате; группы разрядов должны ему соответствовать, поэтому для пользователя с форматом «Русский (Россия)» 12 34,5 — не число), true для машинного текста (десятичная точка ., без разделителей разрядов). Integer, если число целое, иначе Real; сначала StringIsNumber, если текст может не быть числом (см. этот пример). |
| число → Text | StringFromNumber(n, decimals, invariantCulture), decimals равно -1 — столько знаков, сколько нужно |
| Integer → шестнадцатеричный Text | встроенной функции для этого нет. Постройте его сдвигами (см. этот пример). |