Уроки Tcl
#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 если оба операнда ненулевые, и 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]" |
Горбачев "Yurez" Юрий |