Тернарная условная операция Реферат на тему:

advertisement
Реферат на тему:
Тернарная условная операция
План:
Введение


1 Определение
2 Использование и реализации
o 2.1 Си
o 2.2 C++
o 2.3 Python
o 2.4 PHP
o 2.5 C#
Примечания
Литература
Введение
Терна́рная усло́вная опера́ция (обычно записывается как ?:) — во многих языках
программирования операция, возвращающая свой второй или третий операнд в
зависимости от значения логического выражения, заданного первым операндом. Как
можно судить из названия, тернарная операция принимает всего три указанных операнда.
Обычно тернарная условная операция ассоциируется с операцией ?:, используемой в сиподобных языках программирования. На самом деле, подобные операции с другим
синтаксисом имеются и во многих далёких по синтаксису от Си языках
программирования. К наиболее популярным языкам, содержащим тернарную условную
операцию, можно отнести Си, C++, JavaScript, Objective-C, C#, D, Java, ECMAScript, Perl,
PHP, Python,Tcl, Ruby, Verilog и другие. Своим появлением непосредственно в тернарной
инфиксной форме эта операция обязана языку Алгол-60, в котором она имела синтаксис
if o1 then o2 else o3 и затем языку BCPL (o1 -> o2, o3)[1] вместо привычного теперь
o1 ? o2 : o3. Прототипом же этой операции, в свою очередь, является условная функция
cond языка Лисп, записываемая по правилам Лиспа в префиксной форме и имеющая
произвольное количество аргументов.
В действительности тернарная операция в императивных языках программирования, как
правило, избыточна и представляет собой синтаксический сахар. Всю её
функциональность обычно можно реализовать за счёт простых условных операторов.
1. Определение
Безотносительно определённого языка программирования, тернарную операцию можно
определить так:
логическое выражение ? выражение 1 : выражение 2
Алгоритм работы операции следующий:
1. Вычисляется логическое выражение.
2. Если логическое выражение истинно, то вычисляется значение выражения
выражение 1, в противном случае — значение выражения выражение 2.
3. Вычисленное значение возвращается.
Нужно обратить внимание, что вычисляется только одно из выражений: выражение 1 или
выражение 2. Это сделано для оптимизации и, в некотором смысле, соответствует
принципу ленивых вычислений.
2. Использование и реализации
Тернарная условная операция используется в выражениях для получения одного из двух
вариантов в зависимости от условия.
alarm_time = today in [SUNDAY, MONDAY] ? 12.00 : 8.00
В этом примере условному программируемому электронному будильнику проставляется
время, в которое он должен звонить, в зависимости от текущего дня недели. Нужно
заметить, что пример снова приведён для некоторого абстрактного алгоритмического
языка программирования.
В следующем примере вычисляется значение простейшей дельта-функции Дирака.
y = x == 0 ? 1 : 0
В действительности, немедленное присваивание результата тернарной условной операции
редко оправдано с точки зрения стиля программирования, так как подобные операторы
компактно переписываются в виде эквивалентной конструкции if-then-else. Более
оправдано использование данной операции в более сложных конструкциях, не связанных
с присваиванием, например в фактических параметрах вызова функции:
sprintf(Title, "%s %s",
tv_system == TV_PAL ? "PAL" : "SECAM",
tv_input == 0 ? "TEST" : Tv_Name[tv_input-1]);
В данном случае эквивалентная конструкция с использованием if-then-else потребовала бы
записи вызова функции sprintf четыре раза. Либо, в качестве альтернативы, потребовалось
бы написать аналогичный по назначению (но формально не эквивалентный) код с
использованием двух дополнительных временных переменных, либо нескольких
последовательных вызовов sprintf.
2.1. Си
В Си тернарная операция имеет следующий синтаксис:[2]
o1 ? o2 : o3
Как известно, в Си нет логического типа данных(в C99 появился логический тип _Bool).
Поэтому операнд o1 должен быть числом (целым или вещественным) или указателем.
Сначала вычисляется именно его значение. Оно сравнивается с нулём и, если оно не равно
нулю, вычисляется и возващается o2, в случае равенства — o3. Операнды o2 и o3 могут
быть различных, вообще говоря, несовпадающих типов, включая void.
В следующем примере вычисляется минимальное из чисел a и b:
min = (a < b) ? a : b;
2.2. C++
В C++ тернарная условная операция имеет тот же синтаксис, что и в Си.[3] Однако за счёт
наличия разницы между инициализацией и присваиванием, бывают ситуации, когда
операцию ?: нельзя заменить конструкцией if-then-else, как, например, в следующем
случае:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(int argc, char** argv)
{
string name;
ofstream fout;
if (argc > 1 && argv[1])
{
name = argv[1];
fout.open(name.c_str(), ios::out | ios::app);
}
ostream& sout = name.empty() ? cout : fout;
return 0;
}
Здесь переменная sout инициализируется в момент объявления результатом работы
тернарной операции. Подобного эффекта не удалось бы достичь простым присваиванием
в том или ином случае.
2.3. Python
b = 3
a = 1 if b==1 else \
2 if b==2 else \
3
assert a==3
2.4. PHP
$a = 1==0 ? "first value" :
(2==0 ? "second value" :
(3==3 ? "result value" : "default value"));
2.5. C#
На тернарную операцию накладываются дополнительные ограничения, связанные с
типобезопасностью. Выражения 1 и 2 должны быть одного типа. Это приводит к
следующему:
int a = 1;
double b = 0.0;
int nMax = (a>b) ? a : b;
Такой исходный код не будет компилироваться несмотря на то, что в конечном итоге
значение nMax будет равно а Поскольку a и b должны быть одного и того же типа, a
повысится до double, чтобы соответствовать b. Тип результирующего значения тернарной
операции оказывается double, и этот тип должен быть понижен до int при присваивании:
int a = 1;
double b = 0.0;
int nMax;
// Можно поступить так:
nMax = (int) ((a>b) ? a : b) ;
// ...или так
nMax = (a>b) ? a : (int)b;
Примечания
1. BCPL Ternary operator (page 15) - cm.bell-labs.com/cm/cs/who/dmr/bcpl.pdf. BCPL
Reference Manual.
2. Ю. Ю. Громов, С. И. Татаренко. 1.3.12. Условная операция // Программирование
на языке си - www.codenet.ru/progr/cpp/1/ / Рецензент: профессор А. П. Афанасьев.
3. Б. Страуструп. 7.13. Условная операция // Справочное руководство по C++ www.codenet.ru/progr/cpp/3/.
Литература
Стефан Рэнди Дэвис, Чак Сфер Глава 4. Операторы // C# 2005 для "чайников" = C# 2005
for dummies / под редакцией Т. Г. Сковородниковой. — М.-Спб.: Wiley, Диалектика, 2006.
— С. 83. — ISBN 5-8459-1068-4
Download