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  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]
  1. ^ "Hur man använder IIf() (Omedelbar If)-funktionen" . 2004-06-08 . Hämtad 2007-05-09 .
  2. ^ Paul Vick (2006-12-29). "IIF, en äkta ternär operatör och bakåtkompatibilitet" . Hämtad 2007-02-01 .

externa länkar