IJeśli

W informatyce IIf (skrót od Immediate if ) jest funkcją w kilku wersjach języka programowania Visual Basic i ColdFusion Markup Language (CFML ) oraz w arkuszach kalkulacyjnych , która zwraca drugi lub trzeci parametr na podstawie oceny pierwszego parametru. Jest to przykład wyrażenia warunkowego, które jest podobne do instrukcji warunkowej .

Składnia

Składnia funkcji IIf jest następująca:

 IIf  (  wyrażenie  ,  część prawdziwa  ,  część fałszywa  ) 

Wymagane są wszystkie trzy parametry:

  • wyrażenie jest wyrażeniem, które ma zostać ocenione.
  • truepart określa, co zwraca funkcja IIf, jeśli ocena expr zwróci wartość true.
  • falsepart określa, co zwraca funkcja IIf, jeśli ocena expr zwraca wartość false.

Wiele języków ma operator do osiągnięcia tego samego celu, ogólnie nazywany operatorem warunkowym (lub, mniej dokładnie, operatorem trójskładnikowym); najbardziej znanym jest ?: , używany w C, C++ i językach pokrewnych. Niektóre problemy z funkcją IIf, jak omówiono później, nie występują w przypadku operatora warunkowego, ponieważ język może swobodnie badać typ i ocenę opóźnienia operandów, w przeciwieństwie do zwykłego przekazywania ich do funkcji bibliotecznej.

Przykłady

Te przykłady oceniają wyrażenia matematyczne i zwracają jeden z dwóch łańcuchów w zależności od wyniku.

 wynik =  IIf  (5 < 10,  „Tak jest”  , „Nie, nie jest”) ' Zwraca „Tak jest” 
 wynik =  IIf  (2 + 2 = 5, „Prawidłowo”,  „Źle”  ) „ Zwraca „ Zło" 

Krytyka

Efektywność

Ponieważ IIf jest funkcją biblioteczną, zawsze będzie wymagać narzutu związanego z wywołaniem funkcji, podczas gdy operator warunkowy z większym prawdopodobieństwem utworzy kod wbudowany.

Ponadto typem danych jego argumentów jest Variant . Jeśli funkcja jest wywoływana z argumentami innych typów (zmiennymi lub literałami), konwersja ich na Variant spowoduje dodatkowy narzut . Może również wystąpić dodatkowy narzut, aby sprawdzić typy argumentów i przekonwertować jeden z nich, jeśli nie mają tego samego typu.

Skutki uboczne

Inny problem z IIf powstaje, ponieważ jest to funkcja biblioteczna: w przeciwieństwie do operatora warunkowego pochodzącego z języka C, zarówno część prawdziwa , jak i część fałszywa zostaną ocenione niezależnie od tego, która z nich jest faktycznie zwracana. W poniższym fragmencie kodu:

  
      wartość  =  10  wynik  =  IIf  (  wartość  =  10  ,  ''Prawdziwa funkcja'', Fałsz) 

chociaż TrueFunction jest funkcją, która ma zostać wywołana, IIf wywoła zarówno TrueFunction , jak i FalseFunction . Podobnie,

  
  0
    0    0 za  =  10  b  =  wynik  =  IJeżeli  (  b  <>  ,  a  /  b  ,  ) 

Chociaż intencją może być uniknięcie dzielenia przez zero, za każdym razem, gdy b wynosi zero, błąd faktycznie wystąpi. Dzieje się tak, ponieważ kod we fragmencie jest wykonywany tak, jakby przez

  
  0
    0
     
  0
  
      

      
  a  =  10  b  =  _temp1  =  b  <>  _temp2  =  a  /  b  ' Błąd, jeśli b = 0  _temp3  =  Jeśli  _temp1  Wtedy  wynik  =  _temp2  Inaczej  wynik  =  _temp3  Koniec  Jeśli 

Ten problem sprawia, że ​​wywołanie IIf() jest mniej przydatne niż operator warunkowy. Aby rozwiązać ten problem, programiści firmy Microsoft rozważali konwersję IIf na funkcję wewnętrzną; gdyby tak się stało, kompilator byłby w stanie przeprowadzić wnioskowanie o typie i zwarcie , zastępując wywołanie funkcji kodem wbudowanym.

Alternatywy dla IIf

W Visual Basic IIf nie jest jedynym sposobem oceny i wykonywania akcji na podstawie tego, czy wyrażenie jest prawdziwe, czy fałszywe.

Poniższy przykład używa IIf:

 wynik =  IIf  (x = y, wartość1, wartość2) 

Można to również zapisać w następujący sposób, używając standardowych warunków warunkowych :

    
      

      
  Jeśli  x  =  y  Wtedy  wynik  =  wartość1  Inaczej  wynik  =  wartość2  Koniec  Jeśli 

Powyższy przykład wyeliminowałby również problem IIf oceniania zarówno jego parametrów części prawdziwej , jak i części fałszywej .

Visual Basic 2008 (VB 9.0) wprowadził prawdziwy operator warunkowy , zwany po prostu „Jeśli”, który również eliminuje ten problem. Jej składnia jest podobna do składni funkcji IIf:

       wynik  =  Jeśli  (  x  =  y  ,  wartość1  ,  wartość2  ) 

IIf w innych językach programowania

$iif() jest obecny w skrypcie mIRC , z podobną składnią.

alias testiif {%testiif = 0 echo -a $iif(1,$testiif2,$testiif2) wykonanie %testiif anulowanie %testiif } alias testiif2 { inc %testiif | zwróć testowanie $!iif: }

Wywołanie /testiif spowoduje wydrukowanie „testowanie $iif: 1 wykonanie(a)”. $iif mIRC działa bardziej jak C ?: niż IIf() w VB, ponieważ nie ocenia wstępnie obu.

IIF() to funkcja w dBase i xBase (1992 i starsze).

iif() jest także magiczną funkcją kompilatora Oxygene . Nie jest to prawdziwa funkcja i w czasie kompilacji jest rozwijana do instrukcji warunkowych.

         var  jakiśCiąg  :=  iif  (  jakiśInt  >  35  ,  'Duży'  ,  'Mały'  )  ; 

W tym przykładzie tworzony jest nowy łańcuch silnego typu o nazwie „someString” (za pomocą typu inference ), a funkcja iif wypełni go w zależności od wyniku wyrażenia boolowskiego.

SQL Server 2012 i nowsze implementują funkcję IIF():

    
    
           DEKLARUJ  @  a  int  =  45  ;  DEKLARUJ  @  b  int  =  40  ;  WYBIERZ  IIF  (  @  a  >  @  b  ,  'PRAWDA'  ,  'FAŁSZ'  )  JAKO  Wynik  ; 

IJeśli w C jest ?: operator warunkowy :

         printf  (  "liczba %d jest%s parzysta"  ,  liczba  ,  liczba  %  2  ?  "nie"  :  ""  ); 

IIf w Pythonie:

         parzystość  =  "nieparzyste"  jeśli  n  %  2  inaczej  "parzyste" 

IIf (albo) w Red i Rebol:

parzystość: albo nieparzysta? n ['nieparzyste]['parzyste]
  1. ^ „Jak korzystać z funkcji IIf() (natychmiast, jeśli)” . 2004-06-08 . Źródło 2007-05-09 .
  2. ^ Paul Vick (2006-12-29). „IIF, prawdziwy operator trójskładnikowy i kompatybilność wsteczna” . Źródło 2007-02-01 .

Linki zewnętrzne