IIf
![]() | Тема этой статьи Википедии может не соответствовать общему правилу по известности . ( февраль 2021 г. ) |
В вычислениях IIf . (аббревиатура от «Немедленно , если») [1] ) — это функция в нескольких выпусках Visual Basic языка программирования и языка разметки ColdFusion (CFML), а также в электронных таблицах , которая возвращает второй или третий параметр на основе оценки первого параметра. Это пример условного выражения, похожего на условный оператор .
Синтаксис
[ редактировать ]Синтаксис : функции IIf следующий
IIf(expr, truepart, falsepart)
Все три параметра являются обязательными:
- expr — это выражение, которое необходимо вычислить.
- truepart определяет, что возвращает функция IIf, если вычисление выражения возвращает true.
- falsepart определяет, что возвращает функция IIf, если вычисление выражения возвращает false.
Во многих языках есть оператор , выполняющий ту же задачу, обычно называемый условным оператором (или, точнее, тернарным оператором); наиболее известным является ?: , используемый в C, C++ и родственных языках. Некоторые проблемы с функцией IIf, как обсуждается позже, не существуют с условным оператором, поскольку язык может свободно проверять тип и задерживать вычисление операндов, а не просто передавать их в библиотечную функцию.
Примеры
[ редактировать ]Эти примеры оценивают математические выражения и возвращают одну из двух строк в зависимости от результата.
result = IIf(5 < 10, "Yes it is", "No it isn't") ' Returns "Yes it is"
result = IIf(2 + 2 = 5, "Correct", "Wrong") ' Returns "Wrong"
Критика
[ редактировать ]Эффективность
[ редактировать ]Потому что IIf
является библиотечной функцией, она всегда требует дополнительных затрат на вызов функции, тогда как условный оператор, скорее всего, создаст встроенный код.
Кроме того, тип данных его аргументов Variant
. Если функция вызывается с аргументами других типов (переменными или литералами), потребуются дополнительные затраты на преобразование их в Variant
. Также могут возникнуть дополнительные затраты на проверку типов аргументов и преобразование одного из них, если они имеют разные типы.
Побочные эффекты
[ редактировать ]Еще одна проблема с IIf
возникает потому, что это библиотечная функция: в отличие от условного оператора C, истинная часть , и ложная часть будут оцениваться независимо от того, какая из них фактически возвращается. В следующем фрагменте кода:
value = 10 result = IIf(value = 10, TrueFunction, FalseFunction)
хотя TrueFunction — это функция, которую нужно вызвать, IIf
вызовет как TrueFunction , так и FalseFunction . Сходным образом,
a = 10
b = 0
result = IIf(b <> 0, a / b, 0)
Хотя намерение может состоять в том, чтобы избежать деления на ноль, всякий раз, когда b равно нулю, ошибка действительно произойдет. Это связано с тем, что код во фрагменте выполняется так, как будто
a = 10
b = 0
_temp1 = b <> 0
_temp2 = a / b ' Error if b = 0
_temp3 = 0
If _temp1 Then
result = _temp2
Else
result = _temp3
End If
Эта проблема заставляет IIf()
вызов менее полезен, чем условный оператор. Чтобы решить эту проблему, разработчики Microsoft рассмотрели [2] преобразование IIf
внутренней функции; если бы это произошло, компилятор смог бы выполнить вывод типа и сократить вызов, заменив вызов функции встроенным кодом.
Альтернативы IIf
[ редактировать ]В Visual Basic IIf не является единственным способом оценки и выполнения действий в зависимости от того, является ли выражение истинным или ложным.
В следующем примере используется IIf:
result = IIf(x = y, value1, value2)
Его также можно записать следующим образом, используя стандартные условные выражения :
If x = y Then
result = value1
Else
result = value2
End If
Приведенный выше пример также устранит проблему, связанную с оценкой IIf параметров truepart и falsepart .
В Visual Basic 2008 (VB 9.0) появился настоящий условный оператор , называемый просто «If», который также устраняет эту проблему. Ее синтаксис аналогичен синтаксису функции IIf:
result = If(x = y, value1, value2)
IIf на других языках программирования
[ редактировать ]$iif()
присутствует в сценарии mIRC и имеет аналогичный синтаксис.
alias testiif { %testiif = 0 echo -a $iif(1,$testiif2,$testiif2) %testiif execution(s) unset %testiif } alias testiif2 { inc %testiif | return testing $!iif: }
Вызов /testiif
выведет «тестирование $iif: 1 выполнение(я)». mIRC $iif
действует больше как C ?:
чем IIf()
в VB, поскольку он не будет предварительно оценивать оба.
IIF()
— это функция в dBase и xBase (1992 и старше).
iif()
также является волшебной функцией компилятора Oxygene . Это не настоящая функция, и во время компиляции она разворачивается до условных операторов.
var someString := iif(someInt > 35 , 'Large', 'Small');
В этом примере создается новая строка строгого типа с именем «someString» (с использованием вывода типа ), а iif
функция заполнит его в зависимости от результата логического выражения.
SQL Server 2012 и новее реализует функцию IIF() ( Transact-SQL ):
DECLARE @a int = 45;
DECLARE @b int = 40;
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result;
IIf в C (и его вариантах) и Perl — это условный оператор ? ::
printf("number %d is%s even", num, num % 2 ? " not" : "");
IIf в Python :
parity = "odd" if n % 2 else "even"
parity: either odd? n ['odd]['even]
Ссылки
[ редактировать ]- ^ «Как использовать функцию IIf() (немедленное если)» . 08.06.2004 . Проверено 9 мая 2007 г.
- ^ Пол Вик (29 декабря 2006 г.). «IIF, настоящий тернарный оператор и обратная совместимость» . Проверено 1 февраля 2007 г.