Jump to content

IIf

В вычислениях 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"

IIf (либо) в Red и Rebol :

parity: either odd? n ['odd]['even]
  1. ^ «Как использовать функцию IIf() (немедленное если)» . 08.06.2004 . Проверено 9 мая 2007 г.
  2. ^ Пол Вик (29 декабря 2006 г.). «IIF, настоящий тернарный оператор и обратная совместимость» . Проверено 1 февраля 2007 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 745c0a5291b875825a84989a1c42a85d__1722148560
URL1:https://arc.ask3.ru/arc/aa/74/5d/745c0a5291b875825a84989a1c42a85d.html
Заголовок, (Title) документа по адресу, URL1:
IIf - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)