Уроки Tcl

Начало Уроки Tk Файлы
Статьи Уроки Tcl Гостевая книга
Предыдущий урок - #05: Обработка и подстановка при группировке с помощью [ ]

#06: Математические вычисления - expr

Движущей силой для использования компьютера традиционально являются математические операции с данными. Такие языки как Basic или C выполняют математические операции когда они появляются в выражении. В Tcl, напротив, есть специальная команда для выполнения вычислений. Команда для выполнения математических операций - это expr. Далее будут изложены способы применения этой команды.

Expr получает строку, разбирает её как выражение на Tcl и возвращает значение. Операторы, разрешенные в выражениях Tcl включают все стандартные математические функции. Результатом математического выражения является число (целое или дробное), тогда как результатом логического выражения является булевский результат (правда или ложь).

Как и в обычной арифметике, выражения в Tcl содержат операторы, операнды и скобки. Между ними могут быть пробелы.

Операнд это:

Когда возможно, операнд рассматривается как целое значение. Целые значения могут быть записаны в десятичном (просто число), в восьмеричном (если первый символ 0), и в шестнадцатеричном (если первые два символа 0x) виде.

Помните, что восьмеричное и шестнадцатеричное преобразование в команде expr и в фазе подстановки интерпретатора отличаются.

Например, в фазе подстановки \x32 (символ с кодом 32 - "2") будет преобразован в символ "2", тогда как число 0x32 в команде expr будет преобразовано в десятичное значение - 50.

Этот код - правильное выражение, результат - истина.

expr \x32 == 0x2

Выражение истинно, так как в фазе подстановки \x32 будет заменено на символ "2", а 0x2 останется без изменения. Команда expr сравнит шестнадцатеричное число 0x2 и десятичное число 2, обнаружит, что они равны, и возвратит истину.

Если операнд не имеет один из приведенных форматов, тогда он будет по возможности интерпретирован как дробное число. Дробные числа могут быть представлены в любом виде, поддерживаемом компилятором C по стандарту ANSI. Для разделения целой и дробной части используется точка. Например: 2.1, 3., 6e4, 7.91e+16. Если невозможно интерпретировать как число, то операнд обрабатывается как строка, для работы с ним может применяться лишь небольшое количество операторов.

Если нет скобок, определяющих порядок вычисления, то Tcl выполняет арифметические операции в таком же порядке, как и вы делаете на бумаге, в соответствии с приоритетом операций.

Как изложено выше, команда expr "5 + -3 * 4" будет вычислена в следующем порядке:

  1. Унарный минус перед числом 3 (3 отрицательное)
  2. Знак умножения (-3 умножить на 4)
  3. Знак плюс (5 прибавить к -12)

Операнды могут быть заданы следующими способами:

Операторы

Все операторы перечислены ниже в порядке уменьшения приоритета:

- + ~ !Унарный минус, унарный плюсь, двоичное НЕ, логическое НЕ Не могут применяться для строк, и двоичное НЕ может применяться только для целых чисел.
* / %Умножение, деление, остаток. Не могут применяться для строковых операндов, и вычисление остатка может применяться только для целых чисел. Остаток всегда меньше делителя и имеет тот же знак.
+ -Сложение и вычитание - только для числовых операндов
<<   >>Левый и правый двоичный сдвиг - только для целых чисел.
&Двоичное И. Только для целых чисел.
^Двоичное исключающее ИЛИ. Только для целых чисел.
|Двоичное ИЛИ. Только для целых чисел.
&&Логическое И. Возвращает 1 если оба операнда ненулевые, и 0 в противном случае. Только для числовых операндов (целых или дробных).
||Логическое ИЛИ. Возвращает 0 если оба операнда нули, иначе 1. Только для числовых операндов (целых или дробных).
x?y:zЕсли-тогда-иначе, как в С. Если x не ноль, тогда результат равен y, иначе z. Операнд x должен быть числом.

Математические функции

Tcl поддерживает следуещие математические функции в выражениях:

Команду expr можно расширить, написав модуль на языке С.

Выполните пример на интерпретаторе Tcl и переходите в к следующему упражнению.

Пример:

set X 100;
set Y 256;
set Z [expr "$Y + $X"]
set Z_LABEL "$Y плюс $X будет "

puts "$Z_LABEL $Z"
puts "Квадратный корень из $Y это [expr sqrt($Y)]\n"

puts "По приоритету \"5 + -3 * 4\"   is: [expr -3 * 4 + 5]"
puts "Согласно скобок \"(5 + -3) * 4\" is: [expr (5 + -3) * 4]"

puts "\n................. ещё примеры различия между  \" и \{"
puts {$Z_LABEL [expr $Y + $X]}
puts "$Z_LABEL {[expr $Y + $X]}"
puts "Команда для сложения двух чисел: \[expr \$a + \$b]"

Следующий урок - #07: Текстовое сравнение - switch
Горбачев "Yurez" Юрий  
Хостинг от uCoz