IIf

Conditional function that returns one of two values.

Syntax
	IIf ( condition, expr_if_true, expr_if_false )

Parameters
	condition
		The condition to test.
		A non-zero value evaluates as true, while a value of zero evaluates 
		as false.
	expr_if_true
		An expression to evaluate and return if condition is true.
		It must return:
			* a numeric value, which can be an integer, floating point number 
			  or a pointer, including Boolean,
			* or a string value,
			* or an UDT value.
	expr_if_false
		An expression to evaluate and return if condition is false.
		It must be same type as expr_if_true (either numeric, either string 
		or UDT).

Return Value
	if condition is non-zero, expr_if_true, otherwise expr_if_false

Description
	IIf returns a different numeric or string or UDT value (not a reference) 
	depending of the result of a conditional expression evaluated at 
	run-time.
	Its typical use is in the middle of an expression; it avoids splitting 
	it to put a conditional in the middle.

	IIf only evaluates the expression that it needs to return.  This saves 
	time, and can also be useful to prevent evaluating expressions that 
	might be invalid depending on the condition.

	When IIf treats expressions of mixed numeric types (conditional 
	expression evaluated at run-time):
		* if at least one expression is of floating-point type, the result 
		  type is the floating-point type (the bigger in case of two 
		  floating-point types),
		* if the two expressions are of integer types, the result type is 
		  the bigger type of both (see ProPgDataConversionCoercion and Conversion for the 
		  precise ranking of integer types).

	Note: If the condition evaluation can be done at compile time (if the 
	comparison expression is a constant), the usage rules are a bit more 
	flexible and IIf can for example return a reference or even return a 
	function call (but not a sub call).

Example
	Dim As Integer a, b, x, y, z
	a = (x + y + IIf(b > 0, 4, 7)) \ z

is equivalent to:
	Dim As Integer a, b, x, y, z, temp
	If b > 0 Then temp = 4 Else temp = 7
	a = (x + y + temp) \ z

	Dim As Integer I
	I = -10
	Print I, IIf(I>0, "positive", IIf(I=0, "null", "negative"))
	I = 0
	Print I, IIf(I>0, "positive", IIf(I=0, "null", "negative"))
	I = 10
	Print I, IIf(I>0, "positive", IIf(I=0, "null", "negative"))
	Sleep

	Type UDT1
	  Dim As Integer I1
	End Type

	Type UDT2 Extends UDT1
	  Dim As Integer I2
	End Type

	Dim As UDT1 u1, u10 = (1)
	Dim As UDT2 u2, u20 = (2, 3)

	u1 = IIf(0, u10, u20)
	Print u1.I1
	u1 = IIf(1, u10, u20)
	Print u1.I1

	u2 = IIf(0 , u10, u20)
	Print u2.I1; u2.I2
	'u2 = Iif(1, u10, u20) ''Invalid assignment/conversion
	Sleep

Dialect Differences
	* Not available in the CompilerOptlang-lang qb dialect unless referenced with the 
	  alias __Iif.

Differences from QB
	* New to FreeBASIC

See also
	* KeyPgIfthenIf...Then

