398 lines
14 KiB
HTML
398 lines
14 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||
<html>
|
||
<head>
|
||
<title>expr</title>
|
||
</head>
|
||
|
||
<body>
|
||
<h1>expr</h1>
|
||
|
||
<p>Команда <strong>expr</strong> вычисляет значение выражения.</p>
|
||
|
||
<pre>
|
||
<strong>expr</strong> <em>arg</em> ?<em>arg</em> <em>arg</em>...?
|
||
</pre>
|
||
|
||
<h2><a name="ОПИСАНИЕ"></a>ОПИСАНИЕ</h2>
|
||
|
||
<p> Команда соединяет аргументы <em>arg</em> через пробел в одно
|
||
Tcl-выражение, вычисляет и возвращает его значение. Допустимые
|
||
в Tcl-выражениях операторы математических действий составляют
|
||
подмножество операторов языка С, и имеют такое же значение и
|
||
порядок выполнения, что и соответствующие операторы С. Почти
|
||
всегда результатом вычисления является число: целое или с
|
||
плавающей запятой. Например, результат выражения</p>
|
||
<pre>
|
||
expr 8.2 + 6
|
||
</pre>
|
||
<p>равен <strong>14.2</strong>.</p>
|
||
|
||
<p>Выражения в Tcl отличаются от выражений в С способом описания
|
||
операндов. Кроме того, Tcl-выражения поддерживают нечисловые
|
||
операнды и сравнение строк.</p>
|
||
|
||
<h2><a name="ОПЕРАНДЫ"></a>ОПЕРАНДЫ</h2>
|
||
|
||
<p> Выражение Tcl состоит из комбинации операндов, операторов и
|
||
скобок. Между ними всеми можно ставить пробелы, потому что при
|
||
вычислении значения пробелы игнорируются. По возможности, все
|
||
операнды интерпретируются как целые числа, если не задано
|
||
иное. Целые числа могут быть десятичными числами (обычно),
|
||
восьмеричными (если первая цифра числа есть 0) или
|
||
шестнадцатеричными (если первые два символа числа - 0х). Если
|
||
операнд не подпадает ни под один из названных форматов, он
|
||
считается числом с плавающей запятой, если это возможно. Числа
|
||
с плавающей запятой можно задавать любым из способов,
|
||
воспринимаемым совместимым с ANSI компилятором С. Исключение
|
||
составляет запрет в большинстве версий на суффиксы <strong>f</strong>,
|
||
<strong>F</strong>, <strong>l</strong> и <strong>L</strong>. Примеры правильных чисел с
|
||
плавающей запятой: 2.1, 3., 6e4, 7.91e+16. Если числовая
|
||
интерпретация невозможна, то операнд считается строковым, и
|
||
работать с ним может только ограниченный набор операторов.</p>
|
||
|
||
<p>Операнды могут быть заданы одним из следующих способов:</p>
|
||
|
||
<ul>
|
||
<li>числовым значением - целым или с плавающей
|
||
запятой;</li>
|
||
|
||
<li>переменной Tcl, используя обычную нотацию со знаком
|
||
<strong>$</strong>. В качестве операнда будет использовано значение
|
||
переменной;</li>
|
||
|
||
<li>строкой символов, заключенной в двойные кавычки. Анализатор
|
||
выражения выполнит подстановки переменных, подстановки команд
|
||
и подстановки с обратным слэшем; полученное значение будет
|
||
использовано в качестве операнда;</li>
|
||
|
||
<li>строкой, заключенной в фигурные скобки. Все символы между
|
||
открывающей и закрывающей скобками будут считаться операндом
|
||
без каких-либо подстановок;</li>
|
||
|
||
<li>командой Tcl, заключенной в угловые скобки. Команда будет
|
||
выполнена, и ее результат будет использован в качестве
|
||
операнда;</li>
|
||
|
||
<li>как вызов математической функции, аргумент которой может
|
||
иметь любую из перечисленных выше форм, например
|
||
<strong>sin($x)</strong>. Список допустимых математических функций
|
||
приведен ниже.</li>
|
||
</ul>
|
||
|
||
<p> Если в выражении имели место подстановки (например, внутри
|
||
двойных кавычек), то они будут обработаны процессором выражения,
|
||
хотя анализатор команд тоже может выполнить свою часть
|
||
подстановок (дополнительную серию подстановок) до вызова
|
||
процессора выражения. Поэтому обычно, чтобы избежать выполнения
|
||
анализатором команд подстановок в содержимое выражения, лучше
|
||
всего заключать выражение в фигурные скобки.</p>
|
||
|
||
<p>В качестве примеров рассмотрим простые выражения, в которых
|
||
переменная a имеет значение "3", а значение переменной
|
||
<strong>b</strong> есть "6". Тогда выражение в левой части
|
||
каждой строки даст значение в ее правой части:</p>
|
||
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<td><strong>3.1 + $a</strong></td>
|
||
<td><strong>6.1</strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>2 + ($a.$b)</strong></td>
|
||
<td><strong>5.6</strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>4*[llength "6 2"]</strong></td>
|
||
<td><strong>8</strong></td>
|
||
</tr>
|
||
<tr>
|
||
<td><strong>{word one} < "word $a"</strong></td>
|
||
<td><strong>0</strong></td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<h2><a name="ОПЕРАТОРЫ"></a>ОПЕРАТОРЫ</h2>
|
||
|
||
<p> Действующие операторы перечислены ниже в порядке убывания
|
||
приоритетности исполнения.
|
||
</p>
|
||
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<td>- + ~ !</td>
|
||
|
||
<td>Унарный минус, унарный плюс, побитовое неравенство NOT,
|
||
логическое NOT. Ни один из этих операторов не может быть
|
||
использован со строковыми операндами, а побитовое NOT
|
||
может использоваться только с целыми числами.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>* / %</td>
|
||
|
||
<td>Умножить, разделить, остаток деления. Ни один из этих
|
||
операторов не может быть использован со строковыми
|
||
операндами, а оператор остатка может использоваться только
|
||
для целых чисел.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>+ -</td>
|
||
|
||
<td>Сложение и вычитание. Могут использоваться для любых
|
||
числовых операндов.</td>
|
||
</tr>
|
||
<tr>
|
||
<td><< >></td>
|
||
|
||
<td>Сдвиг влево и вправо. Операторы можно использовать
|
||
только с целыми числами. Сдвиг вправо также сдвигает и
|
||
знаковый бит.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>< > <= >=</td>
|
||
|
||
<td>Операторы булевой алгебры: меньше, больше, не больше, не
|
||
меньше. Каждый оператор дает результат 1, если неравенство
|
||
верно, и 0 - в обратном случае. Кроме числовых операндов,
|
||
операторы можно применять для строковых выражений, в этом
|
||
случае выполняется сравнение строк.</td>
|
||
</tr>
|
||
<tr>
|
||
<td>== !=</td>
|
||
|
||
<td>Булевские операторы: равно и не равно. Результат
|
||
операции - число 0 или 1. Операторы можно применять с
|
||
любыми аргументами.</td>
|
||
</tr>
|
||
<tr>
|
||
<td> & </td>
|
||
|
||
<td>Оператор побитового AND. Используется только с целыми
|
||
операндами.</td>
|
||
</tr>
|
||
<tr>
|
||
<td> ^ </td>
|
||
|
||
<td>Оператор побитового исключающего OR. Применяется только
|
||
с целыми числами.</td>
|
||
</tr>
|
||
<tr>
|
||
<td> | </td>
|
||
|
||
<td>Оператор побитового OR. Применяется только с целыми
|
||
числами.</td>
|
||
</tr>
|
||
<tr>
|
||
<td> && </td>
|
||
|
||
<td>Оператор логического AND. Результат равен 1, если оба
|
||
операнда равны 1, и 0 - в обратном случае. Операндами
|
||
могут быть любые числа, как целые, так и с плавающей
|
||
запятой.</td>
|
||
</tr>
|
||
<tr>
|
||
<td> || </td>
|
||
|
||
<td>Оператор логического OR. Результат равен 0, если оба
|
||
операнда равны 0, и 1 - в обратном случае. Операндами
|
||
могут быть любые числа, как целые, так и с плавающей
|
||
запятой.</td>
|
||
</tr>
|
||
<tr>
|
||
<td> x<strong>?</strong>y<strong>:</strong>z </td>
|
||
|
||
<td>Конструкция if-then-else, подобная аналогичной
|
||
конструкции в языке C. Операнд <em>х</em> должен иметь
|
||
числовое значение. Если значение <em>х</em> не равно нулю,
|
||
то результат команды будет <em>у</em>. В обратном случае
|
||
результат будет <em>z</em>.</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p> Более подробные описания операторов можно найти в любом
|
||
руководстве по языку С.</p>
|
||
|
||
<p>Операторы одного уровня приоритета исполнения выполняются по
|
||
очереди, слева направо. Например, команда</p>
|
||
<pre>
|
||
expr 4*2 < 7
|
||
</pre>
|
||
<p>возвращает результат <strong>0</strong>.</p>
|
||
|
||
<p>Подобно языку C, операторы <strong>&&</strong>, <strong>||</strong>, и
|
||
<strong>?:</strong> имеют свойство "ленивого вычисления", т.е.,
|
||
если операнд не нужен для получения результата, то он не
|
||
вычисляется. Например, в команде</p>
|
||
<pre>
|
||
expr {$v? [a] : [b]}
|
||
</pre>
|
||
<p>будет вычислено только одно из выражений <strong>[a]</strong> и
|
||
<strong>[b],</strong> в зависимости от значения <strong>$v</strong>. Однако, это
|
||
справедливо только тогда, когда все выражение заключено в
|
||
фигурные скобки. В противном случае анализатор Tcl сначала
|
||
вычислит <strong>[a]</strong> и <strong>[b]</strong>, и только потом вызовет команду
|
||
<strong>expr</strong>.</p>
|
||
|
||
<h2><a name="МАТЕМАТИЧЕСКИЕ ФУНКЦИИ"></a>МАТЕМАТИЧЕСКИЕ ФУНКЦИИ</h2>
|
||
|
||
<p> Tcl поддерживает в выражениях следующие математические
|
||
функции: </p>
|
||
|
||
<table>
|
||
<tbody>
|
||
<tr>
|
||
<td> acos </td>
|
||
<td> cos </td>
|
||
<td> hypot</td>
|
||
<td> sinh </td>
|
||
</tr>
|
||
<tr>
|
||
<td> asin </td>
|
||
<td> cosh </td>
|
||
<td> log </td>
|
||
<td> sqrt </td>
|
||
</tr>
|
||
<tr>
|
||
<td> atan </td>
|
||
<td> exp </td>
|
||
<td> log10</td>
|
||
<td> tan </td>
|
||
</tr>
|
||
<tr>
|
||
<td> atan2</td>
|
||
<td> floor</td>
|
||
<td> pow </td>
|
||
<td> tanh </td>
|
||
</tr>
|
||
<tr>
|
||
<td> ceil </td>
|
||
<td> fmod </td>
|
||
<td> sin </td>
|
||
<td> </td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
|
||
<p> Каждая из этих функций вызывает одноименную функцию из
|
||
математической библиотеки.</p>
|
||
|
||
<p>Кроме них можно использовать также перечисленные ниже функции
|
||
преобразования чисел и генерации случайных чисел.</p>
|
||
<dl>
|
||
<dt><strong>abs(</strong><em>arg</em><strong>)</strong></dt>
|
||
|
||
<dd>Возвращает абсолютное значение аргумента. Аргумент может
|
||
быть целым или числом с плавающей точкой. Результат
|
||
возвращается в такой же форме.</dd>
|
||
|
||
<dt><strong>double(</strong><em>arg</em><strong>)</strong></dt>
|
||
|
||
<dd>Переводит аргумент в десятичное число в плавающей
|
||
точкой.</dd>
|
||
|
||
<dt><strong>int(</strong><em>arg</em><strong>)</strong></dt>
|
||
|
||
<dd>Переводит аргумент в целое число, обрезая дробную
|
||
часть.</dd>
|
||
|
||
<dt><strong>rand()</strong></dt>
|
||
|
||
<dd> Возвращает случайное десятичное число в интервале
|
||
[0,1]. Исходное значение, используемое при генерации,
|
||
берется от внутренних часов или задается с помощью функции
|
||
srand.</dd>
|
||
|
||
<dt><strong>round(</strong><em>arg</em><strong>)</strong></dt>
|
||
|
||
<dd>Округляет число до целого.</dd>
|
||
|
||
<dt><strong>srand(</strong><em>arg</em><strong>)</strong></dt>
|
||
|
||
<dd>Аргумент, который должен быть целым числом, используется для
|
||
генерации последовательности случайных чисел. Возвращает
|
||
первое случайное число из последовательности. Каждый
|
||
интерпретатор может использовать собственное значение и
|
||
порождать собственную последовательность случайных чисел.</dd>
|
||
</dl>
|
||
|
||
<p>Пользовательские приложения могут определять дополнительные
|
||
функции, используя процедуру Tcl_CreateMathFunc().</p>
|
||
|
||
<h2><a name="ТИПЫ ДАННЫХ, ТОЧНОСТЬ ВЫЧИСЛЕНИЙ И
|
||
ПЕРЕПОЛНЕНИЯ"></a>ТИПЫ ДАННЫХ, ТОЧНОСТЬ ВЫЧИСЛЕНИЙ И
|
||
ПЕРЕПОЛНЕНИЯ</h2>
|
||
|
||
<p> Все внутренние вычисления с целыми числами выполняются с
|
||
C-типом <em>long</em>, все внутренние вычисления с числами с
|
||
плавающей запятой выполняются с C-типом <em>double</em>.
|
||
|
||
<p>В общем случае, обнаружение переполнения и исчезновения
|
||
значения при операциях с целыми числами зависит от поведения
|
||
функций конкретной библиотеки С, и потому для промежуточных
|
||
результатов не может считаться надежным. Переполнение и
|
||
исчезновение значения при операциях с числами с плавающей
|
||
запятой обнаруживаются на аппаратном уровне, что обычно надежно
|
||
обеспечивается.</p>
|
||
|
||
<p>При необходимости выполняются преобразования внутренних
|
||
представлений операндов между целыми, строковыми и с плавающей
|
||
запятой. При арифметических вычислениях используются целые числа
|
||
до тех пор, пока не будет подставлено или указано число с
|
||
плавающей запятой. После этого тип данных будет с плавающей
|
||
запятой.</p>
|
||
|
||
<p>Числа с плавающей запятой возвращаются либо с точкой, либо с
|
||
буквой e, так что они заведомо не похожи на целые значения.
|
||
Например:</p>
|
||
<pre>
|
||
expr 5 / 4
|
||
</pre>
|
||
<p>вернет <strong>1</strong>, тогда как </p>
|
||
<pre>
|
||
expr 5 / 4.0
|
||
expr 5 / ( [string length "abcd"] + 0.0 )
|
||
</pre>
|
||
<p>оба вернут <strong>1.25</strong>.</p>
|
||
|
||
<p>Выражение</p>
|
||
<pre>
|
||
expr 20.0/5.0
|
||
</pre>
|
||
<p>вернет <strong>4.0</strong>, а не <strong>4</strong>.</p>
|
||
|
||
<h2><a name="ОПЕРАЦИИ СО СТРОКАМИ"></a>ОПЕРАЦИИ СО СТРОКАМИ</h2>
|
||
|
||
<p> Операторы сравнения могут работать со строковыми аргументами,
|
||
хотя при вычислении выражений аргументы по возможности
|
||
интерпретируются как целые или числа с плавающей запятой. Если
|
||
один из операндов строковый, а другой - число, то числовой
|
||
операнд будет конвертирован в строковый. Например, обе команды</p>
|
||
<pre>
|
||
expr {"0x03" > "2"}
|
||
expr {"0y" < "0x12"}
|
||
</pre>
|
||
<p>вернут <strong>1</strong>. При этом первое сравнение будет выполнено как
|
||
сравнение чисел, а второе будет выполнено как сравнение строк,
|
||
после того как второй операнд будет преобразован в строку
|
||
<strong>18</strong>. </p>
|
||
|
||
<p>Если необходимо сравнить аргументы именно как строки, а
|
||
операнды могут быть восприняты неоднозначно, то рекомендуется
|
||
использовать команду <strong>string compare</strong> вместо операторов
|
||
вида <strong>==</strong>.</p>
|
||
|
||
<h2>ПРОИЗВОДИТЕЛЬНОСТЬ ПРИЛОЖЕНИЙ</h2>
|
||
|
||
<p> Байтовый компилятор Tcl генерирует наиболее быстрый и
|
||
компактный код, если выражения заключать в скобки. Это связано с
|
||
тем, что в общем случае, в выражениях подстановки выполняются
|
||
дважды: один раз - грамматическим анализатором Tcl, и второй раз
|
||
- командой <strong>expr</strong>. Наиболее трудным является случай, когда
|
||
выражение без фигурных скобок содержит подстановки команд.
|
||
</p>
|
||
</body>
|
||
</html>
|