Se

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.

Sintática

A sintaxe da função IIf é a seguinte:

IIf(expr, truepart, falsepart)

São necessários os três parâmetros:

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.

Exemplos

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"

Críticas

Eficiência

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.

Alternativas ao IIf

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)

IIf em outras línguas de programação

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]

Referências

  1. ↑ Paul Vick (29 de dezembro de 2006). «IIF, a True Ternary Operator and Backwards Compatibility». Consultado em 1 de fevereiro de 2007. Arquivado do original em 22 de janeiro de 2007