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>
 | 
