название
expr - Оценить выражение
конспект
выраж Arg ? arg arg … ?
Объединяет Arg (добавление разделительных пространств между ними), оценивает результат как выражение Tcl и возвращает значение. Операторы, разрешенные в выражениях Tcl, являются подмножеством операторов, разрешенных в выражениях C, и имеют то же значение и приоритет, что и соответствующие операторы C. Выражения почти всегда приводят к числовым результатам (целочисленные или значения с плавающей запятой). Например, выражение
expr 8.2 + 6
оценивается до 14.2. Выражения Tcl отличаются от выражений C тем, как указаны операнды. Кроме того, выражения Tcl поддерживают нечисловые операнды и сравнения строк.
Операнды
Выражение Tcl состоит из комбинации операндов, операторов и круглых скобок. Между операндами и операторами и круглыми скобками может использоваться пробел; он игнорируется инструкциями выражения. По возможности операнды интерпретируются как целые значения. Целочисленные значения могут быть указаны в десятичном (нормальном случае), в восьмеричном (если первый символ операнда равен0) или в шестнадцатеричном (если первые два символа операнда0x). Если операнд не имеет одного из целочисленных форматов, указанных выше, тогда он рассматривается как число с плавающей запятой, если это возможно. Номера с плавающей запятой могут быть указаны любым способом, приемлемым для компилятора, совместимого с ANSI (за исключением того, чтое, F, L, а такжеL суффиксы не будут разрешены в большинстве установок). Например, все следующие действительные числа с плавающей запятой: 2.1, 3., 6e4, 7.91e + 16. Если числовая интерпретация невозможна, то операнд остается в виде строки (и к нему может применяться только ограниченный набор операторов).
Операнды могут быть указаны одним из следующих способов:
1
В качестве числового значения - целое или с плавающей запятой.
2
Как переменная Tcl, используя стандартные$ нотации. Значение переменной будет использоваться в качестве операнда.
3
Как строка, заключенная в двойные кавычки. Парсер выражений будет выполнять обратную косую черту, переменную и подстановки команд в информации между кавычками и использовать результирующее значение в качестве операнда
4
Как строка, заключенная в фигурные скобки. Символы между открытой скобкой и совпадающей скобкой будут использоваться в качестве операнда без каких-либо подстановок.
5
Как команда Tcl, заключенная в скобки. Команда будет выполнена, и ее результат будет использоваться в качестве операнда.
6
Как математическая функция, аргументы которой имеют любую из указанных выше форм для операндов, таких какгрех ($ х), Ниже приведен список определенных функций.
Когда замещения происходят выше (например, внутри цитируемых строк), они выполняются инструкциями выражения. Тем не менее, дополнительный слой подстановки, возможно, уже был выполнен парсером команды до того, как был вызван процессор выражения. Как обсуждается ниже, обычно лучше всего заключать выражения в фигурные скобки, чтобы не допустить, чтобы синтаксический анализатор команды выполнял замены в содержимом.
Для некоторых примеров простых выражений предположим, что переменная имеет значение 3, а переменнаябимеет значение 6. Затем команда в левой части каждой из строк ниже произведет значение в правой части строки:
expr 3.1 + $ a6.1 expr 2 + "$ a. $ b" 5.6 expr 4 * llength "6 2" 8 expr {{word one} <"word $ a"} 0
операторы
Действующие операторы перечислены ниже, сгруппированные в порядке убывания приоритета:
- + ~ !
Унарный минус, унарный плюс, бит-мудрый NOT, логический NOT. Ни один из этих операндов не может быть применен к строковым операндам, и бит-мудрый NOT может применяться только к целым числам.
* / %
Умножьте, разделите, остаток. Ни один из этих операндов не может применяться к строковым операндам, а остаток может применяться только к целым числам. Остаток всегда будет иметь тот же знак, что и делитель, и абсолютное значение, меньшее, чем делитель.
+ -
Добавить и вычесть. Действительно для любых числовых операндов.
<< >>
Левая и правая смена. Действительно для целых операндов. Правая сдвиг всегда распространяется на бит знака.
< > <= >=
Boolean меньше, больше, меньше или равно, и больше или равно. Каждый оператор производит 1, если условие истинно, 0 в противном случае. Эти операторы могут применяться к строкам, а также к числовым операндам, и в этом случае используется сравнение строк.
== !=
Boolean равно и не равно. Каждый оператор производит нуль / один результат. Действителен для всех типов операндов.
&
Побитовое И. Действительно для целых операндов.
^
Побитовое исключение ИЛИ. Действительно для целых операндов.
|
Побитовое ИЛИ. Действительно для целых операндов.
&&
Логические И. Производит 1 результат, если оба операнда отличны от нуля, 0 в противном случае. Действителен только для логических и числовых (целых чисел или с плавающей запятой) операндов.
||
Логический ИЛИ. Производит результат 0, если оба операнда равны нулю, 1 в противном случае. Действителен только для логических и числовых (целых чисел или с плавающей запятой) операндов.
Икс ? Y : Z
If-then-else, как в C. Если Икс оценивается не равным нулю, то результатом является значение Y , В противном случае результатом будет значение Z , Икс операнд должен иметь числовое значение.
Более подробную информацию о результатах, полученных каждым оператором, см. В руководстве по эксплуатации. Все бинарные операторы группируются слева направо в пределах одного и того же уровня приоритета. Например, команда
expr 4 * 2 <7
возвращает 0.
&&, ||, а также?: операторы имеют «ленивую оценку», как и в C, что означает, что операнды не оцениваются, если они не нужны для определения результата. Например, в команде
expr {$ v? a: b}
только один изА или жеЬ будет фактически оценена, в зависимости от значения$ v, Обратите внимание, однако, что это верно только в том случае, если все выражение заключено в фигурные скобки; в противном случае парсер Tcl будет оценивать какА а такжеЬ перед вызовомвыраж команда.
Математические функции
Tcl поддерживает следующие математические функции в выражениях:
абс сЬжурналSQRT экоса двойнойlog10srand как в ехрбухзагар загар этажрантTANH atan2 FMODкруглый перекрывать hypotгрех соз ИНТзп
абс ( Arg )
Возвращает абсолютное значение Arg . Arg может быть либо целым, либо с плавающей точкой, и результат возвращается в той же форме.
экоса ( Arg )
Возвращает косинус дуги Arg , в диапазоне 0, pi радиан. Arg должен находиться в диапазоне -1,1.
как в( Arg )
Возвращает синус дуги Arg , в диапазоне -pi / 2, pi / 2 радиан. Arg должен находиться в диапазоне -1,1.
загар( Arg )
Возвращает тангенс дуги Arg , в диапазоне -pi / 2, pi / 2 радиан.
atan2 ( x, y )
Возвращает тангенс дуги Y / Икс , в диапазоне -pi, pi радиан. Икс а также Y не могут быть равны 0.
CEIL ( Arg )
Возвращает наименьшее целое значение не менее Arg .
соз ( Arg )
Возвращает косинус Arg , измеренный в радианах.
сЬ ( Arg )
Возвращает гиперболический косинус уравнения Arg , Если результат приведет к переполнению, возвращается ошибка.
двойной ( Arg )
Если Arg является плавающим значением, возвращает Arg , в противном случае преобразует Arg к плавающей и возвращает преобразованное значение.
ехр ( Arg )
Возвращает экспоненту Arg , определяемый как e ** Arg , Если результат приведет к переполнению, возвращается ошибка.
этаж( Arg )
Возвращает наибольшее целое значение, не большее Arg .
FMOD ( x, y )
Возвращает остаток с плавающей запятой деления Икс от Y , Если Y равен 0, возвращается ошибка.
hypot ( x, y )
Вычисляет длину гипотенузы прямоугольного треугольника ( Икс * Икс + Y * Y ).
INT ( Arg )
Если Arg является целочисленным значением, возвращает Arg , в противном случае преобразует Arg к целому по усечению и возвращает преобразованное значение.
журнал( Arg )
Возвращает натуральный логарифм Arg . Arg должно быть положительным.
log10 ( Arg )
Возвращает логарифм базы 10 Arg . Arg должно быть положительным.
пау ( x, y )
Вычисляет значение Икс поднят до власти Y , Если Икс является отрицательным, Y должно быть целочисленным.
Rand ()
Возвращает число с плавающей точкой от нуля до менее одного или, в математическом выражении, диапазона 0,1. Семена поступают из внутренних часов машины или могут быть установлены вручную с помощью функции srand.
круглый( Arg )
Если Arg является целочисленным значением, возвращает Arg , в противном случае преобразует Arg к integer округлением и возвращает преобразованное значение.
грех ( Arg )
Возвращает синус Arg , измеренный в радианах.
зп ( Arg )
Возвращает гиперболический синус Arg , Если результат приведет к переполнению, возвращается ошибка.
SQRT ( Arg )
Возвращает квадратный корень из Arg . Arg должны быть неотрицательными.
srand ( Arg )
Arg , который должен быть целым числом, используется для сброса семени для генератора случайных чисел. Возвращает первое случайное число из этого семени. У каждого переводчика есть свое собственное семя.
загар ( Arg )
Возвращает тангенс Arg , измеренный в радианах.
TANH ( Arg )
Возвращает гиперболический тангенс Arg .
В дополнение к этим предопределенным функциям приложения могут определять дополнительные функции, используяTcl_CreateMathFunc().
Типы, переполнение и точность
Все внутренние вычисления с целыми числами выполняются с помощью типа C долго , и все внутренние вычисления с использованием плавающей запятой выполняются с помощью типа C двойной , При преобразовании строки в точку с плавающей точкой происходит переполнение экспоненты и приводит к ошибке Tcl. Для преобразования в целое число из строки обнаружение переполнения зависит от поведения некоторых подпрограмм в локальной библиотеке C, поэтому его следует считать ненадежным. В любом случае, целые переполнения и переполнения, как правило, не обнаруживаются надежно для промежуточных результатов. Переполнение и переполнение с плавающей запятой обнаруживаются в той степени, в которой поддерживается аппаратное обеспечение, которое, как правило, довольно надежное.
Преобразование между внутренними представлениями для целых чисел, с плавающей запятой и строковых операндов выполняется автоматически по мере необходимости. Для арифметических вычислений целые числа используются до ввода некоторого числа с плавающей запятой, после чего используется с плавающей запятой. Например,
expr 5/4
возвращает 1, тогда как
expr 5 / 4.0 expr 5 / (длина строки "abcd" + 0.0)
оба возвращаются 1.25. Значения с плавающей запятой всегда возвращаются с ``.'' илие так что они не будут выглядеть как целые значения. Например,
expr 20.0 / 5.0
возвращается4.0, а не4.
Строковые операции
Значения String могут использоваться как операнды операторов сравнения, хотя оценщик выражений пытается сделать сравнения как целочисленные или с плавающей точкой, когда это возможно. Если один из операндов сравнения является строкой, а другой имеет числовое значение, числовой операнд преобразуется обратно в строку с использованием C Sprintf спецификатор формата% d для целых чисел и%г для значений с плавающей запятой. Например, команды
expr {"0x03"> "2"} expr {"0y" <"0x12"}
оба возвращаются 1. Первое сравнение выполняется с использованием целочисленного сравнения, а второе выполняется с использованием сравнения строк после того, как второй операнд преобразуется в строку18, Из-за склонности Tcl рассматривать значения как числа, когда это возможно, обычно не рекомендуется использовать такие операторы, как==когда вам действительно нужно сравнение строк, а значения операндов могут быть произвольными; в этих случаях лучше использоватьстрока вместо этого.
Рекомендации по производительности
Прилагайте выражения в фигурных скобках для обеспечения максимальной скорости и наименьших требований к хранению. Это позволяет компилятору tcl bytecode генерировать лучший код.
Как упоминалось выше, выражения заменяются дважды: один раз парсером Tcl и один раз выраж команда. Например, команды
установить 3 множество b {$ a + 2} expr $ b * 4
return 11, а не кратным 4. Это происходит потому, что парсер Tcl сначала заменит$ a + 2 для переменнойб, товыраж команда будет оценивать выражение$ a + 2 * 4.
Большинство выражений не требуют второго раунда замещений. Либо они заключены в фигурные скобки, либо, если нет, их переменные и подстановки команд дают числа или строки, которые сами по себе не требуют подстановок. Однако, поскольку для нескольких необработанных выражений требуются два раунда замещений, компилятор байт-кода должен выдать дополнительные инструкции для обработки этой ситуации. Самый дорогой код необходим для неперехваченных выражений, которые содержат подстановки команд. Эти выражения должны быть реализованы путем генерации нового кода каждый раз, когда выполняется выражение.
Ключевые слова
арифметическое, логическое, сравнение, выражение, нечеткое сравнение
Важный: Использовать человек команда ( % человек ), чтобы увидеть, как команда используется на вашем конкретном компьютере.




