Программирование на C и C++

Онлайн справочник программиста на C и C++

Оператор ?

Оператор ? может использоваться для замены стандартной конструкции if/else:

if (условие) выражение;

else выражение;


Ограничением в данном случае является использование единственного выражения как после if, так и после else.

Оператор ? называется триадным оператором, поскольку ему требуется три операнда и он имеет следующий вид:

выражение1 ? выражение2 : выражение3

где выражение1, выражение2 и выражение3 - это выражения.

Оператор ? работает следующим образом. Вычисляется выражение1. Если оно истинно, вычисляется выражение2 и вся конструкция получает вычисленное выражение. Если выражение1 ложно, вычисляется выражение3 и вся конструкция получает вычисленное выражение. Например:

х = 10;

у = х > 9 ? 100 : 200;

В данном примере у получает значение 100. Если бы х было меньше, чем 9, то у получило бы значение 200. Ниже приведен фрагмент программы, выполняющий такие же действия, но с использованием операторов if/else:

х = 10;

if (х > 9) у = 100;

else у = 200;

Использование оператора ? для замены if/else не ограничивается присваиванием. Надо помнить, что все функции (кроме объявленных как void) могут возвращать значение. Следовательно, допустимо использование одного или нескольких вызовов функции в выражениях. Когда встречается имя функции, функция соответственно выполняется для определения возвращаемого значения. Поэтому возможно выполнить одну или несколько функций, используя оператор ?, поместив их в выражения, образующие операнды. Например:

#include <stdio.h>

int f1 (int n) , f2(void);

int main(void)
{
int t;
printf(": ");
scanf("%d", &t);

/* print proper message */

t ? f1(t)+f2 () : printf ("Zero Entered");
return 0;
}

int f1 (int n)
{
printf("%d ",n);
return 0;
}

int f2(void)
{
printf("entered");
return 0;
}

В данном примере, если ввести 0, вызовется функция printf() и появится сообщение «Zero Entered». Если ввести любое другое число, то выполняются функции f1() и f2(). Следует заметить, что в данном примере значение, возвращаемое оператором ?, отбрасывается. Даже если ни f1(), ни f2() не возвращают информативного значения, они не могут быть определены как возвращающие тип void, поскольку это не позволит применять их в выражении. Поэтому функции просто возвращают 0.

Используя оператор ?, возможно переписать нашу программу следующим образом:

#include <stdio.h>

/* программа "угадай число 5" */

int main(void)
{
int magic = 123; /* искомое число */
int guess;
printf("Enter your guess: ");
scanf("%d", &guess);
if(guess == magic)
{
printf("** Right ** ");
printf("%d is the magic number", magic);
}

else
guess > magic ? printf("High") : printf("Low") ;
return 0;
}

Здесь оператор ? приводит к выводу сообщения, основываясь на сравнении guess > magic.