Шаг 22.
Выполнение операций и их приоритеты

    На этом шаге мы обсудим особенности выполнения операций.

    Для большинства операций порядок их выполнения определяется приоритетами, однако существует несколько исключений из этого правила:

Пример.
   #include <iostream.h>
   main ()
   {
      int x,y,z,r;
      x = y=z=1;
      r = ++x||++y&&++z; 
      
      cout<<"r="<<r<<",x="<<x<<",y="<<y<<",z="<<z<<endl;
                                                /* Операции 1 */
      x = y=z=1;
      r = ++x&&++y||++z; 
      
      cout<<"r="<<r<<",x="<<x<<",y="<<y<<",z="<<z<<endl;
                                                /* Операции 2 */
      x = y=z=1;
      r = ++x&&++y&&++z; 
      
      cout<<"r="<<r<<",x="<<x<<",y="<<y<<",z="<<z<<endl;
                                                /* Операции 3 */
      x = y=z=-1;
      r = ++x&&++y||++z; 
      
      cout<<"r="<<r<<",x="<<x<<",y="<<y<<",z="<<z<<endl;
                                                /* Операции 4 */
      x = y=z=-1;
      r = ++x||++y&&++z; 
      
      cout<<"r="<<r<<",x="<<x<<",y="<<y<<",z="<<z<<endl;
                                                /* Операции 5 */
      x = y=z=-1;
      r = ++x&&++y&&++z; 
      
      cout<<"r="<<r<<",x="<<x<<",y="<<y<<",z="<<z<<endl;
                                                /* Операции 6 */
   }
Текст этой программы можно взять здесь.

Результаты работы программы:

   r=1,x=2,y=1,z=1
   r=1,x=2,y=2,z=1
   r=1,x=2,y=2,z=2
   r=0,x=0,y=-1,z=0
   r=0,x=0,y=0,z=-1
   r=0,x=0,y=-1,z=-1

    Комментарии.


Операции 1.
    x = y=z=1;
    r = ++x||++y&&++z;

Сопоставляем операнды с операциями: r = ((++x)||((++y)&&(++z)));. Вычисляем выражение слева направо: r = (2||((++y)&&(++z)));. Поскольку левый операнд операции || имеет значение "истина", бессмысленно проводить вычисления дальше. В языке C++ гарантируется, что в подобных случаях вычисления прекращаются.


    Операции 2.
    x = y=z=1;
    r = ++x&&++y||++z;
    r = (((++x)&&(++y))||(++z));
Вычисляем выражение слева направо:
   r = ((TRUE&&(++y))||(++z)); x = 2;
   r = ((2&&2)||(++z)); y=2;
   r = (TRUE||(++z));
   r = 1;
Значение z не меняется.


    Операции 3.
   x = y=z=1;
   r = ++x&&++y&&++z;
 
   r = (((++x)&&(++y))&&(++z));
   r = ((2&&2)&&(++z)); x = 2; y = 2;
   r = (TRUE&&(++z));
   r = (TRUE&&TRUE); z = 2;
   r = 1;


    Операции 4.
   x = y=z=-1;
   r = ++x&&++y||++z;
 
   r = (((++x)&&(++y))||(++z);
   r = ((0&&(++y))||(++z)); x = 0;
   r = ((FALSE&&(++y))||(++z));
   r = (FALSE||(++z));

Здесь нет необходимости вычислять ++y, так как левый операнд логической операции && есть "ложь". Но результат логической операции || пока еще неизвестен.

   r = (FALSE||(0)); z = 0;
   r = (FALSE||FALSE);
   r = 0;


    Операции 5.
   x = y=z=-1;
   r = ++x||++y&&++z;
 
   r = ((++x)||((++y)&&(++z)));
   r = (FALSE||((++y)&&(++z))); x = 0;
   r = (FALSE||(FALSE&&(++z))); y = 0;
   r = (FALSE||FALSE);
   r = 0;


    Операции 6.
   x = y=z=-1;
   r = ++x&&++y&&++z;
 
   r = (((++x)&&(++y))&&(++z);
   r = ((FALSE&&(++y))&&(++z)); x = 0;
   r = (FALSE&&(++z));
   r = 0;


    Со следующего шага мы начинаем разбирать основные операторы языка программирования C++.


Предыдущий шаг Содержание Следующий шаг