Все о Linux / Unix Команда: expr

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

конспект

выраж arg? arg arg …?

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

expr 8,2 + 6

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

Операнды

Выражение Tcl состоит из комбинации операндов, операторов и скобок. Пробелы могут использоваться между операндами и операторами и круглыми скобками; это игнорируется инструкциями выражения. Где это возможно, операнды интерпретируются как целочисленные значения. Целочисленные значения могут быть указаны в десятичном (нормальном случае), восьмеричном (если первый символ операнда ) или в шестнадцатеричном формате (если первые два символа операнда 0x). Если у операнда нет одного из целочисленных форматов, указанных выше, то он рассматривается как число с плавающей запятой, если это возможно. Числа с плавающей запятой могут быть указаны любым из способов, принятых ANSI-совместимым компилятором C (за исключением того, что еFL, а также 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 * [длина "6 2"] 8
expr {{слово одно} < "word $a"}0

операторы

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

—  +  ~!

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

* /%

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

+  —

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

<>

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

  знак равно

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

==! =

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

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

^

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

|

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

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

||

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

Икс?Y:Z

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

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

expr 4 * 2 < 7

возвращает 0

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

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

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

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

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

абс coshlogsqrt
экоса doublelog10srand
как в exppowtan
загар floorrandtanh
atan2 fmodround
перекрывать hypotsin
соз intsinh

 

абс (Arg)

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

экоса (Arg)

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

как в(Arg)

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

загар(Arg)

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

atan2 (х, у)

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

CEIL (Arg)

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

соз (Arg)

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

сЬ (Arg)

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

двойной (Arg)

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

ехр (Arg)

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

пол(Arg)

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

FMOD (х, у)

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

hypot (х, у)

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

INT (Arg)

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

журнал(Arg)

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

log10 (Arg)

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

пау (х, у)

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

Rand ()

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

круглый(Arg)

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

грех (Arg)

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

зп (Arg)

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

SQRT (Arg)

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

srand (Arg)

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

загар (Arg)

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

TANH (Arg)

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

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

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

Все внутренние вычисления с использованием целых чисел выполняются с типом C long, а все внутренние вычисления с использованием чисел с плавающей запятой выполняются с типом C double. При преобразовании строки в число с плавающей точкой обнаруживается переполнение экспоненты, что приводит к ошибке 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.

 

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

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

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

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

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

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

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

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

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

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

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

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

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

Ссылка на основную публикацию