Linux/Unix Команда: expr

название

expr – оценить выражение

конспект

expr arg ? arg arg … ?

Объединяет arg (добавляя разделительные пробелы между ними), оценивает результат как выражение Tcl и возвращает значение. Операторы, разрешенные в выражениях Tcl, являются подмножеством операторов, разрешенных в выражениях C, и имеют то же значение и приоритет, что и соответствующие операторы C. Выражения почти всегда дают числовые результаты (целочисленные значения или значения с плавающей точкой). Например, выражение

  expr 8.2 + 6  

оценивает до 14,2. Выражения Tcl отличаются от выражений C тем, как указываются операнды. Кроме того, выражения Tcl поддерживают нечисловые операнды и сравнения строк.

Операнды

Выражение Tcl состоит из комбинации операндов, операторов и скобок. Пробелы могут использоваться между операндами и операторами и круглыми скобками; это игнорируется инструкциями выражения. Где это возможно, операнды интерпретируются как целочисленные значения. Целочисленные значения могут быть указаны в десятичном (нормальном случае), восьмеричном (если первый символ операнда 0 ) или в шестнадцатеричном (если первые два символа операнда 0x ). Если у операнда нет одного из целочисленных форматов, указанных выше, то он рассматривается как число с плавающей запятой, если это возможно. Числа с плавающей точкой могут быть указаны любым из способов, принятых ANSI-совместимым компилятором C (за исключением того, что f , F , l и суффиксы L не будут разрешены в большинстве установок). Например, все следующие действительные числа с плавающей запятой: 2.1, 3., 6e4, 7.91e + 16. Если числовая интерпретация невозможна, то операнд остается в виде строки (и к нему может быть применен только ограниченный набор операторов).

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

[1]

В качестве числового значения, целое или с плавающей точкой.

[2]

В качестве переменной Tcl используется стандартная запись $ . Значение переменной будет использоваться в качестве операнда.

[3]

В виде строки, заключенной в двойные кавычки. Анализатор выражений будет выполнять обратную косую черту, замену переменных и команд для информации между кавычками и использовать полученное значение в качестве операнда.

[4]

Как строка, заключенная в фигурные скобки. Символы между открытой фигурной скобкой и соответствующей закрывающей фигурной скобкой будут использоваться в качестве операнда без каких-либо замен.

[5]

Как команда Tcl, заключенная в скобки. Команда будет выполнена, а ее результат будет использован в качестве операнда.

[6]

В качестве математической функции, аргументы которой имеют любую из приведенных выше форм для операндов, например sin ($ x) . Ниже приведен список определенных функций.

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

Для некоторых примеров простых выражений предположим, что переменная a имеет значение 3, а переменная b имеет значение 6. Затем команда в левой части каждой из строк ниже будет выведено значение в правой части строки:

  expr 3.1 + $ a6.1  
expr 2 + "$ a. $ b" 5.6
expr 4 * [ llength "6 2"] 8
expr {{word one} <"word $ a"} 0

операторы

Действительные операторы перечислены ниже, сгруппированные в порядке убывания приоритета:

– + ~

Унарный минус, унарный плюс, побитовое НЕ, логическое НЕ. Ни один из этих операндов не может быть применен к строковым операндам, а побитовое НЕ может быть применено только к целым числам.

* /%

Умножить, разделить, остаток. Ни один из этих операндов не может быть применен к строковым операндам, а остаток может быть применен только к целым числам. Остаток всегда будет иметь тот же знак, что и делитель, и абсолютное значение меньше, чем делитель.

+ –

Сложить и вычесть. Действительно для любых числовых операндов.

<>

Сдвиг влево и вправо. Действительно только для целочисленных операндов. Сдвиг вправо всегда распространяет знаковый бит.

=

Булево меньше, больше, меньше или равно и больше или равно. Каждый оператор выдает 1, если условие истинно, и 0 в противном случае.Эти операторы могут применяться к строкам, а также к числовым операндам, в этом случае используется сравнение строк.

==! =

Булевы равны и не равны. Каждый оператор выдает ноль/один результат. Действительно для всех типов операндов.

