IIf
Inom computing är IIf (en förkortning för Immediate if ) en funktion i flera utgåvor av programmeringsspråket Visual Basic och ColdFusion Markup Language ( CFML), och på kalkylblad som returnerar den andra eller tredje parametern baserat på utvärderingen av den första parametern. Det är ett exempel på ett villkorligt uttryck, som liknar ett villkorligt uttalande .
Syntax
Syntaxen för IIf- funktionen är följande:
IIf ( expr , truepart , falsepart )
Alla tre parametrarna krävs:
- expr är uttrycket som ska utvärderas.
- truepart definierar vad IIf-funktionen returnerar om utvärderingen av expr returnerar sant.
- falsepart definierar vad IIf-funktionen returnerar om utvärderingen av expr returnerar false.
Många språk har en operator för att uppnå samma syfte, allmänt hänvisad till som en villkorlig operator (eller, mindre exakt, som en ternär operator); den mest kända är ?: , som används i C, C++ och relaterade språk. Vissa av problemen med IIf-funktionen, som diskuteras senare, existerar inte med en villkorlig operator, eftersom språket är fritt att undersöka typen och fördröja utvärderingen av operanderna, i motsats till att bara skicka dem till en biblioteksfunktion.
Exempel
Dessa exempel utvärderar matematiska uttryck och returnerar en av två strängar beroende på resultatet.
resultat = IIf (5 < 10, "Ja det är det" , "Nej det är det inte") ' Returnerar "Ja det är det"
resultat = IIf (2 + 2 = 5, "Korrekt", "Fel" ) ' Returnerar " Fel"
Kritik
Effektivitet
Eftersom IIf
är en biblioteksfunktion kommer den alltid att kräva overhead för ett funktionsanrop, medan en villkorlig operatör mer sannolikt kommer att producera inline-kod.
Dessutom är datatypen för dess argument Variant
. Om funktionen anropas med argument av andra typer (variabler eller literaler), kommer det att finnas ytterligare overhead för att konvertera dessa till Variant
. Det kan också finnas ytterligare overhead för att kontrollera argumenttyperna och konvertera en av dem om de inte har samma typ.
Bieffekter
Ett annat problem med IIf
uppstår eftersom det är en biblioteksfunktion: till skillnad från den C-härledda villkorsoperatorn kommer både truepart och falsepart att utvärderas oavsett vilken som faktiskt returneras. I följande kodavsnitt:
värde = 10 resultat = IIf ( värde = 10 , ''TrueFunction'', FalseFunction)
även om TrueFunction är den funktion som är avsedd att anropas, anropar IIf både
TrueFunction och FalseFunction . Liknande,
0
0 0 a = 10 b = resultat = IIf ( b <> , a / b , )
Även om avsikten kan vara att undvika en division med noll, kommer felet att inträffa närhelst b är noll. Detta beror på att koden i kodavsnittet exekveras som av
0
0
0
a = 10 b = _temp1 = b <> _temp2 = a / b ' Fel om b = 0 _temp3 = If _temp1 Then result = _temp2 Annat resultat = _temp3 End If
Det här problemet gör anropet IIf() mindre användbart än den villkorliga operatorn. För att lösa detta problem hade Microsoft-utvecklare övervägt att konvertera IIf
till en inneboende funktion; hade detta hänt skulle kompilatorn ha kunnat utföra typinferens och kortslutning genom att ersätta funktionsanropet med inline-kod.
Alternativ till IIf
I Visual Basic är IIf inte det enda sättet att utvärdera och utföra åtgärder baserat på om ett uttryck är sant eller falskt.
Följande exempel använder IIf:
resultat = IIf (x = y, värde1, värde2)
Det kan också skrivas på följande sätt med standardvillkor :
Om x = y Då resultat = värde1 Annat resultat = värde2 Slut If
Ovanstående exempel skulle också eliminera problemet med att IIf utvärderar både dess truepart- och falsepart -parametrar.
Visual Basic 2008 (VB 9.0) introducerade en äkta villkorlig operator , som helt enkelt kallas "If", vilket också eliminerar detta problem. Dess syntax liknar IIf-funktionens syntax:
resultat = Om ( x = y , värde1 , värde2 )
If på andra programmeringsspråk
$iif()
finns i mIRC- skript, med liknande syntax.
alias testiif { %testiif = 0 echo -a $iif(1,$testiif2,$testiif2) %testiif exekvering(er) unset %testiif } alias testiif2 { inc %testiif | returtestning $!iif: }
Att anropa /testiif
kommer att skriva ut "testar $iif: 1 exekvering(er)". mIRC:s $iif
fungerar mer som C:s ?:
än IIf()
i VB eftersom den inte kommer att förutvärdera båda.
IIF()
är en funktion i dBase och xBase (1992 och äldre).
iif()
är också en kompilatormagisk funktion av Oxygene . Det är inte en riktig funktion och rullas vid kompileringstillfället upp till villkorliga uttalanden.
var someString := iif ( someInt > 35 , 'Large' , 'Small' ) ;
I det här exemplet skapas en ny stark typsträng med namnet "someString" (med Type inference ) och iif
-funktionen kommer att fylla den beroende på resultatet av det booleska uttrycket.
SQL Server 2012 och nyare implementerar IIF()-funktionen:
DECLARE @ a int = 45 ; DEKLARE @ b int = 40 ; VÄLJ IIF ( @ a > @ b , 'TRUE' , 'FALSE' ) SOM Resultat ;
If i C är den ?: villkorliga operatorn :
printf ( "nummer %d är%s jämnt" , num , num % 2 ? " inte" : "" );
If i Python:
paritet = "udda" om n % 2 annars "jämn"
IIf (antingen) i rött och Rebol:
paritet: antingen udda? n ['udda]['jämn]
- ^ "Hur man använder IIf() (Omedelbar If)-funktionen" . 2004-06-08 . Hämtad 2007-05-09 .
- ^ Paul Vick (2006-12-29). "IIF, en äkta ternär operatör och bakåtkompatibilitet" . Hämtad 2007-02-01 .