Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSBasicCourse2ndedPodbelsky / CSBasicCourse2ndedPodbelsky.rtf
Скачиваний:
27
Добавлен:
22.03.2016
Размер:
11.9 Mб
Скачать

4.5. Тернарная (условная) операция

В отличие от классических арифметических и логических операций,

унаследованных языками программирования из математики (арифметики и

алгебры), условная операция требует трёх операндов. В выражении с условной

операцией используются два размещённых не подряд символа '?' и ':'. Они разделяют

(или соединяют) три операнда:

операнд_1 ? операнд_2 : операнд_3

Операнд_1 – логическое выражение; операнд_2 и операнд_3 – выражения

одного типа или выражения, которые могут быть неявно (автоматически) приведены

к одному типу.

При выполнении выражения с тернарной операцией

"операции:тернарная

операция" \y "операции"

первым вычисляется значение операнда_1. Если оно

истинно (true), то вычисляется значение операнда_2, которое становится

результатом. Если операнд_1 равен false, то вычисляется значение операнда_3, и

оно

становится результатом всего выражения с тернарной операцией.

Классический пример:

x < 0 ? –x : x.

Если x – переменная арифметического типа, то результат выполнения

операции – абсолютное значение x.

Ранг операции ?: очень низок, но она имеет приоритет перед операциям

и

присваивания. Поэтому с операцией присваивания выражения с тернарной

операцией можно достаточно часто использовать без скобок. Например, можно так

вычислить абсолютное значение разности кодов двух символов, не обращаясь к

таблице кодов:

int почта = 'f'>'z' ? 'f'-'z' : 'z'-'f';

Для наглядности операнды тернарной операции и всё условное выражение

желательно в ряде случаев заключать в скобки. В качестве примера рассмотрим

следующее выражение с переменными арифметического типа:

res = (x<y) ? ((y<z) ? z : y):(x<z) ? z : x;

Переменная res получает наибольшее из значений переменных x, y, z.

Приведённое выражение будет правильно исполняться и при отсутствии

скобок:

res = x<y ? y<z ? z : y : x<z ? z : x;

Однако для наглядности и надёжности скобки лучше применить.

Тип результата тернарной операции определяется типом операндов,

разделённых двоеточием. Например, если нужно выбрать из двух символов тот,

который имеет большее значение кода, то можно записать такое выражение:

char ch ='g'>'e' ? 'g' : 'e'

Приведённые примеры и правила иллюстрирует следующая программа:

// 04_06.cs - выражения с тернарной операцией

using System;

class Program

{

static void Main()

{

char c = 'a', h = 'e', ch;

int norma = c > h ? c - h : h - c;

Console.WriteLine("|c-h| = " + norma);

ch = c > h ? c : h;

Console.WriteLine("ch = "+ch);

double x = 4, y = 7, z = 5, res;

res = (x < y) ? ((y < z) ? z : y) : ((x < z) ? z : x);

Console.WriteLine("res = " + res);

res = x < y ? y < z ? z : y : x < z ? z : x;

Console.WriteLine("res = " + res);

}

}

Результат выполнения программы:

|c-h| = 4

ch = e

res = 7

res = 7

Контрольные вопросы

Что такое автоматическое приведение (преобразование) типов?

К каким типам может быть автоматически приведено значение типа int?

Что такое "расширяющее преобразование" типов?

При каких сочетаниях типов автоматическое приведение типов невозможно?

В каких случаях два операнда разных типов приводятся к типу int?

Назовите особые ситуации, которые могут возникнуть при вычислении

арифметических выражений.

Какие значения может принимать переменная типа bool?

Назовите условные логические бинарные операции языка C#.

Что такое отношение?

Каковы ранги операций отношений?

В выражениях с какими операциями могут использоваться символьные данные?

Каков результат применения операции ++ к переменной типа char?

Какой тип имеет результат суммирования переменной символьного типа с

единицей?

Сколько операндов должно входить в выражение с операцией "?:"?

Какой тип должен иметь первый (левый) операнд операции "?:"?

Каков приоритет (ранг) операции "?:" по отношению к операции присваивания?

Соседние файлы в папке CSBasicCourse2ndedPodbelsky