Em computação, IIf (abreviação de Immediate if[1]) é uma função presente em diversas edições da linguagem de programação Visual Basic e da linguagem de marcação ColdFusion (CFML), bem como em planilhas eletrônicas, que retorna o segundo ou terceiro parâmetro com base na avaliação do primeiro parâmetro. É um exemplo de expressão condicional, que é similar a uma instrução condicional.
A sintaxe da função IIf é a seguinte:
IIf(expr, truepart, falsepart)
São necessários os três parâmetros:
IIf retorna se a avaliação do expr retorna verdade.IIf retorna se a avaliação de expr retorna falsepart.Muitas linguagens possuem um operador para atingir o mesmo propósito, geralmente chamado de operador condicional (ou, menos precisamente, operador ternário); o mais conhecido é ?:, usado em C, C++ e linguagens relacionadas. Alguns dos problemas com a função IIf, como discutido posteriormente, não existem com um operador condicional, porque a linguagem tem a liberdade de examinar o tipo e adiar a avaliação dos operandos, em vez de simplesmente passá-los para uma função de biblioteca.
Estes exemplos avaliam expressões matemáticas e retornam uma de duas strings, dependendo do resultado.
result = IIf(5 < 10, "Yes it is", "No it isn't") ' Returns "Yes it is"
result = IIf (2 + 2 = 5, "Correct", "Error") ' Returns "Error"
Como IIf é uma função de biblioteca, ela sempre exigirá a sobrecarga de uma chamada de função, enquanto um operador condicional provavelmente produzirá código embutido.
Além disso, o tipo de dados de seus argumentos é Variant. Se a função for chamada com argumentos de outros tipos (variáveis ou literais), haverá uma sobrecarga adicional para convertê-los para Variant. Também pode haver sobrecarga adicional para verificar os tipos dos argumentos e converter um deles caso não sejam do mesmo tipo.
Outro problema com o IIf surge porque é uma função de biblioteca: ao contrário do operador condicional derivado de C, tanto a parte verdadeira quanto a parte falsa serão avaliadas, independentemente de qual delas for retornada. No trecho de código a seguir:
value = 10 result = IIf(value = 10, ''TrueFunction'', ''FalseFunction'')
Embora TrueFunction seja a função que se pretende chamar, IIf chamará tanto TrueFunction quanto FalseFunction. Da mesma forma,
Embora a intenção possa ser evitar uma divisão por zero, sempre que b for zero, o erro de fato ocorrerá. Isso acontece porque o código no trecho é executado como se fosse por
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
Este problema torna a chamada IIf () menos útil do que o operador condicional. Para resolver este problema, os desenvolvedores da Microsoft consideraram converter IIf em uma função intrínseca; se isso tivesse acontecido, o compilador teria sido capaz de realizar Inferência de tipo de curtocircuito substituindo a chamada de função com código inline.
Em Visual Basic, IIf não é a única maneira de avaliar e executar ações com base em se uma expressão é verdadeira ou falsa.
O exemplo a seguir utiliza o IIf:
Também poderia ser escrito da seguinte forma, usando condicionais padrão:
O exemplo acima também eliminaria o problema de IIf avaliar seus parâmetros truepart e falsepart simultaneamente.
O Visual Basic 2008 (VB 9.0) introduziu um operador condicional verdadeiro, chamado simplesmente de "If", que também elimina esse problema. Sua sintaxe é semelhante à da função IIf:
result = If(x = y, value1, value2)
A função $iif() está presente no script mIRC, com sintaxe semelhante.
Chamar /testiif imprimirá "testando $iif: 1 execução(ões)". O $iif do mIRC se comporta mais como o ?: do C do que o IIf() do VB, já que não pré-avalia ambos.
IIF() é uma função presente no dBase e no xBase (versões de 1992 e anteriores).
A função `iif()` também é uma função mágica do compilador Oxygene. Ela não é uma função real e, em tempo de compilação, é desdobrada em instruções condicionais.
var someString := iif(someInt > 35 , 'Large', 'Small');
Neste exemplo, uma nova cadeia de tipo forte chamada "someString" é criada (usando inferência de tipo) e a função IF irá preenchê-la dependendo do resultado da expressão booleana. SQL Server 2012 e mais recentes implementa a função IIF () (Transact-SQL):
DECLARE @a int = 45;
DECLARE @b int = 40;
SELECT IIF ( @a > @b, 'TRUE', 'FALSE' ) AS Result;
Se em C (e suas variantes) e Perl é o?: operador condicional:
printf("number %d is%s even", num, num % 2 ? " not" : "");
IIf em Python:
parity = "odd" if n % 2 else "even"
IIf (ou) em Red e Rebol:
parity: either odd? n ['odd]['even]