&

Битовое И. Действительно только для целочисленных операндов.

^

Побитовый эксклюзивный ИЛИ. Действительно только для целочисленных операндов.

|

Побитовое ИЛИ. Действительно только для целочисленных операндов.

&&

Логическое И. Создает результат 1, если оба операнда отличны от нуля, в противном случае – 0. Действительно только для логических и числовых (целые или с плавающей точкой) операндов.

||

Логическое ИЛИ. Создает результат 0, если оба операнда равны нулю, в противном случае – 1. Действительно только для логических и числовых (целые или с плавающей точкой) операндов.

<Ет> х у : г

If-then-else, как в C. Если x оценивается как ненулевое, то результатом является значение y . В противном случае результатом является значение z . Операнд x должен иметь числовое значение.

Смотрите руководство C для более подробной информации о результатах, полученных каждым оператором. Все бинарные операторы группируются слева направо в пределах одного и того же уровня приоритета. Например, команда

  expr 4 * 2 <7  

возвращает 0

Операторы && , || и ?: имеют “ ленивую оценку ”, как и в C, что означает, что операнды не являются оценивается, если они не нужны для определения результата. Например, в команде

  expr {$ v? [a]: [b]}  

только один из [a] или [b] будет фактически оценен, в зависимости от значения $ v . Однако обратите внимание, что это верно только в том случае, если все выражение заключено в фигурные скобки; в противном случае анализатор Tcl оценит как [a] , так и [b] перед вызовом команды expr .

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

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

  abs   coshlogsqrt  
acos doublelog10srand
asin exppowtan
atan floorrandtanh
atan2 fmodround < br /> ceil гипоцин
потому инцинх

абс ( аг )

Возвращает абсолютное значение arg . Arg может быть целочисленным или с плавающей точкой, и результат возвращается в той же форме.

экоса ( аг )

Возвращает арккосинус arg в диапазоне [0, pi] радиан. Arg должен находиться в диапазоне [-1,1].

ASIN ( аг )

Возвращает арксинус arg в диапазоне [-pi/2, pi/2] радиан. Arg должен находиться в диапазоне [-1,1].

Атан ( аг )

Возвращает арктангенс arg в диапазоне [-pi/2, pi/2] радиан.

atan2 ( x, y )

Возвращает арктангенс y / x в диапазоне [-pi, pi] радиан. x и y не могут быть равны 0.

CEIL ( аг )

Возвращает наименьшее целочисленное значение не менее arg .

соз ( аг )

Возвращает косинус arg , измеренный в радианах.

сп ( аг )

Возвращает гиперболический косинус arg . Если результат вызовет переполнение, возвращается ошибка.

двойной ( аг )

Если arg является плавающим значением, возвращает arg , иначе преобразует arg в плавающее и возвращает преобразованное значение.

ехр ( аг )

Возвращает экспоненту arg , определенную как e ** arg . Если результат вызовет переполнение, возвращается ошибка.

этаж ( аг )

Возвращает наибольшее целочисленное значение, не превышающее arg .

fmod ( x, y )

Возвращает остаток с плавающей точкой от деления x на y . Если y равно 0, возвращается ошибка.

гипотет ( x, y )

Вычисляет длину гипотенузы прямоугольного треугольника ( x * x + y * y ).

Int ( аг )

Если arg является целочисленным значением, возвращает arg , в противном случае преобразует arg в целое число путем усечения и возвращает преобразованное значение.

Журнал ( аг )

Возвращает натуральный логарифм arg . Arg должно быть положительным значением.

log10 ( аг )

Возвращает десятичный логарифм аргумента . Arg должно быть положительным значением.

pow ( x, y )

Вычисляет значение x , возведенное в степень y . Если x отрицательно, y должно быть целочисленным значением.

Rand ()

Возвращает число с плавающей запятой от нуля до чуть меньше единицы или, в математическом выражении, диапазон [0,1). Посевной материал поступает с внутренних часов машины или может быть установлен вручную с помощью функции srand.

круглый ( аг )

Если arg является целочисленным значением, возвращает arg , в противном случае преобразует arg в целое число путем округления и возвращает преобразованное значение.

