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]
- ^ „Jak korzystać z funkcji IIf() (natychmiast, jeśli)” . 2004-06-08 . Źródło 2007-05-09 .
- ^ Paul Vick (2006-12-29). „IIF, prawdziwy operator trójskładnikowy i kompatybilność wsteczna” . Źródło 2007-02-01 .