﻿<h1 class=p1>Операторы</h1>
<p><b>Арифметические операторы</b></p>
<table border="1" cellspacing="0" cellpadding="5" bgcolor="#F1F1F1" bordercolordark="white">
    <tr>
        <td>+</td>
        <td>Сложение</td>
    </tr>
    <tr>
        <td>-</td>
        <td>Вычитание</td>
    </tr>
    <tr>
        <td>*</td>
        <td>Умножение</td>
    </tr>
    <tr>
        <td>/</td>
        <td>Деление</td>
    </tr>
    <tr>
        <td>%</td>
        <td>Вычисление остатка по модулю (к примеру: 5 % 2=1)</td>
    </tr>
</table>

<p><b>Поразрядные операторы</b></p>
<p class=text>Эта группа операторов работает с битовыми представлениями значений целочисленных операндов. В основном эти операторы применяются для создания набора булевых флагов. В наших упражнениях мы будем использовать эти операторы очень редко, однако на всякий случай ниже приведен пример с использованием этих операторов.
</p>
<table border="1" cellspacing="0" cellpadding="5" bgcolor="#F1F1F1" bordercolordark="white">
    <tr>
        <td align="center"><b>&</b></td>
        <td>Поразрядная конъюнкция (AND)</td>
    </tr>
    <tr>
        <td align="center"><b>|</b></td>
        <td>Поразрядная дизъюнкция (OR)</td>
    </tr>
    <tr>
        <td align="center"><b>^</b></td>
        <td>Поразрядное исключающее ИЛИ (XOR)</td>
    </tr>
    <tr>
        <td align="center"><b>~</b></td>
        <td>Поразрядное отрицание (NOT)</td>
    </tr>
    <tr>
        <td><b><<</b></td>
        <td>Сдвиг влево битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда</td>
    </tr>
    <tr>
        <td><b>>></b></td>
        <td>Сдвиг вправо битового представления значения левого целочисленного операнда на количество разрядов, равное значению правого целочисленного операнда </td>
    </tr>   
</table>

<p><b>Пример:</b></p>
<blockquote>
<pre>
<em class=red>&lt;?</em>
   <em class=gr>echo</em>(4<<2); // <em class=comnt>равно 16</em> 
   <em class=gr>echo</em>"&lt;br&gt;"; 
   <em class=gr>echo</em>(5>>1); // <em class=comnt>равно 2</em>
   <em class=gr>echo</em>"&lt;br&gt;"; 
   <em class=gr>echo</em>(6&5); // <em class=comnt>равно 4</em>
   <em class=gr>echo</em>"&lt;br&gt;"; 
   <em class=gr>echo</em>(6|5); // <em class=comnt>равно 7</em>
   <em class=gr>echo</em>"&lt;br&gt;"; 
   <em class=gr>echo</em>(6^5); // <em class=comnt>равно 3</em>
<em class=red>&gt;?</em>
</pre>
</blockquote>

<p class=text>Разберем первый пример. Двоичный код для 4 равен 100, при сдвиге влево на 2 разряда код 100 становится равным 10000, что соответствует десятичному значению 16. Остальные примеры могут быть разобраны аналогично. Обратим внимание на то, что сдвиг влево на n позиций эквивалентен умножению на <b>2n</b>, а сдвиг вправо уменьшает соответствующее значение в <b>2n</b> раз с отбрасыванием дробной части результата (поэтому 5>>1 равно 2). Основное назначение этих операторов – быстрые вычисления. Так как их поддержка осуществляется на аппаратном уровне (процессор), алгоритмы, выполненные с использованием данных операторов получаются очень производительными.
</p>
<p><b>Логические операторы</b></p>
<table border="1" cellspacing="0" cellpadding="5" bgcolor="#F1F1F1" bordercolordark="white">
    <tr>
        <td align="center"><b>or</b> или <b>||</b></td>
        <td>ИЛИ</td>
    </tr>
    <tr>
        <td align="center"><b>Xor</b></td>
        <td>исключающее ИЛИ</td>
    </tr>
    <tr>
        <td align="center"><b>and</b> или <b>&&</b></td>
        <td>И</td>
    </tr>
    <tr>
        <td align="center"><b>!</b></td>
        <td>НЕ</td>
    </tr>
</table>

