Articulo de referencia

Si

En informática , IIf (abreviatura de Immediate if [ 1 ] ) es una función presente en varias ediciones del lenguaje de programación Visual Basic y ColdFusion Markup Language (CFM...

En informática , IIf (abreviatura de Immediate if [ 1 ] ) es una función presente en varias ediciones del lenguaje de programación Visual Basic y ColdFusion Markup Language (CFML), así como en hojas de cálculo , que devuelve el segundo o tercer parámetro en función de la evaluación del primero. Es un ejemplo de expresión condicional, similar a una sentencia condicional .

Sintaxis

La sintaxis de la función IIf es la siguiente:

Si ( expr , parte verdadera , parte falsa )

Se requieren los tres parámetros:

  • expr es la expresión que se va a evaluar.
  • truepart define quéIIfdevuelve la función si la evaluación de expr devuelve verdadero.
  • falsepart define quéIIfdevuelve la función si la evaluación de expr devuelve falso.

Muchos lenguajes cuentan con un operador para lograr el mismo propósito, generalmente denominado operador condicional (o, de forma menos precisa, operador ternario); el más conocido es `?: `, utilizado en C, C++ y lenguajes relacionados. Algunos de los problemas de la función `IIf`, como se explicará más adelante, no existen con un operador condicional, ya que el lenguaje puede examinar el tipo y retrasar la evaluación de los operandos, en lugar de simplemente pasarlos a una función de la biblioteca.

Ejemplos

Estos ejemplos evalúan expresiones matemáticas y devuelven una de dos cadenas de texto dependiendo del resultado.

resultado = IIf (5 < 10, "Sí lo es" , "No lo es") ' Devuelve "Sí lo es"
resultado = IIf (2 + 2 = 5, "Correcto", "Incorrecto" ) ' Devuelve "Incorrecto"

Críticas

Eficiencia

Dado que IIfes una función de biblioteca, siempre requerirá la sobrecarga de una llamada a función, mientras que un operador condicional tiene más probabilidades de producir código en línea.

Además, el tipo de datos de sus argumentos es Variant. Si se llama a la función con argumentos de otros tipos (variables o literales), habrá una sobrecarga adicional para convertirlos a Variant. También puede haber una sobrecarga adicional para comprobar los tipos de argumentos y convertir uno de ellos si no son del mismo tipo.

Efectos secundarios

Otro problema IIfsurge porque es una función de biblioteca: a diferencia del operador condicional derivado de C, tanto la parte verdadera como la falsa se evaluarán independientemente de cuál se devuelva realmente. En el siguiente fragmento de código:

valor = 10 resultado = IIf(valor = 10, TrueFunction , FalseFunction )

Aunque TrueFunction es la función que se pretende llamar, IIfllamará tanto a TrueFunction como a FalseFunction . De manera similar,

a = 10 b = 0 resultado = IIf ( b <> 0 , a / b , 0 )

Aunque la intención puede ser evitar una división por cero, siempre que b sea cero, el error ocurrirá. Esto se debe a que el código en el fragmento se ejecuta como si fuera por

a = 10 b = 0 _temp1 = b <> 0 _temp2 = a / b ' Error si b = 0 _temp3 = 0 Si _temp1 Entonces resultado = _temp2 Sino resultado = _temp3 Fin Si

Este problema hace que la IIf()llamada sea menos útil que el operador condicional. Para resolver este problema, los desarrolladores de Microsoft consideraron [ 2 ] convertirla IIfen una función intrínseca; de haber ocurrido esto, el compilador habría podido realizar la inferencia de tipos y la evaluación en cortocircuito reemplazando la llamada a la función con código en línea.

Alternativas a IIf

En Visual Basic , IIf no es la única forma de evaluar y realizar acciones en función de si una expresión es verdadera o falsa.

El siguiente ejemplo utiliza IIf:

resultado = ISi (x = y, valor1, valor2)

También podría escribirse de la siguiente manera, utilizando condicionales estándar :

Si x = y Entonces resultado = valor1 Sino resultado = valor2 Fin Si

El ejemplo anterior también eliminaría el problema de que IIf evalúe tanto sus parámetros de parte verdadera como de parte falsa .

Visual Basic 2008 (VB 9.0) introdujo un verdadero operador condicional , llamado simplemente "If", que también elimina este problema. Su sintaxis es similar a la sintaxis de la función IIf:

resultado = Si ( x = y , valor1 , valor2 )

Si en otros lenguajes de programación

$iif()Está presente en el script de mIRC , con una sintaxis similar.

alias testiif { %testiif = 0 echo -a $iif(1,$testiif2,$testiif2) %ejecución(es) de testiif unset %testiif } alias testiif2 { inc %testiif | prueba de devolución $!iif: } 

La llamada /testiifimprimirá "probando $iif: 1 ejecución(s)". mIRC se $iifcomporta más como C ?:que IIf()como VB, ya que no preevalúa ambos.

IIF()es una función en dBase y xBase (1992 y anteriores).

iif()También es una función mágica del compilador de Oxygene . No es una función real y en tiempo de compilación se desenrolla en sentencias condicionales.

var someString := iif ( someInt > 35 , 'Grande' , 'Pequeño' ) ;

En este ejemplo, se crea una nueva cadena de tipo fuerte llamada "someString" (usando la inferencia de tipos ) y la iiffunción la rellenará dependiendo del resultado de la expresión booleana.

SQL Server 2012 y versiones posteriores implementan la función IIF() ( Transact-SQL ):

DECLARE @ a int = 45 ; DECLARE @ b int = 40 ; SELECT IIF ( @ a > @ b , 'TRUE' , 'FALSE' ) AS Result ;

Si en C (y sus variantes) y Perl es el operador condicional ? :

printf ( "el número %d es %s par" , num , num % 2 ? " no" : "" );

Si en Python :

paridad = "impar" si n % 2 sino "par"

Si (cualquiera de los dos) está en Rojo y Rebol :

paridad: ¿ impar o par? n [ 'impar ][ 'par ]

Referencias

  1. "Cómo usar la función IIf() (Si inmediato)" . 8 de junio de 2004. Consultado el 9 de mayo de 2007 .
  2. Paul Vick (29-12-2006). "IIF, un verdadero operador ternario y compatibilidad con versiones anteriores" . Archivado del original el 22-01-2007 . Consultado el 01-02-2007 .
  • Documentación de MSDN para IIf