Выражения в Tcl отличаются от выражений в С
способом описания операндов. Кроме того, Tcl-выражения поддерживают нечисловые
операнды и сравнение строк.
Операнды могут быть заданы одним из следующих способов:
В качестве примеров рассмотрим простые выражения, в которых переменная a имеет значение '3', а значение переменной b есть '6'. Тогда выражение в левой части каждой строки даст значение в ее правой части:
3.1 + $a | 6.1 |
2 + ($a.$b) | 5.6 |
4*[llength (6 2)] | 8 |
{word one} < (word $a) | 0 |
- + ~ ! |
Унарный минус, унарный плюс, побитовое неравенство NOT, логическое NOT. Ни один из этих операторов не может быть использован со строковыми операндами, а побитовое NOT может использоваться только с целыми числами. |
* / % |
Умножить, разделить, остаток деления. Ни один из этих операторов не может быть использован со строковыми операндами, а оператор остатка может использоваться только для целых чисел. |
+ - |
Сложение и вычитание. Могут использоваться для любых числовых операндов. |
<< >> |
Сдвиг влево и вправо. Операторы можно использовать только с целыми числами. Сдвиг вправо также сдвигает и знаковый бит. |
< > <= >= |
Операторы булевой алгебры: меньше, больше, не больше, не меньше. Каждый оператор дает результат 1, если неравенство верно, и 0 — в обратном случае. Кроме числовых операндов, операторы можно применять для строковых выражений, в этом случае выполняется сравнение строк. |
== != |
Булевские операторы: равно и не равно. Результат операции — число 0 или 1. Операторы можно применять с любыми аргументами. |
& |
Оператор побитового AND. Используется только с целыми операндами. |
^ |
Оператор побитового исключающего OR. Применяется только с целыми числами. |
| |
Оператор побитового OR. Применяется только с целыми числами. |
&& |
Оператор логического AND. Результат равен 1, если оба операнда равны 1, и 0 — в обратном случае. Операндами могут быть любые числа, как целые, так и с плавающей запятой. |
|| |
Оператор логического OR. Результат равен 0, если оба операнда равны 0, и 1 — в обратном случае. Операндами могут быть любые числа, как целые, так и с плавающей запятой. |
x?y:z |
Конструкция if-then-else, подобная аналогичной конструкции в языке C. Операнд х должен иметь числовое значение. Если значение х не равно нулю, то результат команды будет у. В обратном случае результат будет z. |
Операторы одного уровня приоритета исполнения выполняются по очереди, слева направо. Например, команда
Подобно языку C, операторы '&&', '||', и '?:' имеют свойство “ленивого вычисления”, т.е., если операнд не нужен для получения результата, то он не вычисляется. Например, в команде
acos |
cos |
hypot |
sinh |
asin |
cosh |
log |
sqrt |
atan |
exp |
log10 |
tan |
atan2 |
floor |
pow |
tanh |
ceil |
fmod |
sin |
|
Кроме них можно использовать также перечисленные ниже функции преобразования чисел и генерации случайных чисел.
abs(arg) — возвращает абсолютное значение аргумента. Аргумент может быть целым или числом с плавающей точкой. Результат возвращается в такой же форме.
double(arg) – переводит аргумент в десятичное число в плавающей точкой.
int(arg)– переводит аргумент в целое число, обрезая дробную часть.
rand() – возвращает случайное десятичное
число в интервале [0,1).
Исходное значение, используемое при генерации,
берется от внутренних часов или задается с помощью функции srand.
round(arg) – округляет число до целого.
srand(arg) – аргумент, который должен быть целым числом, используется для генерации последовательности случайных чисел. Возвращает первое случайное число из последовательности. Каждый интерпретатор может использовать собственное значение и порождать собственную последовательность случайных чисел.
Пользовательские приложения могут определять
дополнительные функции, используя процедуру Tcl_CreateMathFunc().
В общем случае, обнаружение переполнения и исчезновения значения при операциях с целыми числами зависит от поведения функций конкретной библиотеки С, и потому для промежуточных результатов не может считаться надежным. Переполнение и исчезновение значения при операциях с числами с плавающей запятой обнаруживаются на аппаратном уровне, что обычно надежно обеспечивается.
При необходимости выполняются преобразования внутренних представлений операндов между целыми, строковыми и с плавающей запятой. При арифметических вычислениях используются целые числа до тех пор, пока не будет подставлено или указано число с плавающей запятой. После этого тип данных будет с плавающей запятой.
Числа с плавающей запятой возвращаются либо с точкой, либо с буквой e, так что они заведомо не похожи на целые значения. Например:
expr 5 / ( [string length “abcd”] + 0.0 )
Выражение
expr {”0y” < “0x12”}
Если необходимо сравнить аргументы именно как
строки, а операнды могут быть восприняты неоднозначно, то рекомендуется использовать
команду string compare вместо операторов вида '=='.