162 lines
10 KiB
HTML
162 lines
10 KiB
HTML
<html><head>
|
||
<object type="application/x-oleobject" classid="clsid:1e2a7bd0-dab9-11d0-b93a-00c04fc99f9e">
|
||
<param name="Keyword" value="and">
|
||
<param name="Keyword" value="or">
|
||
<param name="Keyword" value="not">
|
||
<param name="Keyword" value="div">
|
||
<param name="Keyword" value="mod">
|
||
<param name="Keyword" value="shl">
|
||
<param name="Keyword" value="shr">
|
||
<param name="Keyword" value="xor">
|
||
<param name="Keyword" value="in">
|
||
<param name="Keyword" value="Операция ..">
|
||
</object>
|
||
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
|
||
<title></title>
|
||
<link rel="StyleSheet" href="../../default.css"></head>
|
||
<body><H1>Выражения и операции</H1>
|
||
<p><strong>// устарело и отсутствует в справке</strong></p>
|
||
Любое выражение имеет определенный тип и после вычисления возвращает некоторое значение. Простейшими выражениями являются переменные и константы. Более сложные выражения строятся из более простых с использованием операций, скобок, вызовов функций, индексов и приведений типов. Данные, к которым применяются операции, называются <i>операндами</i>. <p>В <b>Pascal ABC</b> имеются следующие операции: <code>@</code>, </span></span></span></span><b><code>not</code></b>, <code>^</code>, <code>*</code>, <code>/</code>, <b><code>div</code></b>, <code><b>mod</b></code>, <code><b>and</b></code>, <code><b>shl</b></code>, <code><b>shr</b></code>, <code>+</code>, <code>-</code>, <code><b>or</b></code>, <code><b>xor</b></code>,
|
||
<code><b>..</b></code>,
|
||
<code><b>in</b></code>, <code>=></code>, <code>=</code>, <code>></code>, <code><</code>, <code><></code>, <code><=</code> и <code>>=</code>.</p>
|
||
<h2>Арифметические операции</h2><p>К <i>арифметическим</i> относятся бинарные операции
|
||
<code>+</code> <code>-</code> <code>*</code> <code>/</code> для вещественных и целых чисел, бинарные операции
|
||
<b><code>div</code></b> и <b><code>mod</code></b> для целых чисел и унарные операции
|
||
<code>+</code> и <code>-</code> для вещественных и целых чисел. Выражение,
|
||
имеющее числовой тип, называется <i>арифметическим</i>. Тип арифметического выражения определяется по следующему правилу: если все операнды целые и в выражении отсутствует операция деления
|
||
<code>/</code>, то выражение имеет тип <code>integer</code>, в противном случае выражение имеет тип <code>real</code>. Например, если <code>b</code> имеет тип <code>byte</code>,
|
||
<code>c</code> имеет тип <code>1..9</code>, то
|
||
<code>b+c</code> и <code>-b</code> имеют тип <code>integer</code>, а <code>2.0+b</code> и <code>1/2</code> - тип <code>real</code>.</p><h2>Логические операции</h2><p>К
|
||
<i>логическим</i> относятся бинарные операции <b><code>and</code></b>, <b><code>or</code></b> и <b><code>xor</code></b>, а также унарная
|
||
операция <b><code>not</code></b>,
|
||
имеющие операнды
|
||
типа <code>boolean</code> и возвращающие значение типа
|
||
<code>boolean</code>. Выражение, имеющее тип
|
||
<code>boolean</code>, называется <i>лог</i><i>ическим</i>. </p><h2>Операции отношения</h2><p>Операции <i>отношения</i>
|
||
<code><</code>, <code>></code>, <code><=</code>, <code>>=</code>, <code>=</code>, <code><></code> возвращают значение типа <code>boolean</code> и применяются к операндам
|
||
целого, вещественного, символьного, логического и строкового типов, а также к
|
||
типизированным указателям. Операции <code>=</code> и <code><></code> также применяются к операндам типа <code>pointer</code>, к операндам,
|
||
являющихся объектами классов и к константе <b> <code>nil</code></b>. При сравнении
|
||
символа и строки символ преобразуется в строку длины 1.</p><h2>Побитовые операции</h2><p>
|
||
<i>Побитовые</i> операции <code><b>and</b></code>, <code><b>or</b></code>, <b><code>not</code></b>,
|
||
<b><code>xor</code></b>, <code><b>shl</b></code>, <code><b>shr</b></code>
|
||
производят побитовые манипуляции с операндами целого типа. Для унарной операции
|
||
<b><code>not</code></b> результат имеет тот же тип, что и операнд. Для остальных операций результат имеет
|
||
тип <code>integer</code>.
|
||
Например, если <code>b</code> имеет тип
|
||
<code>byte</code> и <code>
|
||
b=1</code>, то <code>b <b>shl</b> 10=1024</code>, а <code><b>not</b> b=254</code>.</p>
|
||
<h2>Строковые операции</h2><p>Помимо операций отношения <code><</code>, <code>></code>, <code><=</code>, <code>>=</code>, <code>=</code>, <code><></code>, к строковым и символьным операндам применима операция
|
||
конкатенации (слияния) <code>+</code>. Ее результат имеет строковый тип.
|
||
Например, <code>'a'+'b'='ab'</code>. </p>
|
||
<h2>Операция @</h2><p>Операция <code>@</code>
|
||
применяется к переменной и возвращает ее адрес.</p><h2>Операции с указателями</h2><p>
|
||
К типизированным указателям применима операция <i>разыменования</i> <code>^</code>:
|
||
если <code>p</code> является указателем на тип <code>T</code>,
|
||
то <code>p^</code> - элемент типа <code>T</code>, на
|
||
который указывает <code>p</code>.</p>
|
||
<h2>Операции с множествами</h2><p>К множествам применимы
|
||
операции <code>+</code> (объединение), <code>-</code>
|
||
(разность) и <code>*</code> (пересечение):</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> s1,s2,s: <b>set</b> <b>of</b> byte;<br>
|
||
s1 := [1..4];<br>
|
||
s2 := [2..5];<br>
|
||
s := s1 + s2; // s = [1..5]<br>
|
||
s := s1 - s2; // s = [1]<br>
|
||
s := s1 * s2; // s = [2..4] </code></p>
|
||
</blockquote>
|
||
<p>К множествам применимы также операции отношения = (равенство), <code><></code>
|
||
(неравенство), <= (вложено) и
|
||
>= (содержит):</p>
|
||
<blockquote>
|
||
<p><code><b>var</b> s1,s2,s: <b>set</b> <b>of</b> byte;<br>
|
||
s1 := [1..4];<br>
|
||
s2 := [2..5];<br>
|
||
s := [1,2]; <br>
|
||
<strong>var </strong>b := s1=s2; // b = False<br>
|
||
b := s2 <> s; // b = True<br>
|
||
b := s <= s2; // b = False<br>
|
||
b := s1 >= s; // b = True</code></p>
|
||
</blockquote>
|
||
<p>Наконец, операция <code><b>in</b></code>
|
||
определяет, принадлежит ли элемент множеству:</p>
|
||
<blockquote>
|
||
<p><code>1 <b>in</b> [2..5] // False<br>
|
||
3 <b>in</b> [2..5] // True</code></p>
|
||
</blockquote>
|
||
<h2>Операция ..</h2><p>Операция .. формирует диапазон значений и является
|
||
синоним функции Range:</p>
|
||
<blockquote>
|
||
<p><code><strong>foreach var</strong> x <strong>in</strong> 2..5 <strong>do</strong>
|
||
// <strong>foreach var</strong> x <strong>in</strong> Range(2,5) <strong>do</strong><br>
|
||
Print(x);<br>(2..5).Select(x -> x*x).Println;<br>
|
||
<strong>var</strong> a := Arr(2..5);<br><strong>var</strong> h :=
|
||
HSet('2'..'5');</code></p>
|
||
</blockquote>
|
||
<p>В качестве границ диапазона могут выступать целые или символьные значения.</p>
|
||
<p>Выражение </p>
|
||
<blockquote>
|
||
<p><code>x <strong>in</strong> 2..5</code></p>
|
||
</blockquote>
|
||
<p>предельно эффективно, поскольку преобразуется на этапе компиляции в </p>
|
||
<blockquote>
|
||
<p><code>(x >= 2) <strong>and</strong> (x <= 5)</code></p>
|
||
</blockquote>
|
||
<h2>Приоритет операций</h2>
|
||
<p>Приоритет определяет порядок выполнения операций в выражении.
|
||
Первыми выполняются операции, имеющие высший приоритет. Операции, имеющие
|
||
одинаковый приоритет, выполняются слева направо.</p>
|
||
<p><b>Таблица приоритетов операций</b></p>
|
||
<table border="0" width="544" id="table1">
|
||
<tr>
|
||
<td><code>@</code>,
|
||
<b><code>not</code></b>,
|
||
<code>^</code>, <code>+</code>, <code>-</code> (унарные), <code>new</code>
|
||
</td>
|
||
<td style="width: 173px">1 (наивысший)</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>**</code></td>
|
||
<td style="width: 173px">2</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>*</code>,
|
||
<code>/</code>,
|
||
<code><b>div</b></code>,
|
||
<code><b>mod</b></code>,
|
||
<code><b>and</b></code>,
|
||
<code><b>shl</b></code>,
|
||
<code><b>shr</b></code>,
|
||
<code><b>as</b></code>,
|
||
<code><b>is</b></code></td>
|
||
<td style="width: 173px">3</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>+</code>,
|
||
<code>-</code> (бинарные),
|
||
<code><b>or</b></code>,
|
||
<code><b>xor</b></code> </td>
|
||
<td style="width: 173px">4</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>..</code></td>
|
||
<td style="width: 173px">5</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>=</code>,
|
||
<code><></code>,
|
||
<code><</code>,
|
||
<code>></code>,
|
||
<code><=</code>,
|
||
<code>>=</code>,
|
||
<code><b>in</b></code></td>
|
||
<td style="width: 173px">6</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>?: </code> </td>
|
||
<td style="width: 173px">7 (низший)</td>
|
||
</tr>
|
||
</table>
|
||
|
||
</body></html> |