грех ( аг )

Возвращает синус arg , измеренный в радианах.

зп ( аг )

Возвращает гиперболический синус arg . Если результат вызовет переполнение, возвращается ошибка.

SQRT ( аг )

Возвращает квадратный корень из arg . Arg должен быть неотрицательным.

srand ( аг )

arg , который должен быть целым числом, используется для сброса начального числа для генератора случайных чисел. Возвращает первое случайное число из этого семени. У каждого переводчика есть свое семя.

загар ( аг )

Возвращает тангенс arg , измеренный в радианах.

TANH ( аг )

Возвращает гиперболический тангенс arg .

В дополнение к этим предопределенным функциям приложения могут определять дополнительные функции, используя Tcl_CreateMathFunc ().

Типы, переполнение и точность

Все внутренние вычисления с использованием целых чисел выполняются с помощью типа C long , а все внутренние вычисления с использованием чисел с плавающей запятой выполняются с использованием типа C double . При преобразовании строки в число с плавающей точкой обнаруживается переполнение экспоненты, что приводит к ошибке Tcl. Для преобразования в целое число из строки обнаружение переполнения зависит от поведения некоторых подпрограмм в локальной библиотеке C, поэтому его следует рассматривать как ненадежное. В любом случае целочисленное переполнение и недостаток обычно не обнаруживаются надежно для промежуточных результатов. Переполнение и переполнение с плавающей точкой обнаруживаются в степени, поддерживаемой аппаратным обеспечением, что, как правило, довольно надежно.

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

  expr 5/4  

возвращает 1, а

  expr 5/4.0  
expr 5/([длина строки "abcd"] + 0.0)

оба возвращают 1.25. Значения с плавающей точкой всегда возвращаются с “ . ” или e , чтобы они не выглядели как целочисленные значения. Например,

  expr 20.0/5.0  

возвращает 4,0 , а не 4 .

Строковые операции

Строковые значения могут использоваться в качестве операндов операторов сравнения, хотя оценщик выражений пытается выполнять сравнения как целые числа или числа с плавающей запятой, когда это возможно. Если один из операндов сравнения является строкой, а другой имеет числовое значение, числовой операнд преобразуется обратно в строку с помощью спецификатора формата C sprintf % d . для целых чисел и % g для значений с плавающей точкой. Например, команды

  expr {"0x03"> "2"}  
expr {"0y" <"0x12"}

оба возвращают 1. Первое сравнение выполняется с использованием целочисленного сравнения, а второе – с использованием сравнения строк после преобразования второго операнда в строку 18 . Из-за склонности Tcl обрабатывать значения как числа везде, где это возможно, обычно не рекомендуется использовать такие операторы, как == , когда вам действительно нужно сравнение строк, а значения операндов могут быть произвольными; В этих случаях лучше использовать команду string .

Вопросы производительности

Заключите выражения в фигурные скобки для лучшей скорости и минимальных требований к хранению. Это позволяет компилятору байт-кода Tcl генерировать лучший код.

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

  установить a 3  
установить b {$ a + 2}
expr $ b * 4

верните 11, не кратное 4. Это потому, что анализатор Tcl сначала заменит $ a + 2 на переменную b , а затем expr Команда оценит выражение $ a + 2 * 4 .

Большинство выражений не требуют второго раунда подстановок. Либо они заключены в фигурные скобки, либо, если нет, их подстановки переменных и команд приводят к числам или строкам, которые сами по себе не требуют подстановок. Однако, поскольку нескольким выражениям без скобок требуется два раунда подстановок, компилятор байт-кода должен выдать дополнительные инструкции для обработки этой ситуации. Самый дорогой код требуется для выражений без скобок, которые содержат подстановки команд. Эти выражения должны быть реализованы путем генерации нового кода каждый раз, когда выполняется выражение.

Ключевые слова

арифметика, логическое, сравнение, выражение, нечеткое сравнение

Используйте команду man (% man ), чтобы увидеть, как команда используется на вашем конкретном компьютере.

Оцените статью
Solutics.ru
Добавить комментарий