<p class=text>Операторы этой группы, в отличие от поразрядных, работают с логическими переменными (<b>boolean</b>) и интенсивно используются в управляющих конструкциях: циклы и условия. Логические переменные, или более правильно, переменные типа <b>Boolean</b> имеют лишь два значения: <b>true(истина)</b> и <b>false(ложь)</b>. В выражениях <b>true</b> и <b>false</b> можно заменить на 1(любое отличное от 0 число) и 0, соответственно. Возможность замены <b>true</b> и <b>false</b> на 1 и 0 – это «наследство» языка С, в котором не было специальных переменных <b>true</b> и <b>false</b>.
</p>
<p class=text>Логически операторы для переменных типа <b>Boolean</b> выполняют роль операторов сложения, вычитания для обычных переменных. Рассмотрим несколько примеров, если их смысл Вам не очень понятен – не расстраивайтесь, просто вернитесь сюда, прочитав <a class=bluelink href="gl2_1.php.htm" tppabs="http://site/bookphp/gl2_1.php">главу&nbsp;2</a>. Оператор <em class=gr>if</em>(<b>cond</b>) проверяет условие <b>cond</b>, если его значение <b>true</b> – выполняется код в фигурных скобках, следующий за <em class=gr>if</em>, если <b>false</b> – код после оператора <em class=gr>else</em>. Если <b>cond</b> равен <b>false</b> – всё наоборот.
</p>
<blockquote>
<pre>
<em class=red>&lt;php</em>
   <b>$flag</b> = true; // <em class=comnt>Истина</em>
   <em class=gr>if</em>(<b>$flag</b>)
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Переменная flag имеет значение true&lt;/p&gt;&quot;;
   <em class=gr>} else {</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Переменная flag имеет значение false&lt;/p&gt;&quot;;
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>

<p class=text>Результаты работы скрипта выглядят следующим образом:</p>
<blockquote><em class=comnt>Переменная flag имеет значение true</em></blockquote>
<p class=text>Если теперь заменить строчку</p>
<blockquote>
<pre>
    <b>$flag</b> = <b>true</b>; // <em class=comnt>Истина</em>
    на
    <b>$flag</b> = <b>false</b>; // <em class=comnt>Ложь</em>
</pre>
</blockquote>
<p class=text>Результат, выдаваемый тэгом измениться:
<blockquote><em class=comnt>Переменная flag имеет значение false</em></blockquote>
<p class=text>Т.е. мы зашли в блок <em class=gr>else</em>, так как в операторе <em class=gr>if</em> условие <b>ложно</b>.</p>
<p class=text>Когда условие одно, как видите, всё просто. Когда условий больше - в дело вступают логические операторы:</p>

<blockquote>
<pre>
<em class=red>&lt;php</em>
   <b>$flag1</b> = <b>true</b>; // Истина
   <b>$flag2</b> = <b>true</b>; // Истина
   <em class=gr>if</em>(<b>$flag1</b> && <b>$flag2</b>) // <em class=comnt>И $flag1 И $flag2 истины</em>
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие: true (Оба флага истины)&lt;/p&gt;&quot;;
        // <em class=comnt>Да</em>
   <em class=gr>} else {</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие: false (Один из флагов ложен)&lt;/p&gt;&quot;; 
        // <em class=comnt>Нет, один или оба ложны</em>
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>

<p class=text>Этот скрипт выведет: <em class=comnt>Условие: true (Оба флага истины)</em>. Если хотя бы один из операторов окажется равным <b>false</b> (или оба сразу) – будет выведено: <em class=comnt>Условие: false (Один из флагов ложен)</em>. </p>
<p class=text>Обязательно попробуйте поиграть с условиями: <b>если вы не будете разбираться в условных операторах – Вы никогда не будете хорошим программистом ни на одном языке программирования. Если Вы считаете, что Вам не нужны условные операторы – Вам не нужен язык программирования</b>.</p>

<p class=text>Заменим <b>&&</b> (И) на <b>||</b> (ИЛИ)</p>
<blockquote>
<pre>
<em class=red>&lt;php</em>
   <b>$flag1</b> = true; // Истина
   <b>$flag2</b> = false; // Истина
   <em class=gr>if</em>(<b>$flag1</b> || <b>$flag2</b>) 
      //<em class=comnt> Хоть кто-то из двух флагов($flag1 $flag2) истинен</em>
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие: true (Один из флагов истин)&lt;/p&gt;&quot;; 
      //<em class=comnt> Да</em>
   <em class=gr>} else {</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие: false (Оба флага ложны)&lt;/p&gt;&quot;; 
      // <em class=comnt>Нет оба имеют значение false</em>
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>
<p class=text>Опять получаем: Условие: <b>true</b>.</p>
<p class=text>Для <b>И</b> и <b>ИЛИ</b>, как видим, возможны два варианта операторов, причем эти операторы с  разными приоритетами. Приоритетность выполнения логических операторов: <b>or</b>&nbsp;>&nbsp;<b>xor</b>&nbsp;>&nbsp;<b>and</b>&nbsp;<b>></b>&nbsp;<b>||</b>&nbsp;<b>></b>&nbsp;<b>&&</b>&nbsp;>&nbsp;! Иногда в условиях удобно использовать скобки для явного задания приоретета:</p>

<blockquote>
<pre>
<em class=red>&lt;php</em>
   <b>$flag1</b> = <b>true</b>;
   <b>$flag2</b> = <b>true</b>;
   <b>$flag3</b> = <b>false</b>;
   <em class=gr>if</em>( <b>$flag1</b> && <b>$flag2</b> || <b>$flag3</b>)
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие истинно&lt;p&gt;&quot;;
   <em class=gr>}</em>
   <em class=gr>else</em>
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие ложно&lt;p&gt;&quot;;
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>
<p class=text>Результатом будет вывод фразы «<b>Условие истинно</b>», так как согласно приоритету исполнения сначала выполняется оператор <b>&&</b>, так как оба флага равны <b>true</b> – возвращается <b>true</b>, затем это выражение сравнивается с  <nobr><b>$flag3</b> (<b>true</b> || <b>$flag3</b>)</nobr> – что возращает тоже <b>true</b>, так как одно из сравниваемых равно <b>true</b>.</p>
<p class=text>Если же мы запишем</p>

