Перейти к основному содержимому

Правила для смешанных типов

Общего неявного преобразования нет. У каждого оператора есть короткий список понятных ему сочетаний типов. Любое другое сочетание не вызывает ошибку. Оно молча даёт 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 → Integer0 (операнд Bool или Real тоже: true & true равно 0)
<< >>Integer на Integer 0–63 → Integer. >> сохраняет знак: -16 >> 2 равно -4.0, в том числе при сдвиге меньше 0 или больше 63
унарный -Integer → Integer, Real → Real0
~Integer → Integer (~0 равно -1)0

Преобразование между типами:

Из → вКак
Integer → Realавтоматически при передаче в параметр встроенной функции, объявленный как Real; в остальных случаях n * 1.0 (любая арифметика с Real даёт Real)
Real → IntegerMathRound(r) (половины округляются от нуля), MathFloor(r) или MathCeil(r)
что угодно → TextStringFormat("{0}", value, "")
Bool → Integerif (b) n = 1; else n = 0;
Text → числоStringToNumber(text, false) для того, что ввёл человек (в его региональном формате; группы разрядов должны ему соответствовать, поэтому для пользователя с форматом «Русский (Россия)» 12 34,5 — не число), true для машинного текста (десятичная точка ., без разделителей разрядов). Integer, если число целое, иначе Real; сначала StringIsNumber, если текст может не быть числом (см. этот пример).
число → TextStringFromNumber(n, decimals, invariantCulture), decimals равно -1 — столько знаков, сколько нужно
Integer → шестнадцатеричный Textвстроенной функции для этого нет. Постройте его сдвигами (см. этот пример).