projman/hlp/ru/tcl/expr.html
2015-10-19 14:27:31 +04:00

398 lines
14 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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 имеет значение &quot;3&quot;, а значение переменной
<strong>b</strong> есть &quot;6&quot;. Тогда выражение в левой части
каждой строки даст значение в ее правой части:</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 &quot;6 2&quot;]</strong></td>
<td><strong>8</strong></td>
</tr>
<tr>
<td><strong>{word one} &lt; &quot;word $a&quot;</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>&lt;&lt; &gt;&gt;</td>
<td>Сдвиг влево и вправо. Операторы можно использовать
только с целыми числами. Сдвиг вправо также сдвигает и
знаковый бит.</td>
</tr>
<tr>
<td>&lt; &gt; &lt;= &gt;=</td>
<td>Операторы булевой алгебры: меньше, больше, не больше, не
меньше. Каждый оператор дает результат 1, если неравенство
верно, и 0 - в обратном случае. Кроме числовых операндов,
операторы можно применять для строковых выражений, в этом
случае выполняется сравнение строк.</td>
</tr>
<tr>
<td>== !=</td>
<td>Булевские операторы: равно и не равно. Результат
операции - число 0 или 1. Операторы можно применять с
любыми аргументами.</td>
</tr>
<tr>
<td> &amp; </td>
<td>Оператор побитового AND. Используется только с целыми
операндами.</td>
</tr>
<tr>
<td> ^ </td>
<td>Оператор побитового исключающего OR. Применяется только
с целыми числами.</td>
</tr>
<tr>
<td> | </td>
<td>Оператор побитового OR. Применяется только с целыми
числами.</td>
</tr>
<tr>
<td> &amp;&amp; </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 &lt; 7
</pre>
<p>возвращает результат <strong>0</strong>.</p>
<p>Подобно языку C, операторы <strong>&amp;&amp;</strong>, <strong>||</strong>, и
<strong>?:</strong> имеют свойство &quot;ленивого вычисления&quot;, т.е.,
если операнд не нужен для получения результата, то он не
вычисляется. Например, в команде</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 &quot;abcd&quot;] + 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 {&quot;0x03&quot; &gt; &quot;2&quot;}
expr {&quot;0y&quot; &lt; &quot;0x12&quot;}
</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>