<blockquote>
<pre>
<em class=red>&lt;php</em>
   <b>$flag1</b> = <b>true</b>;
   <b>$flag2</b> = <b>true</b>;
   <b>$flag3</b> = <b>false</b>;
   <em class=gr>if</em>(<b>$flag1</b> && (<b>$flag2</b> || <b>$flag3</b>))
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие истинно&lt;p&gt;&quot;;
   <em class=gr>}</em>
   <em class=gr>else</em>
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Условие ложно&lt;p&gt;&quot;;
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>
<p class=text>результатом будет «<b>Условие ложно</b>».</p>
<p class=text>Вообще программисты не любят запоминать порядок приоритетов, поэтому для того чтобы Ваш код легко читался (в том числе и Вами) лучше всегда использовать скобки. Т.е. в первом скрипте лучше записать <nobr><em class=gr>if</em>((<b>$flag1</b> && <b>$flag2</b>) || <b>$flag3</b>)</nobr> – тогда сразу становиться понятно, что имеется ввиду.</p>
<p class=text>Иногда нужно проверить условие безальтернативно, например, на ложность или истинность. Допустим, функция (<b>func()</b>) возвращает истину или ложь и в зависимости от этого нужно вывести на страничку те или иные теги. Например, функция <b>mysql_query($query)</b> – возвращает <b>true</b> если запрос к базе данных <b>mySQL</b>, размещённый в строке <b>$query</b> успешно выполнился и <b>false</b> – в противном случае.</p>
<p class=text>Если Вам нужно среагировать только на удачное обращение, Вы можете записать:</p>

<blockquote>
<pre>
<em class=red>&lt;php</em>
   <em class=gr>if</em>(mysql_query(<b>$query</b>))
   <em class=gr>{</em>
      <em class=gr>echo</em> &quot;&lt;p&gt;Данные успешно занесены в базу данных.&lt;p&gt;&quot;;
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>
<p class=text>Если Вам нужно среагировать только на не удачные обращения, Вы, конечно, можете записать:</p>

<blockquote>
<pre>
<em class=red>&lt;php</em>
   <em class=gr>if</em>(mysql_query(<b>$query</b>))
   <em class=gr>{}</em>
   <em class=gr>else</em>
   <em class=gr>{</em>
      <em class=gr>echo</em>&quot;&lt;p&gt;Данные не были занесены в базу данных.&lt;p&gt;&quot;;
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>
<p class=text>Но это не элегантный, запутывающий способ – здесь самое время воспользоваться оператором отрицания: <b>!</b>, применение которого к переменной меняет её значение с <b>true</b> на <b>false</b>, а <b>false</b> на <b>true:</b></p>
<blockquote>
<pre>
<em class=red>&lt;php</em>
   <em class=gr>if</em>(!mysql_query(<b>$query</b>))
   <em class=gr>{</em>
      <em class=gr>echo</em>&quot;&lt;p&gt;Данные не были занесены в базу данных.&lt;p&gt;&quot;;
   <em class=gr>}</em>
<em class=red>?&gt;</em>
</pre>
</blockquote>