Абстрактен троичен условен оператор

Троичен условен оператор(обикновено написан като ?: ) е оператор в много езици за програмиране, който връща своя втори или трети операнд в зависимост от стойността на логическия израз, даден от първия операнд. Както подсказва името, троичната операция приема само три посочени операнда.

Всъщност троичната операция в императивните езици за програмиране обикновено е излишна и е синтактична захар. Цялата му функционалност обикновено може да се реализира с прости условни изрази.

1. Определение

Независимо от конкретния език за програмиране, троичната операция може да се дефинира, както следва:

Алгоритъмът на работа е както следва:

  1. Булевият израз се оценява.
  2. Ако логическият израз е верен, тогава се изчислява стойността на израза израз 1, в противен случай се оценява стойността на израза израз 2.
  3. Връща се изчислената стойност.

Обърнете внимание, че се оценява самоединот изразите: израз 1 или израз 2 . Това се прави с цел оптимизация и в известен смисъл отговаря на принципа на мързеливото оценяване.

2. Използване и внедряване

Троичният условен оператор се използва в изрази за получаване на една от двете опции в зависимост от условието.

В този пример на условно програмируем електронен будилник се задава часът, в който трябва да звъни, в зависимост от текущия ден от седмицата. Трябва да се отбележи, че примерът отново е даден за някакъв абстрактен алгоритмичен език за програмиране.

Следващият пример изчислява стойността на най-простата делта функция на Дирак.

Всъщност незабавноприсвояването на резултата от троична условна операция рядко е оправдано от гледна точка на стила на програмиране, тъй като такива изрази са компактно пренаписани като еквивалентна конструкция if-then-else. По-оправдано е тази операция да се използва в по-сложни конструкции без присвояване, например в действителните параметри на извикване на функция:

В този случай еквивалентната конструкция, използваща if-then-else, би изисквала извикването на sprintf да бъде написано четири пъти. Или, алтернативно, би било необходимо да се напише код, подобен по предназначение (но не формално еквивалентен), като се използват две допълнителни временни променливи или няколко последователни извиквания на sprintf.

Стернарната операция има следния синтаксис: [2]

Както знаете, в C няма булев тип данни (в C99 се появи булевият тип _Bool). Следователно операнд o1 трябва да бъде число (цяло или реално) или указател. Първо се изчислява стойността му. Сравнява се с нула и ако не е равно на нула се изчислява и връща o2, при равенство - o3 . Операндите o2 и o3 могат да бъдат от различни, най-общо казано, несъвпадащи типове, включително void.

Следният пример изчислява минимума от a и b:

В C++ троичният условен оператор има същия синтаксис като в C. [3] Въпреки това, поради разликата между инициализация и присвояване, има ситуации, при които операцията ?: не може да бъде заменена от конструкция if-then-else, както в следния случай:

Тройната операция подлежи на допълнителни ограничения, свързани с безопасността на типа. Изрази 1 и 2 трябва да са от един и същи тип. Това води до следното:

Такъв изходен код няма да се компилира въпреки факта, че в крайна сметкастойността на nMax ще бъдеaТъй катоaиbтрябва да са от един и същи тип,aще бъде повишен до двойно, за да съответства наb. Типът на получената стойност на троичната операция е двоен и този тип трябва да бъде низходящ до int при присвояване:

Бележки

  1. BCPL троен оператор (страница 15) - cm.bell-labs.com/cm/cs/who/dmr/bcpl.pdf.Справочно ръководство за BCPL.
  2. Ю. Ю. Громов, С. И. Татаренко .1.3.12. Условна операция // Програмиране на език C - www.codenet.ru/progr/cpp/1/ / Рецензент: професор А. П. Афанасиев.
  3. Б. Страуструп .7.13. Условна операция // C++ Reference Manual - www.codenet.ru/progr/cpp/3/.

Литература

Стефан Ранди Дейвис, Чък СферГлава 4. Оператори // C# 2005 за манекени = C# 2005 за манекени / редактирано от Т. Г. Сковородникова. — М.-СПб.: Уайли, Диалектика, 2006. — С. 83. — ISBN 5-8459-1068-4