Шаг 16.
Условная операция

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

    В языке C++ существует оригинальная операция, обозначаемая:

       Условие ? Выражение_1 : Выражение_2.
и называемая условной операцией.

    Эта операция содержит три операнда. Сначала вычисляется значение выражения Условие. Если значение отлично от нуля (истинно), то вычисляется значение выражения Выражение_1, которое и становится значением условной операции. В противном случае вычисляется значение выражения Выражение_2 становится значением условного выражения.

    Каждый раз вычисляется одно из выражений Выражение_1 или Выражение_2.

    Примеры.

  1. Выражение (5>3) ? 1 : 2 возвращает значение 1.
  2. Выражение (3>5) ? 1 : 2 возвращает значение 2.
  3. Выражение (a>b) ? a : b возвращает большую из величин a и b.

    Условную операцию удобно использовать в тех случаях, когда имеется некоторая переменная, которой можно присвоить одно из двух возможных значений. Например: x = (y<0) ? -y : y;. Значением переменной x становится абсолютная величина значения y.

    Пример 1.

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

В результате получаем:

   3  2  3  3  4  4  3  0  1

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


Операции 1.
   x=3; y=2; z=1;
   r = x<y?y:x;
 
   r = (x<y)?(y):(x);
   (r = (x<y)?(y):(x));

    Вначале вычисляется условие. Затем выполняется или часть операции, соответствующая истинному значению условия, или часть, соответствующая ложному значению условия, но не обе вместе. (r = (FALSE?(y):(x));. В этой задаче значение условия - "ложь", поэтому значением всего выражения будет значение выражения, соответствующего ложному значению условия.

   (r = (x));
   3


    Операции 2.
   x=3; y=2; z=1;
   r = x<y?x++:y++;
 
   (r = (x<y)?(x++):(y++));
   (r = (FALSE)?(x++):(y++));
   (r = (y++));

    Так как операция x++ не выполнялась, то значение x остается равным 3.


    Операции 3.
   x=3; y=3; z=1;
   z += x<y?x++:y++; 
 
   (z += (x<y)?(x++):(y++));
   (z += (FALSE)?(x++):(y++)));
   (z += ((y++));
   (z += (3));
   (z = 4);
   4


    Операции 4.
   x=3; y=4; z=4;
   r = (z>=y>=x)?1:0;
 
   (r = (((z>=y)>=x)?(1):(0)));
   (r = (TRUE>=x)?(1):(0));

    Значение самого внутреннего условия "истина". Оно сравнивается со значением целого x. Хотя это и законно в языке C++ и со значением "истина" обходятся вольно, считая его целым числом, в данном случае это 1. Однако часто, как и в этой задаче, это не приносит желаемых результатов.

   (r = (1>=x)?(1):(0));
   (r = (FALSE?(1):(0)));
   (r = ((0));
   0


    Операции 5. Следующий фрагмент показывает правильный способ для сравнения трех величин.
   x=3; y=4; z=4;
   r = z>=y&&y>=x; 0
   (r = (z>=y)&&(y>=x));
Вычисляем выражение слева направо:
   (r = TRUE&&(y>=x));
   (r = (TRUE&&TRUE));
   (r = TRUE);
   (r = 1);
   1


    Замечание. Вообще говоря, использование условной операции не является обязательным, поскольку тех же результатов можно достичь при помощи оператора if...else. Однако условная операция более компактна, и ее применение обычно приводит к получению более компактного машинного кода.


    На следующем шаге мы уточним такие понятия как "указатели" и "адреса".


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