Conditional structures: Difference between revisions

From Rosetta Code
Content added Content deleted
m (Use a proper mediawiki wikipedia link, remove over enthusiastic whitespace, reformatted slightly to match preexisting)
m (→‎case without a default: the error discussed isn’t syntactic)
 
(46 intermediate revisions by 34 users not shown)
Line 2: Line 2:
{{Control Structures}}
{{Control Structures}}
[[Category:Simple]]
[[Category:Simple]]
[[Category:Flow control]]


;Task:
;Task:
Line 16: Line 17:
=={{header|11l}}==
=={{header|11l}}==
===if-else===
===if-else===
<lang 11l>I x == 0
<syntaxhighlight lang="11l">I x == 0
foo()
foo()
E I x == 1
E I x == 1
bar()
bar()
E
E
baz()</lang>
baz()</syntaxhighlight>


===switch===
===switch===
<lang 11l>S x
<syntaxhighlight lang="11l">S x
0
0
foo()
foo()
Line 30: Line 31:
bar()
bar()
E
E
baz()</lang>
baz()</syntaxhighlight>


=={{header|360 Assembly}}==
=={{header|360 Assembly}}==
Here are the branch mnemonic opcodes:
Here are the branch mnemonic opcodes:
<lang 360asm>* Unconditional Branch or No Branch:
<syntaxhighlight lang="360asm">* Unconditional Branch or No Branch:
B label Unconditional
B label Unconditional
BR Rx "
BR Rx "
Line 81: Line 82:
BNMR Rx "
BNMR Rx "
BNZ label Branch if Not Zero
BNZ label Branch if Not Zero
BNZR Rx "</lang>
BNZR Rx "</syntaxhighlight>
The ASM (Assembler Structured Macros) toolkit brings structures to IBM assembler 360.
The ASM (Assembler Structured Macros) toolkit brings structures to IBM assembler 360.
<lang 360asm> expression:
<syntaxhighlight lang="360asm"> expression:
opcode,op1,rel,op2
opcode,op1,rel,op2
opcode,op1,rel,op2,OR,opcode,op1,rel,op2
opcode,op1,rel,op2,OR,opcode,op1,rel,op2
Line 155: Line 156:
CASE 7 case 7
CASE 7 case 7
LA R5,4 r5=4
LA R5,4 r5=4
ENDCASE end select</lang>
ENDCASE end select</syntaxhighlight>


=={{header|6502 Assembly}}==
=={{header|6502 Assembly}}==
Line 161: Line 162:
6502 Assembly has 8 conditional branch instructions; each instruction will test the appropriate flag and condition and jump between -128 and 127 bytes.
6502 Assembly has 8 conditional branch instructions; each instruction will test the appropriate flag and condition and jump between -128 and 127 bytes.
To understand these conditional instructions, it is helpful to remember that the comparison instructions (CMP, CPX, CPY) set the flags as if a subtraction had occurred:
To understand these conditional instructions, it is helpful to remember that the comparison instructions (CMP, CPX, CPY) set the flags as if a subtraction had occurred:
<lang 6502asm> LDA #10
<syntaxhighlight lang="6502asm"> LDA #10
CMP #11</lang>
CMP #11</syntaxhighlight>
Following these instructions, the accumulator will still hold 10 but the flags are set as if you had instructed the processor to perform 10 - 11.
Following these instructions, the accumulator will still hold 10 but the flags are set as if you had instructed the processor to perform 10 - 11.
The result is -1, so the sign flag will be set, the zero flag will be cleared, the overflow flag will be cleared, and the carry flag will be set.
The result is -1, so the sign flag will be set, the zero flag will be cleared, the overflow flag will be cleared, and the carry flag will be set.
<lang 6502asm> BNE ;Branch on Not Equal - branch when the zero flag is set
<syntaxhighlight lang="6502asm"> BNE ;Branch on Not Equal - branch when the zero flag is set
BEQ ;Branch on EQual - branch when the zero flag is set.
BEQ ;Branch on EQual - branch when the zero flag is set.
;The zero flag is set when the result of an operation is zero
;The zero flag is set when the result of an operation is zero
Line 184: Line 185:
;a subtraction produced a borrow and cleared if an addition/subtraction
;a subtraction produced a borrow and cleared if an addition/subtraction
;does not produce a carry/borrow. The carry flag also holds bits
;does not produce a carry/borrow. The carry flag also holds bits
;after shifts and rotates.</lang>
;after shifts and rotates.</syntaxhighlight>
In the following example, the branch will be taken if memory location Variable holds 200:
In the following example, the branch will be taken if memory location Variable holds 200:
<lang 6502asm> LDA #200
<syntaxhighlight lang="6502asm"> LDA #200
CMP Variable
CMP Variable
BEQ #3 ;if equal, skip ahead 3 bytes...
BEQ #3 ;if equal, skip ahead 3 bytes...
CLC ;if unequal, continue executing instructions
CLC ;if unequal, continue executing instructions
ADC #1
ADC #1
STA OtherVariable ; ...to here.</lang>
STA OtherVariable ; ...to here.</syntaxhighlight>
Because you don't have to perform a comparison to set the flags, you can perform very fast checks in iterative loops:
Because you don't have to perform a comparison to set the flags, you can perform very fast checks in iterative loops:
<lang 6502asm> LDX #100
<syntaxhighlight lang="6502asm"> LDX #100
Loop: ...do something
Loop: ...do something
DEX
DEX
BNE Loop</lang>
BNE Loop</syntaxhighlight>
This code will loop until X is zero.
This code will loop until X is zero.
Most assemblers will figure out the correct offset for you if you use a label in place of the offset after a branch instruction, as in the above example.
Most assemblers will figure out the correct offset for you if you use a label in place of the offset after a branch instruction, as in the above example.
Line 203: Line 204:
A jump table is a list of subroutine addresses, which can be indexed like any other array. The 6502 has no indirect call command, but it can be created in software using an indexed jump table. One method of doing this is spoofing a return address and using the return from subroutine command to "return" to the desired subroutine.
A jump table is a list of subroutine addresses, which can be indexed like any other array. The 6502 has no indirect call command, but it can be created in software using an indexed jump table. One method of doing this is spoofing a return address and using the return from subroutine command to "return" to the desired subroutine.


<lang 6502asm>ReturnTable:
<syntaxhighlight lang="6502asm">ReturnTable:
dw foo-1 ;each is a label to a section of code that ends in an RTS
dw foo-1 ;each is a label to a section of code that ends in an RTS
dw bar-1
dw bar-1
Line 223: Line 224:
; If done properly, return spoofing will not corrupt the stack.
; If done properly, return spoofing will not corrupt the stack.


RTS ;this "RTS" acts as a JMP to the address we just put on the stack.</lang>
RTS ;this "RTS" acts as a JMP to the address we just put on the stack.</syntaxhighlight>
=={{header|68000 Assembly}}==
=={{header|68000 Assembly}}==
Like [[6502 Assembly]], 68000 Assembly has several different condition states the CPU can use to branch. As is typical with assembly languages, branching code is less straightforward than on high-level languages. There is no "if" statement per se; the correct branch to use depends more so on the expression being evaluated.
Like [[6502 Assembly]], 68000 Assembly has several different condition states the CPU can use to branch. As is typical with assembly languages, branching code is less straightforward than on high-level languages. There is no "if" statement per se; the correct branch to use depends more so on the expression being evaluated.
Line 231: Line 232:
===CMP===
===CMP===
The most commonly used comparator is <code>CMP</code>. It can operate at byte, word, or long length. Anything outside of the "range" of its size parameter is ignored.
The most commonly used comparator is <code>CMP</code>. It can operate at byte, word, or long length. Anything outside of the "range" of its size parameter is ignored.
<lang 68000devpac>MOVE.L #$FFFFFF00,D0
<syntaxhighlight lang="68000devpac">MOVE.L #$FFFFFF00,D0
CMP.B #0,D0 ;equals zero, so zero flag is set.
CMP.B #0,D0 ;equals zero, so zero flag is set.
CMP.W #0,D0 ;doesn't equals zero, so zero flag is clear.</lang>
CMP.W #0,D0 ;doesn't equals zero, so zero flag is clear.</syntaxhighlight>


Other than its size parameter, <code>CMP</code> works very similar to [[6502 Assembly]]. It returns both a test for equality and a size comparison (i.e. which number is greater than the other.) This chart from [http://www.easy68k.com/paulrsm/doc/trick68k.htm 68000 Tricks and Traps] sums it up nicely. If you use <code>CMP D0,D1</code> at any data size, this is what you get:
Other than its size parameter, <code>CMP</code> works very similar to [[6502 Assembly]]. It returns both a test for equality and a size comparison (i.e. which number is greater than the other.) This chart from [http://www.easy68k.com/paulrsm/doc/trick68k.htm 68000 Tricks and Traps] sums it up nicely. If you use <code>CMP D0,D1</code> at any data size, this is what you get:
Line 249: Line 250:
===Bit Testing===
===Bit Testing===
Individual bits can be tested with <code>BTST</code>, <code>BSET</code>, <code>BCLR</code>, and <code>BCHG</code>. The <code>BTST</code> command takes a bit as its left operand and the value being tested in the right (either a data register, address register with or without parentheses, or memory address).
Individual bits can be tested with <code>BTST</code>, <code>BSET</code>, <code>BCLR</code>, and <code>BCHG</code>. The <code>BTST</code> command takes a bit as its left operand and the value being tested in the right (either a data register, address register with or without parentheses, or memory address).
<lang 68000devpac>BTST #7,D0 ;test bit 7 of D0, i.e. the leftmost bit in the rightmost byte.
<syntaxhighlight lang="68000devpac">BTST #7,D0 ;test bit 7 of D0, i.e. the leftmost bit in the rightmost byte.
BNE goHere ;if that bit is 1, branch to "goHere"
BNE goHere ;if that bit is 1, branch to "goHere"
BEQ goThere ;if that bit is 0, branch to "goThere"</lang>
BEQ goThere ;if that bit is 0, branch to "goThere"</syntaxhighlight>


<code>BSET</code>, <code>BCLR</code>, and <code>BCHG</code> are similar, in that they also allow you to branch based on the value of the bit being tested. However, they also alter the bit in the destination that was tested, AFTER the test. The new state of that bit is not reflected in the test results. Branching occurs as if you used <code>BTST</code> instead. <code>BSET</code> makes the bit in the destination 1, <code>BCLR</code>makes it zero, and <code>BCHG</code> flips it.
<code>BSET</code>, <code>BCLR</code>, and <code>BCHG</code> are similar, in that they also allow you to branch based on the value of the bit being tested. However, they also alter the bit in the destination that was tested, AFTER the test. The new state of that bit is not reflected in the test results. Branching occurs as if you used <code>BTST</code> instead. <code>BSET</code> makes the bit in the destination 1, <code>BCLR</code>makes it zero, and <code>BCHG</code> flips it.
Line 260: Line 261:
These concepts can be emulated in assembly but it's a bit tricky for beginners to understand. The branch condition isn't always what you would expect. Sometimes it is reversed depending on what is easier to check. This is a common way to have an <code>IF condition==true THEN do something ELSE do nothing</code> style of statement. The code checks if <code>D0 == 3</code> and if it does, adds 7. If <code>D0 != 3</code>, execution just continues as normal.
These concepts can be emulated in assembly but it's a bit tricky for beginners to understand. The branch condition isn't always what you would expect. Sometimes it is reversed depending on what is easier to check. This is a common way to have an <code>IF condition==true THEN do something ELSE do nothing</code> style of statement. The code checks if <code>D0 == 3</code> and if it does, adds 7. If <code>D0 != 3</code>, execution just continues as normal.


<lang 68000devpac>CMP.L #3,D0 ;this works with any size operands, not just L.
<syntaxhighlight lang="68000devpac">CMP.L #3,D0 ;this works with any size operands, not just L.
BNE doNothing
BNE doNothing
ADD.L #7,D0
ADD.L #7,D0
doNothing:
doNothing:
;rest of program</lang>
;rest of program</syntaxhighlight>


Rather than branch to a different section of code if <code>D0 == 3</code>, the program branched if it <b>DIDN'T</b> equal 3, skipping the add 7.
Rather than branch to a different section of code if <code>D0 == 3</code>, the program branched if it <b>DIDN'T</b> equal 3, skipping the add 7.
Line 272: Line 273:
There is no built-in way to "default" if none of the expected cases match. A bounds check will have to be programmed in manually. Most of the time when writing a return spoof the programmer already knows what the maximum possible cases will be.
There is no built-in way to "default" if none of the expected cases match. A bounds check will have to be programmed in manually. Most of the time when writing a return spoof the programmer already knows what the maximum possible cases will be.


<lang 68000devpac>SwitchCase:
<syntaxhighlight lang="68000devpac">SwitchCase:
DC.L foo,bar,baz,default ;case 0, case 1, case 2, case 3. (Case 0,1,2 are the "valid" cases.)
DC.L foo,bar,baz,default ;case 0, case 1, case 2, case 3. (Case 0,1,2 are the "valid" cases.)
; D0 is the case selector variable (byte-sized)
; D0 is the case selector variable (byte-sized)
Line 305: Line 306:


default:
default:
rts</lang>
rts</syntaxhighlight>


=={{header|AArch64 Assembly}}==
=={{header|AArch64 Assembly}}==
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
{{works with|as|Raspberry Pi 3B version Buster 64 bits}}
<syntaxhighlight lang="aarch64 assembly">
<lang AArch64 Assembly>
/* ARM assembly AARCH64 Raspberry PI 3B */
/* ARM assembly AARCH64 Raspberry PI 3B */
/* program condstr64.s */
/* program condstr64.s */
Line 530: Line 531:
.include "../includeARM64.inc"
.include "../includeARM64.inc"


</syntaxhighlight>
</lang>


=={{header|Action!}}==
=={{header|Action!}}==
<lang Action!>PROC Main()
<syntaxhighlight lang="action!">PROC Main()
INT i
INT i


Line 546: Line 547:
FI
FI
OD
OD
RETURN</lang>
RETURN</syntaxhighlight>
{{out}}
{{out}}
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Conditional_structures.png Screenshot from Atari 8-bit computer]
[https://gitlab.com/amarok8bit/action-rosetta-code/-/raw/master/images/Conditional_structures.png Screenshot from Atari 8-bit computer]
Line 560: Line 561:
=={{header|Ada}}==
=={{header|Ada}}==
===if-then-else===
===if-then-else===
<lang ada>type Restricted is range 1..10;
<syntaxhighlight lang="ada">type Restricted is range 1..10;
My_Var : Restricted;
My_Var : Restricted;


Line 569: Line 570:
else
else
-- do something
-- do something
end if;</lang>
end if;</syntaxhighlight>
===conditional expressions===
===conditional expressions===
Ada 2012 introduces conditional expressions, which are allowed anywhere an expression is allowed (e.g.: in a numeric literal, aggregate, etc.). A conditional expression can either be an if expression or case expression. Conditional expressions must be surrounded by parentheses.
Ada 2012 introduces conditional expressions, which are allowed anywhere an expression is allowed (e.g.: in a numeric literal, aggregate, etc.). A conditional expression can either be an if expression or case expression. Conditional expressions must be surrounded by parentheses.
====if expression====
====if expression====
<lang ada>type Operation is (Add, Subtract, Multiply, Divide);
<syntaxhighlight lang="ada">type Operation is (Add, Subtract, Multiply, Divide);
Op : Operation;
Op : Operation;
Result : Integer;
Result : Integer;
Line 585: Line 586:
elsif Op = Divide then
elsif Op = Divide then
A / B
A / B
);</lang>
);</syntaxhighlight>
====case expressions====
====case expressions====
Using the same example above, we assume that the <lang ada>Operation</lang>, <lang ada>Op</lang>, and <lang ada>Result</lang> variables are declared. A case expression over the enumeration of operations might look like:
Using the same example above, we assume that the ''Operation'', ''Op'', and ''Result'' variables are declared. A case expression over the enumeration of operations might look like:
<lang ada>Result := (case Op is
<syntaxhighlight lang="ada">Result := (case Op is
Add => A + B,
Add => A + B,
Subtract => A - B,
Subtract => A - B,
Line 594: Line 595:
Divide => A / B
Divide => A / B
);
);
</syntaxhighlight>
</lang>
Note: some websites (particularly [https://www.radford.edu/nokie/classes/320/abe/operators.html#:~:text=if%20and%20case-,Examples%3A,1%2C%20others%20%3D%3E%200)%3B this one]) contain a different variant of a case expression (<lang ada>case Op of...</lang>). The Ada Reference Manual indicates this is incorrect, and we use the [http://www.ada-auth.org/standards/12rm/html/RM-4-5-7.html formal version] here.
Note: some websites (particularly [https://www.radford.edu/nokie/classes/320/abe/operators.html#:~:text=if%20and%20case-,Examples%3A,1%2C%20others%20%3D%3E%200)%3B this one]) contain a different variant of a case expression (<syntaxhighlight lang="ada">case Op of...</syntaxhighlight>). The Ada Reference Manual indicates this is incorrect, and we use the [http://www.ada-auth.org/standards/12rm/html/RM-4-5-7.html formal version] here.

===case with a default alternative===
===case with a default alternative===
<lang ada>type Days is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
<syntaxhighlight lang="ada">type Days is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Today : Days;
Today : Days;


Line 609: Line 611:
when others =>
when others =>
Accumulate_Sales;
Accumulate_Sales;
end case;</lang>
end case;</syntaxhighlight>


===case without a default===
===case without a default===
When there is no '''when others''' clause, the compiler will complain about any uncovered alternative. This defends against a common reason for bugs in other languages.
When there is no '''when others''' clause, the compiler will complain about any uncovered alternative. This defends against a common reason for bugs in other languages.
I.e., the following code is syntactically incorrect:
I.e., the following code is incorrect:


<lang ada>case Today is
<syntaxhighlight lang="ada">case Today is
when Monday =>
when Monday =>
Compute_Starting_Balance;
Compute_Starting_Balance;
Line 623: Line 625:
Accumulate_Sales;
Accumulate_Sales;
-- ignore Saturday and Sunday
-- ignore Saturday and Sunday
end case;</lang>
end case;</syntaxhighlight>


The syntactically correct version:
The correct version:


<lang ada>case Today is
<syntaxhighlight lang="ada">case Today is
when Saturday | Sunday =>
when Saturday | Sunday =>
null; -- don't do anything, if Today is Saturday or Sunday
null; -- don't do anything, if Today is Saturday or Sunday
Line 636: Line 638:
when Tuesday .. Thursday =>
when Tuesday .. Thursday =>
Accumulate_Sales;
Accumulate_Sales;
end case;</lang>
end case;</syntaxhighlight>


===select===
===select===
Line 643: Line 645:


====Conditional Accept====
====Conditional Accept====
<lang ada>select
<syntaxhighlight lang="ada">select
accept first_entry;
accept first_entry;
-- do something
-- do something
Line 649: Line 651:
-- do something
-- do something
or terminate;
or terminate;
end select;</lang>
end select;</syntaxhighlight>


====Conditional entry call====
====Conditional entry call====
A selective entry call provides a way to time-out an entry call.
A selective entry call provides a way to time-out an entry call.
Without the time-out the calling task will suspend until the entry call is accepted.
Without the time-out the calling task will suspend until the entry call is accepted.
<lang ada>select
<syntaxhighlight lang="ada">select
My_Task.Start;
My_Task.Start;
or
or
delay Timeout_Period;
delay Timeout_Period;
end select;</lang>
end select;</syntaxhighlight>
The entry Start on the task My_Task will be called.
The entry Start on the task My_Task will be called.
If My_Task accepts the entry call before the timer expires the timer is canceled. If the timeout expires before the entry call is accepted the entry call is canceled.
If My_Task accepts the entry call before the timer expires the timer is canceled. If the timeout expires before the entry call is accepted the entry call is canceled.
Line 664: Line 666:
=={{header|Aikido}}==
=={{header|Aikido}}==
===Conditional Expressions===
===Conditional Expressions===
<lang aikido>
<syntaxhighlight lang="aikido">
var x = loggedin ? sessionid : -1
var x = loggedin ? sessionid : -1


</syntaxhighlight>
</lang>


===if..elif..else===
===if..elif..else===
<lang aikido>
<syntaxhighlight lang="aikido">
if (value > 40) {
if (value > 40) {
println ("OK")
println ("OK")
Line 678: Line 680:
println ("RETRY")
println ("RETRY")
}
}
</syntaxhighlight>
</lang>


===switch===
===switch===
<lang aikido>
<syntaxhighlight lang="aikido">
switch (arg) {
switch (arg) {
case "-d":
case "-d":
Line 707: Line 709:
println ("RETRY")
println ("RETRY")
}
}
</syntaxhighlight>
</lang>


=={{header|Aime}}==
=={{header|Aime}}==
Line 713: Line 715:
===If-elif-else===
===If-elif-else===


<lang aime>if (c1) {
<syntaxhighlight lang="aime">if (c1) {
// first condition is true...
// first condition is true...
} elif (c2) {
} elif (c2) {
Line 721: Line 723:
} else {
} else {
// none was true...
// none was true...
}</lang>
}</syntaxhighlight>


=={{header|ALGOL 60}}==
=={{header|ALGOL 60}}==
Line 734: Line 736:
'''if''' X=Y '''then''' K:=I
'''if''' X=Y '''then''' K:=I
An example:
An example:
<lang algol60> 'IF' I=1 'THEN' OUTINTEGER(1,I);
<syntaxhighlight lang="algol60"> 'IF' I=1 'THEN' OUTINTEGER(1,I);


'IF' I<J 'THEN' OUTSTRING(1,'(' : I<J')')
'IF' I<J 'THEN' OUTSTRING(1,'(' : I<J')')
Line 746: Line 748:
OUTSTRING(1,'(' J=')');
OUTSTRING(1,'(' J=')');
OUTINTEGER(1,J)
OUTINTEGER(1,J)
'END'</lang>
'END'</syntaxhighlight>
Algol 60 has also a switch structure:
Algol 60 has also a switch structure:
declaration::= '''switch''' switch:=list_of labels
declaration::= '''switch''' switch:=list_of labels
statement::= '''goto''' switch[expression]
statement::= '''goto''' switch[expression]
An example:
An example:
<lang algol60> 'SWITCH' TARGET:=L1,L2,L3;
<syntaxhighlight lang="algol60"> 'SWITCH' TARGET:=L1,L2,L3;
...
...
'GOTO' TARGET(/J/);
'GOTO' TARGET(/J/);
L1: OUTSTRING(1,'('AA')');
L1: OUTSTRING(1,'('AA')');
L2: OUTSTRING(1,'('BB')');
L2: OUTSTRING(1,'('BB')');
L3: OUTSTRING(1,'('CC')');</lang>
L3: OUTSTRING(1,'('CC')');</syntaxhighlight>


=={{header|ALGOL 68}}==
=={{header|ALGOL 68}}==
Line 762: Line 764:


=={{header|ALGOL W}}==
=={{header|ALGOL W}}==
<lang algolw>begin
<syntaxhighlight lang="algolw">begin
integer a, b, c;
integer a, b, c;


Line 793: Line 795:
write( case c - a of ( "one", "two", "three", "four" ) )
write( case c - a of ( "one", "two", "three", "four" ) )


end.</lang>
end.</syntaxhighlight>
{{out}}
{{out}}
<pre>
<pre>
Line 800: Line 802:
a + b is three
a + b is three
two
two
</pre>

=={{header|Amazing Hopper}}==
Las estructuras condicionales en Hopper son inexistentes. Pero se pueden definir estructuras de alto nivel, todas las que su imaginación le dicte... Bueno, todas las que Hopper le permita hacer con sus instrucciones. Existen instrucciones que permiten evaluar el contenido de la memoria, como "eq?", que evalúa si dos valores son iguales, o "zero?", que evalúa si el valor es cero. También cuenta con saltos condicionales que evalúan el contenido de la memoria, como "jle( etiqueta )", que saltará a etiqueta si el primer valor en memoria es menor o igual al segundo valor en memoria.
Hasta ahora se han definido cuatro "sabores" para Hopper. Aquí repasaremos las estructuras condicionales del sabor "Jambo".

OBSERVACION: todas estas estructuras condicionales permiten anidamiento.

La más clásica:

<pre>
If ( expresion )
...
Else If ( expresion )
...
Else
...
End If
</pre>

La definición de las macros para "IF/ELSE" es la siguiente (jambo.h):

<pre>
#defn ElseIf(__X__) jmp(%%CODEIF), %ENDIF:, #OPTIMLOG, #ATOM#CMPLX ,#OPTIMLOG, jnt(#ENDIF),
#defn If(__X__) ##CODEIF, #OPTIMLOG, #ATOM#CMPLX ,#OPTIMLOG, jnt(#ENDIF),
#defn Else jmp(%%CODEIF), %ENDIF:, true,jnt(#ENDIF),
#defn EndIf %CODEIF:, %ENDIF:,
</pre>

La macro "MOVE IF", mueve un valor desde la memoria hasta una variable, según si se cumple una expresión lógica. El valor es quitado de la memoria. En el ejemplo, moverá "15" a la variable "x":

<pre>
sw=1
Add(10,5)
Move if( sw, x, y)
</pre>

La definición de la macro en "jambo.h" es la siguiente:

<pre>
#defn Moveif(_X_,_Y_,_Z_) #ATOM#CMPLX;jnt(#ENDIIF);mov(_Y_);jmp(#ENDIF);%ENDIIF:;mov(_Z_);%ENDIF:
</pre>

La macro "COPY IF" es semejante a "MOVE IF", pero deja el valor en la memoria:

<pre>
sw=1
Add(10,5)
Copy if( sw, x, y) --> x guarda "15"
Prnl --> imprime "15"
</pre>

La macro "MOVE ON" mueve un valor desde la memoria hasta una variable, si se cumple una condición lógica; si no se cumple, el valor se retira de la memoria. Ejemplo:

<pre>
sw=0
Add(10,5)
Move on( sw, x)
</pre>

La macro "COPY ON" es semejante a "MOVE ON", pero deja el valor en la memoria, haya o no haya sido guardado en la variable. Ejemplo:

<pre>
sw=0
Add(10,5)
Copy on( sw, x)
Prnl
</pre>

La macro "SET ON" deja un valor o resultado de una expresión en memoria, si se cumple la condición:

<pre>
Set '100, 10, 0.05, 1.5E-5'
sw=1
Set on( sw, Add(10,5) )
Apnd Lst 'lista'
</pre>

La macro "SET IF" deja en memoria el resultado de una expresión o un valor en memoria, dependiendo de una expresión lógica. En el ejemplo, dejará el resultado de la suma:

<pre>
sw=1
Set if ( sw, Add(10,5), Sub( 10, Mul(i,2) ) )
Move to 'res'
</pre>

La macro "GET IF" obtiene un valor o resultado de una expresión, según una expresión lógica. Es idéntica a "SET IF", pero puede ser usada con la macro "LET":

<pre>
sw=1
Let ' res := Get if ( sw, Add(10,5), Sub( 10, Mul(i,2) ) ) '
</pre>

La macro "SWITCH" es una macro de selección múltiple, pero puede ser evaluada una expresión o valor de cualquier tipo:

<pre>
Switch ( expresion|valor )
Case 'valor' { ... [Exit] } --> coincide con el valor
Btwn 'v1, v2' { ... [Exit] } --> si está entre los valores "v1" y "v2"
Exact occurs 's' { ... [Exit] } --> si está contenido exactamente en el string "s"
Occurs 's' { ... [Exit] } --> si está contenido en el string "s"
On list 'l' { ... [Exit] } --> si está en el array-lista "l"
Default { ... [Exit] } --> si nada tiene sentido.
End switch
</pre>

Se pueden usar otras macros como evaluadores "CASE", como son las siguientes:

<pre>
Case not negative { ... [Exit] }
Case not zero { ... [Exit] }
Case not positive { ... [Exit] }
Case not numeric { ... [Exit] }
Case not string { ... [Exit] }
Case not array { ... [Exit] }
Case not null { ... [Exit] }
Case negative { ... [Exit] }
Case zero { ... [Exit] }
Case positive { ... [Exit] }
Case numeric { ... [Exit] }
Case string { ... [Exit] }
Case array { ... [Exit] }
Case null { ... [Exit] }

</pre>

EL "ODIADO" GOTO (pero yo lo amo):

La estructura "ON GOTO" se usa para saltar a una etiqueta de acuerdo a lo que encuentre en la memoria. Evalúa valores desde 1 en adelante. NOTA: si el valor de la memoria no coindice con la evaluación de "ON GOTO", queda en la memoria.

<pre>
EQ3:
instrucciones
Goto 'Elección de saltos'

...
Elección de saltos:
Ceil(Rand '3'), On goto( EQ1, EQ2, EQ3 )
Kill --> retira el valor de la memoria, si no fue consumido por "ON GOTO"
...
EQ1:
instrucciones
EQ2:
instrucciones
</pre>

La estructura "ON GOSUB" es idéntica a "ON GOTO", pero el control del programa retorna luego de ejecutado el bloque:

<pre>
Ceil(Rand '3'), On gosub( EQ1, EQ2, EQ3 )
Kill --> retira el valor de la memoria, si no fue consumido por "ON GOSUB"
...
EQ1:
instrucciones
back
EQ2:
instrucciones
back
EQ3:
instrucciones
back
</pre>

La estructura "ON OPTION" realiza una acción según el valor encontrado en memoria, que debe iniciar desde 1 en adelante. Si el valor memorizado no es consumido por "ON OPTION", queda en memoria y puede ser eliminado o usado por el programa:

<pre>
x=10
Set '3'
On option (x+=0.5, x-=0.5, x*=0.5; l=x) --> ejecuta "x*=0.5" y "l=x"
Printnl ("Resultado X= ", x)
</pre>

La estructura "LINK GOSUB" invoca subrutinas en secuencia. En el ejemplo, se memoriza "100", luego, se invoca a "proc1" que obtiene 200, luego invoca a "proc2" que obtiene "1000", y finalmente invoca a "proc3" que obtiene "500":

<pre>
Main
Set(100), Link gosub(proc1, proc2, proc3)
Prnl --> imprime el valor "500".
End

Subrutines

Define( proc1, dato )
Return ' Add(dato,100) '

Define ( proc2, dato )
Return ' Mul(dato,5) '

Define( proc3, dato )
var(dato) Div into(2)
Return
</pre>
</pre>


Line 810: Line 1,007:
The second and third arguments should be blocks (aka anonymous functions or thunks).
The second and third arguments should be blocks (aka anonymous functions or thunks).


<lang ambienttalk>
<syntaxhighlight lang="ambienttalk">
if: condition then: {
if: condition then: {
// condition is true...
// condition is true...
Line 816: Line 1,013:
// condition is false...
// condition is false...
}
}
</syntaxhighlight>
</lang>


===IfTrue/IfFalse===
===IfTrue/IfFalse===
Line 822: Line 1,019:
One can also send a message to the boolean objects true and false:
One can also send a message to the boolean objects true and false:


<lang ambienttalk>
<syntaxhighlight lang="ambienttalk">
condition.ifTrue: { /* condition is true... */ } ifFalse: { /* condition is false... */ }
condition.ifTrue: { /* condition is true... */ } ifFalse: { /* condition is false... */ }
</syntaxhighlight>
</lang>


=={{header|AmigaE}}==
=={{header|AmigaE}}==
'''IF-THEN-ELSE'''
'''IF-THEN-ELSE'''
<lang amigae>IF condition
<syntaxhighlight lang="amigae">IF condition
-> if condition is true...
-> if condition is true...
ELSEIF condition2
ELSEIF condition2
Line 834: Line 1,031:
ELSE
ELSE
-> if all other conditions are not true...
-> if all other conditions are not true...
ENDIF</lang>
ENDIF</syntaxhighlight>


or on one single line:
or on one single line:


<lang amigae>IF condition THEN statement</lang>
<syntaxhighlight lang="amigae">IF condition THEN statement</syntaxhighlight>


'''Ternary IF THEN ELSE'''
'''Ternary IF THEN ELSE'''


The IF-THEN-ELSE can be used like ternary operator (?: in C)
The IF-THEN-ELSE can be used like ternary operator (?: in C)
<lang amigae>DEF c
<syntaxhighlight lang="amigae">DEF c
c := IF condition THEN 78 ELSE 19</lang>
c := IF condition THEN 78 ELSE 19</syntaxhighlight>


'''SELECT-CASE'''
'''SELECT-CASE'''


<lang amigae>SELECT var
<syntaxhighlight lang="amigae">SELECT var
CASE n1
CASE n1
-> code
-> code
Line 855: Line 1,052:
DEFAULT
DEFAULT
-> no one of the previous case...
-> no one of the previous case...
ENDSELECT</lang>
ENDSELECT</syntaxhighlight>


Another version allows for ranges:
Another version allows for ranges:


<lang amigae>SELECT max_possible_value OF var
<syntaxhighlight lang="amigae">SELECT max_possible_value OF var
CASE n1
CASE n1
-> code
-> code
Line 868: Line 1,065:
DEFAULT
DEFAULT
-> none of previous ones
-> none of previous ones
ENDSELECT</lang>
ENDSELECT</syntaxhighlight>


The biggest among n1, n2 and so on, must be not bigger than max_possible_value.
The biggest among n1, n2 and so on, must be not bigger than max_possible_value.
Line 874: Line 1,071:
=={{header|Apex}}==
=={{header|Apex}}==
===if-then-else===
===if-then-else===
<lang java>if (s == 'Hello World') {
<syntaxhighlight lang="java">if (s == 'Hello World') {
foo();
foo();
} else if (s == 'Bye World') {
} else if (s == 'Bye World') {
Line 880: Line 1,077:
} else {
} else {
deusEx();
deusEx();
}</lang>
}</syntaxhighlight>
Java also supports [[wp:Short-circuit_evaluation|short-circuit evaluation]]. So in a conditional like this:
Java also supports [[wp:Short-circuit_evaluation|short-circuit evaluation]]. So in a conditional like this:
<lang java>if(obj != null && obj.foo()){
<syntaxhighlight lang="java">if(obj != null && obj.foo()){
aMethod();
aMethod();
}</lang>
}</syntaxhighlight>
<tt>obj.foo()</tt> will not be executed if <tt>obj != null</tt> returns false. It is possible to have conditionals without short circuit evaluation using the <tt>&</tt> and <tt>|</tt> operators (from [[Bitwise operations]]). So in this conditional:
<tt>obj.foo()</tt> will not be executed if <tt>obj != null</tt> returns false. It is possible to have conditionals without short circuit evaluation using the <tt>&</tt> and <tt>|</tt> operators (from [[Bitwise operations]]). So in this conditional:
<lang java>if(obj != null & obj.foo()){
<syntaxhighlight lang="java">if(obj != null & obj.foo()){
aMethod();
aMethod();
}</lang>
}</syntaxhighlight>
You will get a null pointer exception if obj is null.
You will get a null pointer exception if obj is null.
===ternary===
===ternary===


<lang java>s == 'Hello World' ? foo() : bar();</lang>
<syntaxhighlight lang="java">s == 'Hello World' ? foo() : bar();</syntaxhighlight>


===switch===
===switch===
Line 899: Line 1,096:
=={{header|AppleScript}}==
=={{header|AppleScript}}==
===if-then-else===
===if-then-else===
<lang applescript>if myVar is "ok" then return true
<syntaxhighlight lang="applescript">if myVar is "ok" then return true


set i to 0
set i to 0
Line 908: Line 1,105:
else
else
return "odd"
return "odd"
end if</lang>
end if</syntaxhighlight>


=={{header|ARM Assembly}}==
=={{header|ARM Assembly}}==
{{works with|as|Raspberry Pi}}
{{works with|as|Raspberry Pi}}
<syntaxhighlight lang="arm assembly">
<lang ARM Assembly>


/* ARM assembly Raspberry PI */
/* ARM assembly Raspberry PI */
Line 1,063: Line 1,260:
bx lr /* return */
bx lr /* return */


</syntaxhighlight>
</lang>


=={{header|Arturo}}==
=={{header|Arturo}}==
===if?-else===
===if?-else===


<lang rebol>num: 2
<syntaxhighlight lang="rebol">num: 2


if? num=2 [
if? num=2 [
Line 1,075: Line 1,272:
else [
else [
print "something went wrong..."
print "something went wrong..."
]</lang>
]</syntaxhighlight>


{{out}}
{{out}}
Line 1,083: Line 1,280:
===case-when?===
===case-when?===


<lang rebol>loop 1..5 'num [
<syntaxhighlight lang="rebol">loop 1..5 'num [
case [num]
case [num]
when? [<2] -> print [num ": it's less than 2"]
when? [<2] -> print [num ": it's less than 2"]
Line 1,090: Line 1,287:
else -> print [num ": the number is too big"]
else -> print [num ": the number is too big"]
]
]
</syntaxhighlight>
</lang>


{{out}}
{{out}}
Line 1,101: Line 1,298:


=={{header|Astro}}==
=={{header|Astro}}==
<lang python>if x == 0:
<syntaxhighlight lang="python">if x == 0:
foo()
foo()
elif x == 1:
elif x == 1:
Line 1,116: Line 1,313:
_ => qux()
_ => qux()


(a) ? b : c</lang>
(a) ? b : c</syntaxhighlight>


=={{header|AutoHotkey}}==
=={{header|AutoHotkey}}==


===if, else if, else===
===if, else if, else===
<syntaxhighlight lang="autohotkey">x = 1
<lang AutoHotkey>x = 1
If x
If x
MsgBox, x is %x%
MsgBox, x is %x%
Line 1,127: Line 1,324:
MsgBox, x is %x%
MsgBox, x is %x%
Else
Else
MsgBox, x is %x%</lang>
MsgBox, x is %x%</syntaxhighlight>


===ternary if===
===ternary if===
<syntaxhighlight lang="autohotkey">x = 2
<lang AutoHotkey>x = 2
y = 1
y = 1
var := x > y ? 2 : 3
var := x > y ? 2 : 3
MsgBox, % var</lang>
MsgBox, % var</syntaxhighlight>


===while (looping if)===
===while (looping if)===
<lang AutoHotkey>While (A_Index < 3) {
<syntaxhighlight lang="autohotkey">While (A_Index < 3) {
MsgBox, %A_Index% is less than 3
MsgBox, %A_Index% is less than 3
}</lang>
}</syntaxhighlight>


=={{header|AutoIt}}==
=={{header|AutoIt}}==
===If, ElseIf, Else===
===If, ElseIf, Else===
<lang AutoIt>If <expression> Then
<syntaxhighlight lang="autoit">If <expression> Then
statements
statements
...
...
Line 1,152: Line 1,349:
...
...
EndIf
EndIf
</syntaxhighlight>
</lang>
===Select Case===
===Select Case===
<lang AutoIt>Select
<syntaxhighlight lang="autoit">Select
Case <expression>
Case <expression>
statement1
statement1
Line 1,165: Line 1,362:
...]
...]
EndSelect
EndSelect
</syntaxhighlight>
</lang>
===Switch Case===
===Switch Case===
<lang AutoIt>Switch <expression>
<syntaxhighlight lang="autoit">Switch <expression>
Case <value> [To <value>] [,<value> [To <value>] ...]
Case <value> [To <value>] [,<value> [To <value>] ...]
statement1
statement1
Line 1,178: Line 1,375:
...]
...]
EndSwitch
EndSwitch
</syntaxhighlight>
</lang>
--[[User:BugFix|BugFix]] ([[User talk:BugFix|talk]]) 15:39, 13 November 2013 (UTC)
--[[User:BugFix|BugFix]] ([[User talk:BugFix|talk]]) 15:39, 13 November 2013 (UTC)


=={{header|Avail}}==
=={{header|Avail}}==
===If-Then-Else===
===If-Then-Else===
<lang Avail>If year = 1999 then [Print: "Party!";];
<syntaxhighlight lang="avail">If year = 1999 then [Print: "Party!";];


If someNumber > 5 then [Print: "Too high!";] else [Print: "Adequate amount.";];
If someNumber > 5 then [Print: "Too high!";] else [Print: "Adequate amount.";];
Line 1,191: Line 1,388:
else [score := 45;];
else [score := 45;];


Unless char = ¢X then [Print: "character was not an x";];</lang>
Unless char = ¢X then [Print: "character was not an x";];</syntaxhighlight>


===Ternary===
===Ternary===
The basic control structures in Avail can be used as expressions by using blocks with a return value. By tradition this distinction is noted by using a lowercase first character.
The basic control structures in Avail can be used as expressions by using blocks with a return value. By tradition this distinction is noted by using a lowercase first character.
<lang Avail>Print: if result = 13 then ["unlucky"] else ["safe"];</lang>
<syntaxhighlight lang="avail">Print: if result = 13 then ["unlucky"] else ["safe"];</syntaxhighlight>


=={{header|AWK}}==
=={{header|AWK}}==
Conditionals in awk are modelled after C:
Conditionals in awk are modelled after C:
<lang awk>if(i<0) i=0; else i=42</lang>
<syntaxhighlight lang="awk">if(i<0) i=0; else i=42</syntaxhighlight>
For a branch with more than a single statement, this needs braces:
For a branch with more than a single statement, this needs braces:
<lang awk>
<syntaxhighlight lang="awk">
if(i<0) {
if(i<0) {
i=0; j=1
i=0; j=1
} else {
} else {
i=42; j=2
i=42; j=2
}</lang>
}</syntaxhighlight>
There is also the ternary conditional:
There is also the ternary conditional:
<lang awk>i=(i<0? 0: 42)</lang>
<syntaxhighlight lang="awk">i=(i<0? 0: 42)</syntaxhighlight>


=={{header|Axe}}==
=={{header|Axe}}==
Line 1,215: Line 1,412:


===Simple===
===Simple===
<lang axe>If 1
<syntaxhighlight lang="axe">If 1
YEP()
YEP()
End</lang>
End</syntaxhighlight>


===Inverse If===
===Inverse If===
<lang axe>!If 1
<syntaxhighlight lang="axe">!If 1
NOPE()
NOPE()
End</lang>
End</syntaxhighlight>


===If-Else===
===If-Else===
<lang axe>If 1
<syntaxhighlight lang="axe">If 1
YEP()
YEP()
Else
Else
NOPE()
NOPE()
End</lang>
End</syntaxhighlight>


Axe has no support for switch-like statements. If-ElseIf-Else structures are required to achieve the same goal.
Axe has no support for switch-like statements. If-ElseIf-Else structures are required to achieve the same goal.


===If-ElseIf-Else===
===If-ElseIf-Else===
<lang axe>If 1=0
<syntaxhighlight lang="axe">If 1=0
NOPE()
NOPE()
ElseIf 1=1
ElseIf 1=1
Line 1,240: Line 1,437:
Else
Else
NOPE()
NOPE()
End</lang>
End</syntaxhighlight>


===If-InverseElseIf-Else===
===If-InverseElseIf-Else===
<lang axe>If 1=0
<syntaxhighlight lang="axe">If 1=0
NOPE()
NOPE()
Else!If 1=2
Else!If 1=2
Line 1,249: Line 1,446:
Else
Else
NOPE()
NOPE()
End</lang>
End</syntaxhighlight>


=={{header|Babel}}==
=={{header|Babel}}==
Line 1,255: Line 1,452:
===Simple select===
===Simple select===


<lang babel>
<syntaxhighlight lang="babel">
"foo" "bar" 3 4 > sel <<
"foo" "bar" 3 4 > sel <<
</syntaxhighlight>
</lang>


Prints "foo" since '3 4 >' evaluates to false, which causes sel to remove "bar" from the stack.
Prints "foo" since '3 4 >' evaluates to false, which causes sel to remove "bar" from the stack.
Line 1,263: Line 1,460:
===If-Then-Else===
===If-Then-Else===


<lang babel>
<syntaxhighlight lang="babel">
{3 4 >}
{3 4 >}
{"foo"}
{"foo"}
Line 1,269: Line 1,466:
ifte
ifte
<<
<<
</syntaxhighlight>
</lang>


Prints "bar" because the first line is the "if", the second line is the "then" and the last line is the "else", and '3 4 >' evaluates to false.
Prints "bar" because the first line is the "if", the second line is the "then" and the last line is the "else", and '3 4 >' evaluates to false.
Line 1,275: Line 1,472:
===Conditional===
===Conditional===


<lang babel>
<syntaxhighlight lang="babel">
({3 4 >} {"Three is greater than four" }
({3 4 >} {"Three is greater than four" }
{3 3 >} {"Three is greater than three"}
{3 3 >} {"Three is greater than three"}
Line 1,282: Line 1,479:
cond
cond
<<
<<
</syntaxhighlight>
</lang>


Prints "Three is greater than two", as expected.
Prints "Three is greater than two", as expected.
Line 1,292: Line 1,489:
BASIC can use the if statement to perform conditional operations:
BASIC can use the if statement to perform conditional operations:


<lang basic>10 LET A%=1: REM A HAS A VALUE OF TRUE
<syntaxhighlight lang="basic">10 LET A%=1: REM A HAS A VALUE OF TRUE
20 IF A% THEN PRINT "A IS TRUE"
20 IF A% THEN PRINT "A IS TRUE"
30 WE CAN OF COURSE USE EXPRESSIONS
30 WE CAN OF COURSE USE EXPRESSIONS
Line 1,298: Line 1,495:
50 IF NOT(A%) THEN PRINT "A IS FALSE"
50 IF NOT(A%) THEN PRINT "A IS FALSE"
60 REM SOME VERSIONS OF BASIC PROVIDE AN ELSE KEYWORD
60 REM SOME VERSIONS OF BASIC PROVIDE AN ELSE KEYWORD
70 IF A% THEN PRINT "A IS TRUE" ELSE PRINT "A IS FALSE"</lang>
70 IF A% THEN PRINT "A IS TRUE" ELSE PRINT "A IS FALSE"</syntaxhighlight>


Here are code snippets from a more modern variant that does not need line numbers:
Here are code snippets from a more modern variant that does not need line numbers:
Line 1,306: Line 1,503:
Single line IF does not require END IF
Single line IF does not require END IF


<lang qbasic>IF x = 0 THEN doSomething
<syntaxhighlight lang="qbasic">IF x = 0 THEN doSomething
IF x < 0 THEN doSomething ELSE doOtherThing</lang>
IF x < 0 THEN doSomething ELSE doOtherThing</syntaxhighlight>


Multi-line IF:
Multi-line IF:


<lang qbasic>IF x > 0 AND x < 10 THEN
<syntaxhighlight lang="qbasic">IF x > 0 AND x < 10 THEN
'do stuff
'do stuff
ELSE IF x = 0 THEN
ELSE IF x = 0 THEN
Line 1,317: Line 1,514:
ELSE
ELSE
'do more stuff
'do more stuff
END IF</lang>
END IF</syntaxhighlight>


Like in [[#C|C]], any non-zero value is interpreted as True:
Like in [[#C|C]], any non-zero value is interpreted as True:


<lang qbasic>IF aNumber THEN
<syntaxhighlight lang="qbasic">IF aNumber THEN
'the number is not 0
'the number is not 0
ELSE
ELSE
'the number is 0
'the number is 0
END IF</lang>
END IF</syntaxhighlight>


===select case===
===select case===
Line 1,332: Line 1,529:
The condition in each case branch can be one or more constants or variables, a range or an expression.
The condition in each case branch can be one or more constants or variables, a range or an expression.


<lang qbasic>SELECT CASE expression
<syntaxhighlight lang="qbasic">SELECT CASE expression
CASE 1
CASE 1
'do stuff
'do stuff
Line 1,343: Line 1,540:
CASE ELSE
CASE ELSE
'default case
'default case
END SELECT</lang>
END SELECT</syntaxhighlight>


===Computed ON-GOTO===
===Computed ON-GOTO===
Line 1,351: Line 1,548:
or:
or:


<lang basic>10 INPUT "Enter 1,2 or 3: ";v
<syntaxhighlight lang="basic">10 INPUT "Enter 1,2 or 3: ";v
20 GOTO v * 100
20 GOTO v * 100
99 STOP
99 STOP
Line 1,359: Line 1,556:
210 STOP
210 STOP
300 PRINT "Cherry"
300 PRINT "Cherry"
310 STOP</lang>
310 STOP</syntaxhighlight>


===Conditional loops===
===Conditional loops===
Line 1,365: Line 1,562:
Some variants of basic support conditional loops:
Some variants of basic support conditional loops:


<lang bbcbasic>10 REM while loop
<syntaxhighlight lang="bbcbasic">10 REM while loop
20 L=0
20 L=0
30 WHILE L<5
30 WHILE L<5
Line 1,376: Line 1,573:
100 PRINT L
100 PRINT L
110 L=L+1
110 L=L+1
120 UNTIL L>5</lang>
120 UNTIL L>5</syntaxhighlight>

==={{header|Applesoft BASIC}}===
Applesoft BASIC does not have ELSE, only the IF-THEN structure and computed ON-GOSUB and ON-GOTO
<syntaxhighlight lang="applesoftbasic"> 10 LET X = 1
20 IF X THEN PRINT "X IS TRUE"
30 IF NOT X THEN PRINT "X IS FALSE"
40 ON X GOSUB 100,200,300
50 ON X GOTO 300,200,100
100 PRINT "APPLE": RETURN
200 PRINT "BANANA": RETURN
300 PRINT "CHERRY"</syntaxhighlight>


=={{header|BASIC256}}==
=={{header|BASIC256}}==
Line 1,418: Line 1,626:
</pre>
</pre>
I think this test shows that nested if statements parse as they do in c.
I think this test shows that nested if statements parse as they do in c.
<syntaxhighlight lang="basic256">
<lang BASIC256>
for i = 0 to 1
for i = 0 to 1
for j = 0 to 1
for j = 0 to 1
Line 1,438: Line 1,646:
next j
next j
next i
next i
</syntaxhighlight>
</lang>


=={{header|Batch File}}==
=={{header|Batch File}}==
IF syntax:
IF syntax:
<lang dos>
<syntaxhighlight lang="dos">
IF [NOT] ERRORLEVEL number command
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] string1==string2 command
Line 1,457: Line 1,665:
GEQ - greater than or equal
GEQ - greater than or equal
/I case insensitive string compares
/I case insensitive string compares
</syntaxhighlight>
</lang>
The ELSE clause must be on the same line as the command after the IF.
The ELSE clause must be on the same line as the command after the IF.
For example:
For example:
<lang dos>
<syntaxhighlight lang="dos">
IF EXIST %filename% (
IF EXIST %filename% (
del %filename%
del %filename%
Line 1,466: Line 1,674:
echo %filename% not found
echo %filename% not found
)
)
</syntaxhighlight>
</lang>


=={{header|BBC BASIC}}==
=={{header|BBC BASIC}}==
<lang bbcbasic> REM Single-line IF ... THEN ... ELSE (ELSE clause is optional):
<syntaxhighlight lang="bbcbasic"> REM Single-line IF ... THEN ... ELSE (ELSE clause is optional):
IF condition% THEN statements ELSE statements
IF condition% THEN statements ELSE statements


Line 1,494: Line 1,702:


REM ON ... PROC (ELSE clause is optional):
REM ON ... PROC (ELSE clause is optional):
ON expression% PROCone, PROCtwo ... ELSE statements</lang>
ON expression% PROCone, PROCtwo ... ELSE statements</syntaxhighlight>


=={{header|beeswax}}==
=={{header|beeswax}}==
Line 1,501: Line 1,709:


The 4 conditional operators are:
The 4 conditional operators are:
<syntaxhighlight lang="beeswax">
<lang Beeswax>
' lstack top value == 0 ? skip next instruction : don’t skip next instruction.
' lstack top value == 0 ? skip next instruction : don’t skip next instruction.
" lstack top value > 0 ? skip next instruction : don’t skip next instruction.
" lstack top value > 0 ? skip next instruction : don’t skip next instruction.
K lstack top value == 2nd value ? skip next instruction : don’t skip next instruction.
K lstack top value == 2nd value ? skip next instruction : don’t skip next instruction.
L lstack top value > 2nd value ? skip next instruction : don’t skip next instruction.</lang>
L lstack top value > 2nd value ? skip next instruction : don’t skip next instruction.</syntaxhighlight>


Example:
Example:
<lang Beeswax>_`Enter integer n:`T'p`n = 0`>N`Enter integer m:`T'p`m = 0`>` and `Kp`m = n`;
<syntaxhighlight lang="beeswax">_`Enter integer n:`T'p`n = 0`>N`Enter integer m:`T'p`m = 0`>` and `Kp`m = n`;
>`n > 0`d >`m > 0`d >Lp`m > n`;
>`n > 0`d >`m > 0`d >Lp`m > n`;
>`m < n`;</lang>
>`m < n`;</syntaxhighlight>


Example output:
Example output:
<lang Beeswax>Enter integer n:
<syntaxhighlight lang="beeswax">Enter integer n:
i3
i3
n > 0
n > 0
Enter integer m:
Enter integer m:
i0
i0
m = 0 and m < n</lang>
m = 0 and m < n</syntaxhighlight>


=={{header|Befunge}}==
=={{header|Befunge}}==
Line 1,525: Line 1,733:
These snippets input a number and use the conditional operators to print a "0" if it is zero and an "X" otherwise.
These snippets input a number and use the conditional operators to print a "0" if it is zero and an "X" otherwise.


<lang befunge>v > "X",@ non-zero
<syntaxhighlight lang="befunge">v > "X",@ non-zero
> & |
> & |
> "0",@ zero</lang>
> "0",@ zero</syntaxhighlight>


'''#''' is the skip command.
'''#''' is the skip command.
It unconditionally skips one character, allowing a little flexibility in flow control.
It unconditionally skips one character, allowing a little flexibility in flow control.


<lang befunge>& #v_ "0",@ zero
<syntaxhighlight lang="befunge">& #v_ "0",@ zero
> "X",@ non-zero</lang>
> "X",@ non-zero</syntaxhighlight>

=={{header|Binary Lambda Calculus}}==

Lambda calculus has no conditional structures built in, but the standard representations of booleans can be seen to implement if-then-else: true = \then. \else. then, false = \then. \else. else, which correspond to BLC programs <code>00 00 110</code> and <code>00 00 10</code>.


=={{header|blz}}==
=={{header|blz}}==
===if-else===
===if-else===
<lang blz>
<syntaxhighlight lang="blz">
if i % 2 == 0
if i % 2 == 0
print("even")
print("even")
Line 1,543: Line 1,755:
print("odd")
print("odd")
end
end
</syntaxhighlight>
</lang>


=={{header|Bori}}==
=={{header|Bori}}==
===if-elif-else===
===if-elif-else===
<lang bori>
<syntaxhighlight lang="bori">
if (i == 0)
if (i == 0)
return "zero";
return "zero";
Line 1,554: Line 1,766:
else
else
return "even";
return "even";
</syntaxhighlight>
</lang>


=={{header|BQN}}==
=={{header|BQN}}==
The basic method of control flow in BQN is implemented using first-class functions and Choose (<code>◶</code>). Using Choose, we can implement some basic control structures:
The basic method of control flow in BQN is implemented using first-class functions and Choose (<code>◶</code>). Using Choose, we can implement some basic control structures:
<lang bqn>If ← {𝕏⍟𝕎@}´ # Also Repeat
<syntaxhighlight lang="bqn">If ← {𝕏⍟𝕎@}´ # Also Repeat
IfElse ← {c‿T‿F: c◶F‿T@}
IfElse ← {c‿T‿F: c◶F‿T@}
While ← {𝕩{𝔽⍟𝔾∘𝔽_𝕣_𝔾∘𝔽⍟𝔾𝕩}𝕨@}´ # While 1‿{... to run forever
While ← {𝕩{𝔽⍟𝔾∘𝔽_𝕣_𝔾∘𝔽⍟𝔾𝕩}𝕨@}´ # While 1‿{... to run forever
Line 1,568: Line 1,780:
Select ← {(⊑𝕩)◶(1↓𝕩)@}
Select ← {(⊑𝕩)◶(1↓𝕩)@}
Switch ← {c←⊑𝕩 ⋄ m‿a←<˘⍉∘‿2⥊1↓𝕩 ⋄ (⊑a⊐C)◶m@}
Switch ← {c←⊑𝕩 ⋄ m‿a←<˘⍉∘‿2⥊1↓𝕩 ⋄ (⊑a⊐C)◶m@}
Test ← {fn←{C‿A𝕊e:C◶A‿E}´𝕩⋄Fn@}</lang>
Test ← {fn←{C‿A𝕊e:C◶A‿E}´𝕩⋄Fn@}</syntaxhighlight>


The other method of branching is using function predicates, which can be used in any blocks for an if-else like conditional:
The other method of branching is using function predicates, which can be used in any blocks for an if-else like conditional:
<lang bqn>{
<syntaxhighlight lang="bqn">{
a<b ? a+↩1 ; # If
a<b ? a+↩1 ; # If
a<c ? c-↩1 ; # Else If
a<c ? c-↩1 ; # Else If
a-↩2 # Else
a-↩2 # Else
}</lang>
}</syntaxhighlight>


However, they act like any other block header, so the variables defined in each predicate segment do not exist in their else and else if condition. Block Headers in general provide a rudimentary form of control flow (checking for exact matches and wildcards), but these are much more constrained than a general conditional.
However, they act like any other block header, so the variables defined in each predicate segment do not exist in their else and else if condition. Block Headers in general provide a rudimentary form of control flow (checking for exact matches and wildcards), but these are much more constrained than a general conditional.
Line 1,591: Line 1,803:
The following expression writes "That's what I thought." to your screen and evaluates to the expression "Right".
The following expression writes "That's what I thought." to your screen and evaluates to the expression "Right".


<lang bracmat> 2+2:5
<syntaxhighlight lang="bracmat"> 2+2:5
& put$"Strange, must check that Bracmat interpreter."
& put$"Strange, must check that Bracmat interpreter."
& 0
& 0
| put$"That's what I thought."
| put$"That's what I thought."
& Right</lang>
& Right</syntaxhighlight>


=== switch-like branching ===
=== switch-like branching ===
Line 1,601: Line 1,813:
In the following example, the resulting expression is a single node containing "4".
In the following example, the resulting expression is a single node containing "4".


<lang bracmat> 2+2
<syntaxhighlight lang="bracmat"> 2+2
: ( (<3|>5)
: ( (<3|>5)
& put$"Not quite, must check that Bracmat interpreter."
& put$"Not quite, must check that Bracmat interpreter."
Line 1,609: Line 1,821:
& put$"That's what I thought."
& put$"That's what I thought."
)
)
</lang>
</syntaxhighlight>


=={{header|Brainf***}}==
=={{header|Brainf***}}==
Line 1,616: Line 1,828:
Thus in the following sequence:
Thus in the following sequence:


<lang bf>[.]</lang>
<syntaxhighlight lang="bf">[.]</syntaxhighlight>


The . instruction will be skipped, while the following sequence
The . instruction will be skipped, while the following sequence


<lang bf>+[.]</lang>
<syntaxhighlight lang="bf">+[.]</syntaxhighlight>


will result in an infinite loop. Finally, in the following sequence
will result in an infinite loop. Finally, in the following sequence


<lang bf>+[.-]</lang>
<syntaxhighlight lang="bf">+[.-]</syntaxhighlight>


The . instruction will be executed once.
The . instruction will be executed once.
Line 1,632: Line 1,844:
Using the ''Choose'' command:
Using the ''Choose'' command:


<lang burlesque>
<syntaxhighlight lang="burlesque">
blsq ) 9 2.%{"Odd""Even"}ch
blsq ) 9 2.%{"Odd""Even"}ch
"Odd"
"Odd"
</syntaxhighlight>
</lang>


Using the ''If'' command (produce next even number if odd):
Using the ''If'' command (produce next even number if odd):


<lang burlesque>
<syntaxhighlight lang="burlesque">
blsq ) 9^^2.%{+.}if
blsq ) 9^^2.%{+.}if
10
10
blsq ) 10^^2.%{+.}if
blsq ) 10^^2.%{+.}if
10
10
</syntaxhighlight>
</lang>


Using the ''IfThenElse'' command (produce next odd number if even or previous even number if odd):
Using the ''IfThenElse'' command (produce next odd number if even or previous even number if odd):


<lang burlesque>
<syntaxhighlight lang="burlesque">
blsq ) 10^^2.%{-.}\/{+.}\/ie
blsq ) 10^^2.%{-.}\/{+.}\/ie
11
11
blsq ) 9^^2.%{-.}\/{+.}\/ie
blsq ) 9^^2.%{-.}\/{+.}\/ie
8
8
</syntaxhighlight>
</lang>


Emulating Switch-Case behaviour:
Emulating Switch-Case behaviour:


<lang burlesque>
<syntaxhighlight lang="burlesque">
blsq ) {"Hate tomatos" "Like Bananas" "Hate Apples"}{"Tomato" "Banana" "Apple"}"Banana"Fi!!
blsq ) {"Hate tomatos" "Like Bananas" "Hate Apples"}{"Tomato" "Banana" "Apple"}"Banana"Fi!!
"Like Bananas"
"Like Bananas"
blsq ) {"Hate tomatos" "Like Bananas" "Hate Apples"}{"Tomato" "Banana" "Apple"}"Apple"Fi!!
blsq ) {"Hate tomatos" "Like Bananas" "Hate Apples"}{"Tomato" "Banana" "Apple"}"Apple"Fi!!
"Hate Apples"
"Hate Apples"
</syntaxhighlight>
</lang>


=={{header|C}}==
=={{header|C}}==
Line 1,671: Line 1,883:
===if-elseif-else===
===if-elseif-else===


<lang csharp>if (condition)
<syntaxhighlight lang="csharp">if (condition)
{
{
// Some Task
// Some Task
Line 1,687: Line 1,899:
{
{
// Some Task
// Some Task
}</lang>
}</syntaxhighlight>


===Ternary===
===Ternary===


<lang csharp>// if condition is true var will be set to 1, else 2.
<syntaxhighlight lang="csharp">// if condition is true var will be set to 1, else 2.
int var = condition ? 1 : 2;</lang>
int var = condition ? 1 : 2;</syntaxhighlight>


===switch===
===switch===


<lang csharp>switch (value)
<syntaxhighlight lang="csharp">switch (value)
{
{
case 1:
case 1:
Line 1,708: Line 1,920:
// Some task
// Some task
break;
break;
}</lang>
}</syntaxhighlight>


If fall through algorithms are required use the goto keyword.
If fall through algorithms are required use the goto keyword.


<lang csharp>switch (value)
<syntaxhighlight lang="csharp">switch (value)
{
{
case 1:
case 1:
Line 1,726: Line 1,938:
// Some task
// Some task
break;
break;
}</lang>
}</syntaxhighlight>


=={{header|C++}}==
=={{header|C++}}==
Line 1,741: Line 1,953:
Selecting a type depending on a compile time condition
Selecting a type depending on a compile time condition


<lang cpp>template<bool Condition, typename ThenType, typename Elsetype> struct ifthenelse;
<syntaxhighlight lang="cpp">template<bool Condition, typename ThenType, typename Elsetype> struct ifthenelse;


template<typename ThenType, typename ElseType> struct ifthenelse<true, ThenType, ElseType>
template<typename ThenType, typename ElseType> struct ifthenelse<true, ThenType, ElseType>
Line 1,757: Line 1,969:
long int, // in that case, we'll need a long int
long int, // in that case, we'll need a long int
int> // otherwise an int will do
int> // otherwise an int will do
::type myvar; // define variable myvar with that type</lang>
::type myvar; // define variable myvar with that type</syntaxhighlight>


=={{header|Clean}}==
=={{header|Clean}}==
Line 1,763: Line 1,975:
There are no ''then'' or ''else'' keyword in Clean.
There are no ''then'' or ''else'' keyword in Clean.
The second argument of <tt>if</tt> is the then-part, the third argument is the else-part.
The second argument of <tt>if</tt> is the then-part, the third argument is the else-part.
<lang clean>bool2int b = if b 1 0</lang>
<syntaxhighlight lang="clean">bool2int b = if b 1 0</syntaxhighlight>


===case-of===
===case-of===
<lang clean>case 6 * 7 of
<syntaxhighlight lang="clean">case 6 * 7 of
42 -> "Correct"
42 -> "Correct"
_ -> "Wrong" // default, matches anything</lang>
_ -> "Wrong" // default, matches anything</syntaxhighlight>


===function alternatives===
===function alternatives===
<lang clean>answer 42 = True
<syntaxhighlight lang="clean">answer 42 = True
answer _ = False</lang>
answer _ = False</syntaxhighlight>


===guards===
===guards===
<lang clean>answer x
<syntaxhighlight lang="clean">answer x
| x == 42 = True
| x == 42 = True
| otherwise = False
| otherwise = False
Line 1,782: Line 1,994:
n | n < 0 -> "Not even close"
n | n < 0 -> "Not even close"
42 -> "Correct"
42 -> "Correct"
// no default, could result in a run-time error</lang>
// no default, could result in a run-time error</syntaxhighlight>


=={{header|Clipper}}==
=={{header|Clipper}}==
'''if-elseif-else-endif'''
'''if-elseif-else-endif'''
<lang clipper>IF x == 1
<syntaxhighlight lang="clipper">IF x == 1
SomeFunc1()
SomeFunc1()
ELSEIF x == 2
ELSEIF x == 2
Line 1,792: Line 2,004:
ELSE
ELSE
SomeFunc()
SomeFunc()
ENDIF</lang>
ENDIF</syntaxhighlight>


'''do case'''
'''do case'''
<lang clipper>DO CASE
<syntaxhighlight lang="clipper">DO CASE
CASE x == 1
CASE x == 1
SomeFunc1()
SomeFunc1()
Line 1,802: Line 2,014:
OTHERWISE
OTHERWISE
SomeFunc()
SomeFunc()
ENDCASE</lang>
ENDCASE</syntaxhighlight>


=={{header|Clojure}}==
=={{header|Clojure}}==
===if-then-else===
===if-then-else===
<lang clojure>(if (= 1 1) :yes :no) ; returns :yes
<syntaxhighlight lang="clojure">(if (= 1 1) :yes :no) ; returns :yes


(if (= 1 2) :yes :no) ; returns :no
(if (= 1 2) :yes :no) ; returns :no


(if (= 1 2) :yes) ; returns nil</lang>
(if (= 1 2) :yes) ; returns nil</syntaxhighlight>


===when===
===when===
Similar to if, but body in an implicit do block allowing multiple statements.
Similar to if, but body in an implicit do block allowing multiple statements.
No facility for providing an else. <code>when</code> is defined as a macro.
No facility for providing an else. <code>when</code> is defined as a macro.
<lang clojure>(when x
<syntaxhighlight lang="clojure">(when x
(print "hello")
(print "hello")
(println " world")
(println " world")
5) ; when x is logical true, prints "hello world" and returns 5; otherwise does nothing, returns nil</lang>
5) ; when x is logical true, prints "hello world" and returns 5; otherwise does nothing, returns nil</syntaxhighlight>


===cond===
===cond===
The cond macro takes a series of test/result pairs, evaluating each test until one resolves to logical true, then evaluates its result.
The cond macro takes a series of test/result pairs, evaluating each test until one resolves to logical true, then evaluates its result.
Returns nil if none of the tests yield true.
Returns nil if none of the tests yield true.
<lang clojure>(cond
<syntaxhighlight lang="clojure">(cond
(= 1 2) :no) ; returns nil
(= 1 2) :no) ; returns nil


(cond
(cond
(= 1 2) :no
(= 1 2) :no
(= 1 1) :yes) ; returns :yes</lang>
(= 1 1) :yes) ; returns :yes</syntaxhighlight>
Since non-nil objects are logical true, by convention the keyword :else is used to yield a default result.
Since non-nil objects are logical true, by convention the keyword :else is used to yield a default result.
<lang clojure>(cond
<syntaxhighlight lang="clojure">(cond
(= 1 2) :no
(= 1 2) :no
:else :yes) ; returns :yes</lang>
:else :yes) ; returns :yes</syntaxhighlight>


===condp===
===condp===
Similar to cond, but useful when each test differs by only one variant.
Similar to cond, but useful when each test differs by only one variant.
<lang clojure>(condp < 3
<syntaxhighlight lang="clojure">(condp < 3
4 :a ; cond equivalent would be (< 4 3) :a
4 :a ; cond equivalent would be (< 4 3) :a
3 :b
3 :b
2 :c
2 :c
1 :d) ; returns :c</lang>
1 :d) ; returns :c</syntaxhighlight>
Optionally takes a final arg to be used as the default result if none of the tests match.
Optionally takes a final arg to be used as the default result if none of the tests match.
<lang clojure>(condp < 3
<syntaxhighlight lang="clojure">(condp < 3
4 :a
4 :a
3 :b
3 :b
:no-match) ; returns :no-match</lang>
:no-match) ; returns :no-match</syntaxhighlight>


===case===
===case===
{{Works with|Clojure|1.2}}
{{Works with|Clojure|1.2}}
<lang clojure>(case 2
<syntaxhighlight lang="clojure">(case 2
0 (println "0")
0 (println "0")
1 (println "1")
1 (println "1")
2 (println "2")) ; prints 2.</lang>
2 (println "2")) ; prints 2.</syntaxhighlight>


=={{header|CMake}}==
=={{header|CMake}}==
<lang cmake>set(num 5)
<syntaxhighlight lang="cmake">set(num 5)


if(num GREATER 100)
if(num GREATER 100)
Line 1,864: Line 2,076:
message("${num} is small.")
message("${num} is small.")
message("We might want a bigger number.")
message("We might want a bigger number.")
endif()</lang>
endif()</syntaxhighlight>


The if() and elseif() commands evaluate boolean expressions like ''num GREATER 100''; refer to [http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:if cmake --help-command if].
The if() and elseif() commands evaluate boolean expressions like ''num GREATER 100''; refer to [http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:if cmake --help-command if].
Line 1,871: Line 2,083:
=={{header|COBOL}}==
=={{header|COBOL}}==
===if-then-else===
===if-then-else===
<lang cobol>if condition-1
<syntaxhighlight lang="cobol">if condition-1
imperative-statement-1
imperative-statement-1
else
else
Line 1,889: Line 2,101:
imperative-statement-2
imperative-statement-2
end-if
end-if
end-if</lang>
end-if</syntaxhighlight>


===evaluate===
===evaluate===
<lang cobol>evaluate identifier-1
<syntaxhighlight lang="cobol">evaluate identifier-1
when 'good'
when 'good'
good-imperative-statement
good-imperative-statement
Line 1,924: Line 2,136:
when other
when other
default-imperative-statement
default-imperative-statement
end-evaluate</lang>
end-evaluate</syntaxhighlight>


=={{header|CoffeeScript}}==
=={{header|CoffeeScript}}==
Line 1,930: Line 2,142:
===if-then-else===
===if-then-else===


<lang coffeescript>
<syntaxhighlight lang="coffeescript">
if n == 1
if n == 1
console.log "one"
console.log "one"
Line 1,937: Line 2,149:
else
else
console.log "other"
console.log "other"
</syntaxhighlight>
</lang>


===switch===
===switch===


<lang coffeescript>n = 1
<syntaxhighlight lang="coffeescript">n = 1


switch n
switch n
Line 1,950: Line 2,162:
else
else
console.log "other"
console.log "other"
</syntaxhighlight>
</lang>


===ternary expressions===
===ternary expressions===
Line 1,956: Line 2,168:
CoffeeScript is very expression-oriented, so you can assign the "result" of an if-then to a variable.
CoffeeScript is very expression-oriented, so you can assign the "result" of an if-then to a variable.


<lang coffeescript>s = if condition then "yup" else "nope"
<syntaxhighlight lang="coffeescript">s = if condition then "yup" else "nope"


# alternate form
# alternate form
Line 1,962: Line 2,174:
if condition
if condition
then "yup"
then "yup"
else "nope"</lang>
else "nope"</syntaxhighlight>


=={{header|ColdFusion}}==
=={{header|ColdFusion}}==
===if-elseif-else===
===if-elseif-else===
'''Compiler:''' [[ColdFusion]] any version
'''Compiler:''' [[ColdFusion]] any version
<lang cfm><cfif x eq 3>
<syntaxhighlight lang="cfm"><cfif x eq 3>
do something
do something
<cfelseif x eq 4>
<cfelseif x eq 4>
Line 1,973: Line 2,185:
<cfelse>
<cfelse>
do something else
do something else
</cfif></lang>
</cfif></syntaxhighlight>


===switch===
===switch===
'''Compiler:''' [[ColdFusion]] any version
'''Compiler:''' [[ColdFusion]] any version
<lang cfm><cfswitch expression="#x#">
<syntaxhighlight lang="cfm"><cfswitch expression="#x#">
<cfcase value="1">
<cfcase value="1">
do something
do something
Line 1,987: Line 2,199:
do something
do something
</cfdefaultcase>
</cfdefaultcase>
</cfswitch></lang>
</cfswitch></syntaxhighlight>


=={{header|Comal}}==
=={{header|Comal}}==
===IF/THEN===
===IF/THEN===
<lang Comal>IF condition THEN PRINT "True"</lang>
<syntaxhighlight lang="comal">IF condition THEN PRINT "True"</syntaxhighlight>


===IF/THEN/ELSE===
===IF/THEN/ELSE===
<lang Comal>IF condition THEN
<syntaxhighlight lang="comal">IF condition THEN
PRINT "True"
PRINT "True"
ELSE
ELSE
PRINT "False"
PRINT "False"
ENDIF</lang>
ENDIF</syntaxhighlight>


===IF/THEN/ELIF/ELSE===
===IF/THEN/ELIF/ELSE===
<lang Comal>IF choice=1 THEN
<syntaxhighlight lang="comal">IF choice=1 THEN
PRINT "One"
PRINT "One"
ELIF choice=2 THEN
ELIF choice=2 THEN
PRINT "Two"
PRINT "Two"
ELSE
ELSE
Print "None of the above"</lang>
Print "None of the above"</syntaxhighlight>


===CASE/WHEN===
===CASE/WHEN===
<syntaxhighlight lang="comal">
<lang Comal>
CASE choice OF
CASE choice OF
WHEN 1
WHEN 1
Line 2,018: Line 2,230:
PRINT "Some other choice"
PRINT "Some other choice"
ENDCASE
ENDCASE
</syntaxhighlight>
</lang>


=={{header|Common Lisp}}==
=={{header|Common Lisp}}==
Line 2,029: Line 2,241:
Should the result be non-nil, it goes on to evaluate and returnm the results of the 'then' part, otherwise, when present, it evaluates and returns the result of the 'else' part. Should there be no 'else' part, it returns nil.
Should the result be non-nil, it goes on to evaluate and returnm the results of the 'then' part, otherwise, when present, it evaluates and returns the result of the 'else' part. Should there be no 'else' part, it returns nil.


<lang lisp>(if (= val 42)
<syntaxhighlight lang="lisp">(if (= val 42)
"That is the answer to life, the universe and everything"
"That is the answer to life, the universe and everything"
"Try again") ; the else clause here is optional</lang>
"Try again") ; the else clause here is optional</syntaxhighlight>


==== <code>when</code> and <code>unless</code> ====
==== <code>when</code> and <code>unless</code> ====
Line 2,042: Line 2,254:
The (cond ...) construct acts as both an if..elseif...elseif...else operator and a switch, returning the result of the form associated with the first non-nil predicate.
The (cond ...) construct acts as both an if..elseif...elseif...else operator and a switch, returning the result of the form associated with the first non-nil predicate.


<lang lisp>(cond ((= val 1) (print "no"))
<syntaxhighlight lang="lisp">(cond ((= val 1) (print "no"))
((and (> val 3) (< val 6)) (print "yes"))
((and (> val 3) (< val 6)) (print "yes"))
((> val 99) (print "too far"))
((> val 99) (print "too far"))
(T (print "no way, man!")))</lang>
(T (print "no way, man!")))</syntaxhighlight>


=={{header|Computer/zero Assembly}}==
=={{header|Computer/zero Assembly}}==
Line 2,054: Line 2,266:
===if-elseif-else===
===if-elseif-else===


<lang crack>if (condition)
<syntaxhighlight lang="crack">if (condition)
{
{
// Some Task
// Some Task
Line 2,070: Line 2,282:
{
{
// Some Task
// Some Task
}</lang>
}</syntaxhighlight>


===Ternary===
===Ternary===


<lang crack>
<syntaxhighlight lang="crack">
// if condition is true var will be set to 1, else false.
// if condition is true var will be set to 1, else false.
int var = condition ? 1 : 2;
int var = condition ? 1 : 2;
</syntaxhighlight>
</lang>
=={{header|Curto}}==
===si-sino===
<syntaxhighlight lang="curto">( condición ) si ( sentencias si verdadero ) entonces
( condición ) si ( sentencias si verdadero ) sino ( sentencias si falso ) entonces</syntaxhighlight>
ejemplo:
<syntaxhighlight lang="curto">
: menor-que-diez ( n -- )
10 < si
." Menor que 10"
sino
." Mayor o igual a 10"
entonces ;
</syntaxhighlight>


=={{header|D}}==
=={{header|D}}==
:''See [[Conditional Structures#C|C]], sans the preprocessor.''
:''See [[Conditional Structures#C|C]], sans the preprocessor.''


<lang d>void main() {
<syntaxhighlight lang="d">void main() {
enum int i = 5;
enum int i = 5;


Line 2,130: Line 2,355:
// default: // Forbidden in final switches.
// default: // Forbidden in final switches.
}
}
}</lang>
}</syntaxhighlight>


=={{header|Dao}}==
=={{header|Dao}}==
===If Elif Else===
===If Elif Else===
<lang java>a = 3
<syntaxhighlight lang="java">a = 3
if( a == 1 ){
if( a == 1 ){
io.writeln( 'a == 1' )
io.writeln( 'a == 1' )
Line 2,141: Line 2,366:
}else{
}else{
io.writeln( 'a is neither 1 nor 3' )
io.writeln( 'a is neither 1 nor 3' )
}</lang>
}</syntaxhighlight>


===Switch Case===
===Switch Case===
<lang java>a = 3
<syntaxhighlight lang="java">a = 3
switch( a ){
switch( a ){
case 0: io.writeln( 'case 0' )
case 0: io.writeln( 'case 0' )
Line 2,150: Line 2,375:
case 3, 4, 5: io.writeln( 'case 3,4,5' )
case 3, 4, 5: io.writeln( 'case 3,4,5' )
default: io.writeln( 'default' )
default: io.writeln( 'default' )
}</lang>
}</syntaxhighlight>


=={{header|Delphi}}==
=={{header|Delphi}}==
Line 2,158: Line 2,383:
=={{header|Deluge}}==
=={{header|Deluge}}==


<lang deluge>if (input.Field == "Hello World") {
<syntaxhighlight lang="deluge">if (input.Field == "Hello World") {
sVar = "good";
sVar = "good";
} else if (input.Field == "Bye World") {
} else if (input.Field == "Bye World") {
Line 2,164: Line 2,389:
} else {
} else {
sVar = "neutral";
sVar = "neutral";
}</lang>
}</syntaxhighlight>


=={{header|DM}}==
=={{header|DM}}==
===if-elseif-else===
===if-elseif-else===
<lang DM>if (condition)
<syntaxhighlight lang="dm">if (condition)
// Do thing, DM uses indentation for control flow.
// Do thing, DM uses indentation for control flow.


Line 2,179: Line 2,404:
else
else
// Do thing
// Do thing
</syntaxhighlight>
</lang>


===Ternary===
===Ternary===
<lang DM>// x will be 1 if condition is a true value, 2 otherwise.
<syntaxhighlight lang="dm">// x will be 1 if condition is a true value, 2 otherwise.
var/x = condition ? 1 : 2
var/x = condition ? 1 : 2
</syntaxhighlight>
</lang>


===Switch===
===Switch===
<lang DM>switch (value)
<syntaxhighlight lang="dm">switch (value)
if (0)
if (0)
// Do thing if zero
// Do thing if zero
Line 2,201: Line 2,426:
else
else
// Fallback if nothing was matched.
// Fallback if nothing was matched.
</syntaxhighlight>
</lang>


=={{header|Dragon}}==
=={{header|Dragon}}==
===if-then-else===
===if-then-else===
<lang dragon>if(a == b)
<syntaxhighlight lang="dragon">if(a == b)
{
{
add()
add()
Line 2,214: Line 2,439:
{
{
both()
both()
}</lang>
}</syntaxhighlight>


=={{header|DWScript}}==
=={{header|DWScript}}==
Line 2,221: Line 2,446:


=={{header|Déjà Vu}}==
=={{header|Déjà Vu}}==
<lang dejavu>if a:
<syntaxhighlight lang="dejavu">if a:
pass
pass
elseif b:
elseif b:
pass
pass
else: # c, maybe?
else: # c, maybe?
pass</lang>
pass</syntaxhighlight>


=={{header|E}}==
=={{header|E}}==
Line 2,232: Line 2,457:
===if-then-else===
===if-then-else===


<lang e>if (okay) {
<syntaxhighlight lang="e">if (okay) {
println("okay")
println("okay")
} else if (!okay) {
} else if (!okay) {
Line 2,238: Line 2,463:
} else {
} else {
println("not my day")
println("not my day")
}</lang>
}</syntaxhighlight>


The pick/2 message of booleans provides a value-based conditional:
The pick/2 message of booleans provides a value-based conditional:


<lang e>println(okay.pick("okay", "not okay"))</lang>
<syntaxhighlight lang="e">println(okay.pick("okay", "not okay"))</syntaxhighlight>


It can therefore be used to construct a Smalltalk-style conditional:
It can therefore be used to construct a Smalltalk-style conditional:


<lang e>okay.pick(fn {
<syntaxhighlight lang="e">okay.pick(fn {
println("okay")
println("okay")
}, fn {
}, fn {
println("not okay")
println("not okay")
})()</lang>
})()</syntaxhighlight>


All of the above conditionals are expressions and have a usable return value.
All of the above conditionals are expressions and have a usable return value.
Line 2,258: Line 2,483:
E's "switch" allows pattern matching.
E's "switch" allows pattern matching.


<lang e>def expression := ["+", [1, 2]]
<syntaxhighlight lang="e">def expression := ["+", [1, 2]]


def value := switch (expression) {
def value := switch (expression) {
Line 2,264: Line 2,489:
match [`*`, [a, b]] { a * b }
match [`*`, [a, b]] { a * b }
match [op, _] { throw(`unknown operator: $op`) }
match [op, _] { throw(`unknown operator: $op`) }
}</lang>
}</syntaxhighlight>


=={{header|EasyLang}}==
=={{header|EasyLang}}==
<syntaxhighlight>
<lang>i = random 10
i = randint 10
if i mod 2 = 0
if i mod 2 = 0
print i & " is divisible by 2"
print i & " is divisible by 2"
elif i mod 3 = 0
elif i mod 3 = 0
print i & " is divisible by 3"
print i & " is divisible by 3"
else
else
print i & " is not divisible by 2 or 3"
print i & " is not divisible by 2 or 3"
.
.</lang>
</syntaxhighlight>


=={{header|Efene}}==
=={{header|Efene}}==
Line 2,281: Line 2,508:
Since if and case do pattern matching, if an if or case expression don't match some of the patterns, the program will crash
Since if and case do pattern matching, if an if or case expression don't match some of the patterns, the program will crash


<lang efene>
<syntaxhighlight lang="efene">
show_if_with_parenthesis = fn (Num) {
show_if_with_parenthesis = fn (Num) {
if (Num == 1) {
if (Num == 1) {
Line 2,341: Line 2,568:
show_switch_with_parenthesis(random.uniform(3))
show_switch_with_parenthesis(random.uniform(3))
show_switch_without_parenthesis(random.uniform(3))
show_switch_without_parenthesis(random.uniform(3))
}</lang>
}</syntaxhighlight>


=={{header|Ela}}==
=={{header|Ela}}==
Line 2,347: Line 2,574:
===if-then-else===
===if-then-else===


<lang ela>if x < 0 then 0 else x</lang>
<syntaxhighlight lang="ela">if x < 0 then 0 else x</syntaxhighlight>


===Guards===
===Guards===


<lang ela>getX x | x < 0 = 0
<syntaxhighlight lang="ela">getX x | x < 0 = 0
| else = x</lang>
| else = x</syntaxhighlight>


===Pattern matching===
===Pattern matching===


<lang ela>force (x::xs) = x :: force xs
<syntaxhighlight lang="ela">force (x::xs) = x :: force xs
force [] = []</lang>
force [] = []</syntaxhighlight>


===match expression===
===match expression===


<lang ela>force lst = match lst with
<syntaxhighlight lang="ela">force lst = match lst with
x::xs = x :: force xs
x::xs = x :: force xs
[] = []</lang>
[] = []</syntaxhighlight>


=={{header|EMal}}==
<syntaxhighlight lang="emal">
int i = 19
^|if–then–else|^
if i > 18
writeLine("greater than 18")
else
writeLine("less or equal to 18")
end
^|else if|^
if i == 18 do writeLine("equal to 18")
else if i < 18 do writeLine("less than 18")
else do writeLine("greater than 18")
end
^|when expression: just like iif in Visual Basic|^
writeLine(when(i > 18, "greater than 18", "less or equal to 18"))
^|hash-based conditionals|^
Map dispatch = int%fun[
18 => <|writeLine("equal to 18"),
19 => <|writeLine("yeah, it's 19")]
if dispatch.has(i) do dispatch[i]() end
</syntaxhighlight>
{{out}}
<pre>
greater than 18
greater than 18
greater than 18
yeah, it's 19
</pre>


=={{header|Erlang}}==
=={{header|Erlang}}==
Line 2,378: Line 2,636:
case expressions take an expression and match it to a pattern with optional guards.
case expressions take an expression and match it to a pattern with optional guards.


<lang erlang>case X of
<syntaxhighlight lang="erlang">case X of
{N,M} when N > M -> M;
{N,M} when N > M -> M;
{N,M} when N < M -> N;
{N,M} when N < M -> N;
_ -> equal
_ -> equal
end.</lang>
end.</syntaxhighlight>


===if===
===if===
Line 2,389: Line 2,647:
Guards must evaluate to true or false so true is the catch-all clause.
Guards must evaluate to true or false so true is the catch-all clause.


<lang erlang>{N,M} = X,
<syntaxhighlight lang="erlang">{N,M} = X,
if
if
N > M -> M;
N > M -> M;
N < M -> N;
N < M -> N;
true -> equal
true -> equal
end.</lang>
end.</syntaxhighlight>


===Function Clauses===
===Function Clauses===
Line 2,400: Line 2,658:
Functions can have multiple clauses tested in order.
Functions can have multiple clauses tested in order.


<lang erlang>test({N,M}) when N > M -> M;
<syntaxhighlight lang="erlang">test({N,M}) when N > M -> M;
test({N,M}) when N < M -> N;
test({N,M}) when N < M -> N;
test(_) -> equal.</lang>
test(_) -> equal.</syntaxhighlight>


=={{header|F_Sharp|F#}}==
=={{header|F_Sharp|F#}}==
<lang fsharp>
<syntaxhighlight lang="fsharp">
printfn "%s" (if 3<2 then "3 is less than 2" else "3 is not less than 2")
printfn "%s" (if 3<2 then "3 is less than 2" else "3 is not less than 2")
</syntaxhighlight>
</lang>
{{out}}
{{out}}
<pre>
<pre>
Line 2,420: Line 2,678:
===?===
===?===
? is for when you don't need branching, but only need to select between two different values.
? is for when you don't need branching, but only need to select between two different values.
<lang factor>
<syntaxhighlight lang="factor">
t 1 2 ? ! returns 1
t 1 2 ? ! returns 1
</syntaxhighlight>
</lang>


===if===
===if===
<lang factor>t [ 1 ] [ 2 ] if ! returns 1</lang>
<syntaxhighlight lang="factor">t [ 1 ] [ 2 ] if ! returns 1</syntaxhighlight>


===cond===
===cond===
<lang factor>{ { [ t ] [ 1 ] } { [ f ] [ 2 ] } } cond ! returns 1</lang>
<syntaxhighlight lang="factor">{ { [ t ] [ 1 ] } { [ f ] [ 2 ] } } cond ! returns 1</syntaxhighlight>


===case===
===case===
<lang factor>t { { t [ 1 ] } { f [ 2 ] } } case ! returns 1</lang>
<syntaxhighlight lang="factor">t { { t [ 1 ] } { f [ 2 ] } } case ! returns 1</syntaxhighlight>


===when===
===when===
<lang factor>t [ "1" print ] when ! prints 1</lang>
<syntaxhighlight lang="factor">t [ "1" print ] when ! prints 1</syntaxhighlight>


===unless===
===unless===
<lang factor>f [ "1" print ] unless ! prints 1</lang>
<syntaxhighlight lang="factor">f [ "1" print ] unless ! prints 1</syntaxhighlight>


=={{header|FALSE}}==
=={{header|FALSE}}==
<lang false>condition[body]?</lang>
<syntaxhighlight lang="false">condition[body]?</syntaxhighlight>
Because there is no "else", you need to stash the condition if you want the same effect:
Because there is no "else", you need to stash the condition if you want the same effect:
<lang false>$[\true\]?~[false]?</lang>
<syntaxhighlight lang="false">$[\true\]?~[false]?</syntaxhighlight>
or
or
<lang false>$[%true0~]?~[false]?</lang>
<syntaxhighlight lang="false">$[%true0~]?~[false]?</syntaxhighlight>


=={{header|Fancy}}==
=={{header|Fancy}}==
Line 2,450: Line 2,708:


===if:then:===
===if:then:===
<lang fancy>if: (x < y) then: {
<syntaxhighlight lang="fancy">if: (x < y) then: {
"x < y!" println # will only execute this block if x < y
"x < y!" println # will only execute this block if x < y
}
}
</syntaxhighlight>
</lang>


===if:then:else::===
===if:then:else::===
<lang fancy>if: (x < y) then: {
<syntaxhighlight lang="fancy">if: (x < y) then: {
"x < y!" println # will only execute this block if x < y
"x < y!" println # will only execute this block if x < y
} else: {
} else: {
"x not < y!" println
"x not < y!" println
}
}
</syntaxhighlight>
</lang>




===if_true:===
===if_true:===
<lang fancy>x < y if_true: {
<syntaxhighlight lang="fancy">x < y if_true: {
"x < y!" println # will only execute this block if x < y
"x < y!" println # will only execute this block if x < y
}
}
</syntaxhighlight>
</lang>


===if_false: / if_nil:===
===if_false: / if_nil:===
<lang fancy>x < y if_false: {
<syntaxhighlight lang="fancy">x < y if_false: {
"x not < y!" println # will only execute this block if x >= y
"x not < y!" println # will only execute this block if x >= y
}
}
</syntaxhighlight>
</lang>


===if_true:else:===
===if_true:else:===
<lang fancy>x < y if_true: {
<syntaxhighlight lang="fancy">x < y if_true: {
"x < y!" println
"x < y!" println
} else: {
} else: {
"x >= y!" println
"x >= y!" println
}
}
</syntaxhighlight>
</lang>


===if_false:else:===
===if_false:else:===
<lang fancy>x < y if_false: {
<syntaxhighlight lang="fancy">x < y if_false: {
"x >= y!"
"x >= y!"
} else: {
} else: {
"x < y!" println
"x < y!" println
}
}
</syntaxhighlight>
</lang>


===if:===
===if:===
<lang fancy>{ "x < y!" println } if: (x < y) # analog, but postfix</lang>
<syntaxhighlight lang="fancy">{ "x < y!" println } if: (x < y) # analog, but postfix</syntaxhighlight>




===unless:===
===unless:===
<lang fancy>{ "x not < y!" } unless: (x < y) # same here</lang>
<syntaxhighlight lang="fancy">{ "x not < y!" } unless: (x < y) # same here</syntaxhighlight>


=={{header|Forth}}==
=={{header|Forth}}==
===IF-ELSE===
===IF-ELSE===
<lang forth>( condition ) IF ( true statements ) THEN
<syntaxhighlight lang="forth">( condition ) IF ( true statements ) THEN
( condition ) IF ( true statements ) ELSE ( false statements ) THEN</lang>
( condition ) IF ( true statements ) ELSE ( false statements ) THEN</syntaxhighlight>
example:
example:
<lang forth>10 < IF ." Less than 10" ELSE ." Greater than or equal to 10" THEN</lang>
<syntaxhighlight lang="forth">10 < IF ." Less than 10" ELSE ." Greater than or equal to 10" THEN</syntaxhighlight>


===CASE-OF===
===CASE-OF===
<lang forth>( n -- ) CASE
<syntaxhighlight lang="forth">( n -- ) CASE
( integer ) OF ( statements ) ENDOF
( integer ) OF ( statements ) ENDOF
( integer ) OF ( statements ) ENDOF
( integer ) OF ( statements ) ENDOF
( default instructions )
( default instructions )
ENDCASE</lang>
ENDCASE</syntaxhighlight>
example: a simple CASE selection
example: a simple CASE selection
<lang forth>: test-case ( n -- )
<syntaxhighlight lang="forth">: test-case ( n -- )
CASE
CASE
0 OF ." Zero!" ENDOF
0 OF ." Zero!" ENDOF
1 OF ." One!" ENDOF
1 OF ." One!" ENDOF
." Some other number!"
." Some other number!"
ENDCASE ;</lang>
ENDCASE ;</syntaxhighlight>


===Execution vector===
===Execution vector===
To obtain the efficiency of a C switch statement for enumerations, one needs to construct one's own execution vector.
To obtain the efficiency of a C switch statement for enumerations, one needs to construct one's own execution vector.
<lang forth>: switch
<syntaxhighlight lang="forth">: switch
CREATE ( default-xt [count-xts] count -- ) DUP , 0 DO , LOOP ,
CREATE ( default-xt [count-xts] count -- ) DUP , 0 DO , LOOP ,
DOES> ( u -- ) TUCK @ MIN 1+ CELLS + @ EXECUTE ;
DOES> ( u -- ) TUCK @ MIN 1+ CELLS + @ EXECUTE ;
Line 2,540: Line 2,798:


8 digit \ eight
8 digit \ eight
34 digit \ Out of range!</lang>
34 digit \ Out of range!</syntaxhighlight>
===Execution Vector 2===
===Execution Vector 2===
This method was used by the late Jim Kalihan and Dr. Julian Nobel
This method was used by the late Jim Kalihan and Dr. Julian Nobel
<lang Forth>: CASE: ( <name>) CREATE ;
<syntaxhighlight lang="forth">: CASE: ( <name>) CREATE ;


\ lookup execution token and compile
\ lookup execution token and compile
Line 2,558: Line 2,816:


\ Usage: 3 SELECT
\ Usage: 3 SELECT
</syntaxhighlight>
</LANG>


=={{header|Fortran}}==
=={{header|Fortran}}==
Line 2,564: Line 2,822:
===IF-THEN-ELSE===
===IF-THEN-ELSE===
ANSI FORTRAN 77 or later has an IF-THEN-ELSE structure:
ANSI FORTRAN 77 or later has an IF-THEN-ELSE structure:
<lang fortran>if ( a .gt. 20.0 ) then
<syntaxhighlight lang="fortran">if ( a .gt. 20.0 ) then
q = q + a**2
q = q + a**2
else if ( a .ge. 0.0 ) then
else if ( a .ge. 0.0 ) then
Line 2,570: Line 2,828:
else
else
q = q - a
q = q - a
end if</lang>
end if</syntaxhighlight>


===SELECT-CASE===
===SELECT-CASE===
ISO Fortran 90 or later has a SELECT-CASE structure:
ISO Fortran 90 or later has a SELECT-CASE structure:
<lang fortran>select case (i)
<syntaxhighlight lang="fortran">select case (i)
case (21:) ! matches all integers greater than 20
case (21:) ! matches all integers greater than 20
q = q + i**2
q = q + i**2
Line 2,581: Line 2,839:
case default ! matches all other integers (negative in this particular case)
case default ! matches all other integers (negative in this particular case)
q = q - I
q = q - I
end select</lang>
end select</syntaxhighlight>


===WHERE-ELSEWHERE===
===WHERE-ELSEWHERE===
ISO Fortran 90 and later has a concurrent, array-expression-based WHERE-ELSEWHERE structure. The logical expressions in WHERE and ELSEWHERE clauses must be array-values. All statements inside the structure blocks must be array-valued. Furthermore, all array-valued expressions and statements must have the same "shape". That is, they must have the same number of dimensions, and each expression/statement must have the same sizes in corresponding dimensions as each other expression/statement. For each block, wherever the logical expression is true, the corresponding elements of the array expressions/statements are evaluated/executed.
ISO Fortran 90 and later has a concurrent, array-expression-based WHERE-ELSEWHERE structure. The logical expressions in WHERE and ELSEWHERE clauses must be array-values. All statements inside the structure blocks must be array-valued. Furthermore, all array-valued expressions and statements must have the same "shape". That is, they must have the same number of dimensions, and each expression/statement must have the same sizes in corresponding dimensions as each other expression/statement. For each block, wherever the logical expression is true, the corresponding elements of the array expressions/statements are evaluated/executed.
<lang fortran>! diffusion grid time step
<syntaxhighlight lang="fortran">! diffusion grid time step
where (edge_type(1:n,1:m) == center)
where (edge_type(1:n,1:m) == center)
anew(1:n,1:m) = (a(1:n,1:m) + a(0:n-1,1:m) + a(2:n+1,1:m) + a(1:n,0:m-1) + a(1:n,2:m+1)) / 5
anew(1:n,1:m) = (a(1:n,1:m) + a(0:n-1,1:m) + a(2:n+1,1:m) + a(1:n,0:m-1) + a(1:n,2:m+1)) / 5
Line 2,615: Line 2,873:
elsewhere ! sink/source, does not change
elsewhere ! sink/source, does not change
anew(1:n,1:m) = a(1:n,1:m)
anew(1:n,1:m) = a(1:n,1:m)
end where</lang>
end where</syntaxhighlight>


=={{header|FreeBASIC}}==
=={{header|FreeBASIC}}==
===IF-ELSEIF-ELSE-END IF===
===IF-ELSEIF-ELSE-END IF===
<lang freebasic>Dim a As Integer = 1
<syntaxhighlight lang="freebasic">Dim a As Integer = 1
If a = 1 Then
If a = 1 Then
sub1
sub1
Line 2,626: Line 2,884:
Else
Else
sub3
sub3
End If</lang>
End If</syntaxhighlight>


===SELECT-CASE===
===SELECT-CASE===
<lang freebasic>Dim a As Integer = 1
<syntaxhighlight lang="freebasic">Dim a As Integer = 1
Select Case a
Select Case a
Case 1
Case 1
Line 2,637: Line 2,895:
Case Else
Case Else
sub3
sub3
End Select</lang>
End Select</syntaxhighlight>


===IFF===
===IFF===
<lang freebasic>Dim b As Boolean = True
<syntaxhighlight lang="freebasic">Dim b As Boolean = True
Dim i As Integer = IIf(b, 1, 2)</lang>
Dim i As Integer = IIf(b, 1, 2)</syntaxhighlight>


===ON-GOTO===
===ON-GOTO===
<lang freebasic>Dim a As Integer = 1
<syntaxhighlight lang="freebasic">Dim a As Integer = 1
On a Goto label1, label2</lang>
On a Goto label1, label2</syntaxhighlight>


===IF-GOTO (deprecated)===
===IF-GOTO (deprecated)===
<lang freebasic>Dim b As Boolean = True
<syntaxhighlight lang="freebasic">Dim b As Boolean = True
If b Goto label</lang>
If b Goto label</syntaxhighlight>


===ON-GOSUB (legacy dialects only)===
===ON-GOSUB (legacy dialects only)===
<lang freebasic>Dim a As Integer = 1
<syntaxhighlight lang="freebasic">Dim a As Integer = 1
On a Gosub label1, label2</lang>
On a Gosub label1, label2</syntaxhighlight>


===#IF-#ELSEIF-#ELSE-#ENDIF (preprocessor)===
===#IF-#ELSEIF-#ELSE-#ENDIF (preprocessor)===
<lang freebasic>#DEFINE WORDSIZE 16
<syntaxhighlight lang="freebasic">#DEFINE WORDSIZE 16
#IF (WORDSIZE = 16)
#IF (WORDSIZE = 16)
' Do some some 16 bit stuff
' Do some some 16 bit stuff
Line 2,663: Line 2,921:
#ELSE
#ELSE
#ERROR WORDSIZE must be set to 16 or 32
#ERROR WORDSIZE must be set to 16 or 32
#ENDIF</lang>
#ENDIF</syntaxhighlight>


===#IFDEF (preprocessor)===
===#IFDEF (preprocessor)===
<lang freebasic>#DEFINE _DEBUG
<syntaxhighlight lang="freebasic">#DEFINE _DEBUG
#IFDEF _DEBUG
#IFDEF _DEBUG
' Special statements for debugging
' Special statements for debugging
#ENDIF</lang>
#ENDIF</syntaxhighlight>


===#IFNDEF (preprocessor)===
===#IFNDEF (preprocessor)===
<lang freebasic>#IFNDEF _DEBUG
<syntaxhighlight lang="freebasic">#IFNDEF _DEBUG
#DEFINE _DEBUG
#DEFINE _DEBUG
#ENDIF</lang>
#ENDIF</syntaxhighlight>


=={{header|friendly interactive shell}}==
=={{header|friendly interactive shell}}==
===if-then-else===
===if-then-else===
<lang fishshell>set var 'Hello World'
<syntaxhighlight lang="fishshell">set var 'Hello World'
if test $var = 'Hello World'
if test $var = 'Hello World'
echo 'Welcome.'
echo 'Welcome.'
Line 2,685: Line 2,943:
else
else
echo 'Huh?'
echo 'Huh?'
end</lang>
end</syntaxhighlight>


===switch===
===switch===
case statements take wildcards as arguments, but because of syntax quirk, they have to be quoted (just like in Powershell), otherwise they would match files in current directory. Unlike switch statements in C, they don't fall through. To match something that would be matched if nothing was matches use wildcard that matches everything, the language doesn't have default statement.
case statements take wildcards as arguments, but because of syntax quirk, they have to be quoted (just like in Powershell), otherwise they would match files in current directory. Unlike switch statements in C, they don't fall through. To match something that would be matched if nothing was matches use wildcard that matches everything, the language doesn't have default statement.
<lang fishshell>switch actually
<syntaxhighlight lang="fishshell">switch actually
case az
case az
echo The word is "az".
echo The word is "az".
Line 2,700: Line 2,958:
case '*'
case '*'
echo Neither begins with a or ends with z.
echo Neither begins with a or ends with z.
end</lang>
end</syntaxhighlight>


=={{header|Futhark}}==
=={{header|Futhark}}==
Line 2,707: Line 2,965:
Futhark supports branching with a syntax common to most functional languages.
Futhark supports branching with a syntax common to most functional languages.


<lang futhark>
<syntaxhighlight lang="futhark">
if <condition> then <truebranch> else <falsebranch>
if <condition> then <truebranch> else <falsebranch>
</syntaxhighlight>
</lang>


=={{header|FutureBasic}}==
FB supports conditionals similar to those in C and many other languages.
<syntaxhighlight lang="futurebasic">
local fn DoIt
long A = 7
if A > 0 then print "A is a positive number" else print "A is a negative number"
long B = -10
if B > 0
print "B is a positive number"
else
print "B is a negative number"
end if
long C = 99
select (C)
case C < 0
print "C is a negative number"
case C = 0
print "C is zero"
case C > 0
print "C is a positive number"
case else
print "C is unknown"
end select
CFStringRef suitName, suitSymbol
suitSymbol = @"S"
select (suitSymbol)
case @"C": suitName = @"Clubs"
case @"D": suitName = @"Diamonds"
case @"H": suitName = @"Hearts"
case @"S": suitName = @"Spades"
case else : suitName = @"Unknown"
end select
print suitName
end fn

fn Doit

HandleEvents
</syntaxhighlight>


=={{header|GAP}}==
=={{header|GAP}}==
=== if-then-else ===
=== if-then-else ===
<lang gap>if <condition> then
<syntaxhighlight lang="gap">if <condition> then
<statements>
<statements>
elif <condition> then
elif <condition> then
Line 2,719: Line 3,021:
else
else
<statements>
<statements>
fi;</lang>
fi;</syntaxhighlight>



=={{header|Go}}==
=={{header|Go}}==
Line 2,725: Line 3,028:
===If===
===If===
Simplest usage is,
Simplest usage is,
<lang go>if booleanExpression {
<syntaxhighlight lang="go">if booleanExpression {
statements
statements
}</lang>
}</syntaxhighlight>
The braces are required, even around a single statement.
The braces are required, even around a single statement.
<lang go>if booleanExpression {
<syntaxhighlight lang="go">if booleanExpression {
statements
statements
} else {
} else {
other
other
statements
statements
}</lang>
}</syntaxhighlight>
Braces are required around else clauses, as above, unless the statement of the else clause is another if statement. In this case the statements are chained like this,
Braces are required around else clauses, as above, unless the statement of the else clause is another if statement. In this case the statements are chained like this,
<lang go>if booleanExpression1 {
<syntaxhighlight lang="go">if booleanExpression1 {
statements
statements
} else if booleanExpression2 {
} else if booleanExpression2 {
otherStatements
otherStatements
}
}
</syntaxhighlight>
</lang>
If allows a statement to be included ahead of the condition. This is commonly a short variable declaration, as in,
If allows a statement to be included ahead of the condition. This is commonly a short variable declaration, as in,
<lang go>if x := fetchSomething(); x > 0 {
<syntaxhighlight lang="go">if x := fetchSomething(); x > 0 {
DoPos(x)
DoPos(x)
} else {
} else {
DoNeg(x)
DoNeg(x)
}</lang>
}</syntaxhighlight>
In this case the scope of x is limited to if statement.
In this case the scope of x is limited to if statement.


===Switch===
===Switch===
Simple usage is,
Simple usage is,
<lang go>switch {
<syntaxhighlight lang="go">switch {
case booleanExpression1:
case booleanExpression1:
statements
statements
Line 2,762: Line 3,065:
resort
resort
statements
statements
}</lang>
}</syntaxhighlight>
Because switch can work with any number of arbitrary boolean expressions, it replaces if/elseif chains often found in other programming languages.
Because switch can work with any number of arbitrary boolean expressions, it replaces if/elseif chains often found in other programming languages.


Switch can also switch on the value of an expression, as in,
Switch can also switch on the value of an expression, as in,
<lang go>switch expressionOfAnyType {
<syntaxhighlight lang="go">switch expressionOfAnyType {
case value1:
case value1:
statements
statements
Line 2,772: Line 3,075:
other
other
statements
statements
}</lang>
}</syntaxhighlight>
As shown, multiple values can be listed for a single case clause.
As shown, multiple values can be listed for a single case clause.
Since go is statically typed, the types of value1, 2, 3, and 4 must match the type of the expression.
Since go is statically typed, the types of value1, 2, 3, and 4 must match the type of the expression.


As with if, a local statement such as a short variable declaration can precede the expression. If there is no expression, the statement is still marked by a semicolon:
As with if, a local statement such as a short variable declaration can precede the expression. If there is no expression, the statement is still marked by a semicolon:
<lang go>switch x := fetch(); {
<syntaxhighlight lang="go">switch x := fetch(); {
case x == "cheese":
case x == "cheese":
statements
statements
Line 2,783: Line 3,086:
other
other
statements
statements
}</lang>
}</syntaxhighlight>
Also, as with if, the scope of x is limited to the switch statement.
Also, as with if, the scope of x is limited to the switch statement.


Line 2,789: Line 3,092:


An interesting example:
An interesting example:
<lang go>switch {
<syntaxhighlight lang="go">switch {
case booleanExpression1:
case booleanExpression1:
default:
default:
Line 2,798: Line 3,101:
other
other
statements
statements
}</lang>
}</syntaxhighlight>
Case expressions are evaluated in order, then if none are true, the default clause is executed.
Case expressions are evaluated in order, then if none are true, the default clause is executed.


Another statement that interacts with switch is break. It breaks from the switch statement and so will not break from a surrounding for statement. The following example prints "I want out!" endlessly.
Another statement that interacts with switch is break. It breaks from the switch statement and so will not break from a surrounding for statement. The following example prints "I want out!" endlessly.
<lang go>for {
<syntaxhighlight lang="go">for {
switch {
switch {
case true:
case true:
Line 2,808: Line 3,111:
}
}
fmt.Println("I want out!")
fmt.Println("I want out!")
}</lang>
}</syntaxhighlight>
Labels provide the desired capability. The following prints "I'm off!"
Labels provide the desired capability. The following prints "I'm off!"
<lang go>treadmill: for {
<syntaxhighlight lang="go">treadmill: for {
switch {
switch {
case true:
case true:
Line 2,816: Line 3,119:
}
}
}
}
fmt.Println("I'm off!")</lang>
fmt.Println("I'm off!")</syntaxhighlight>

=={{header|Grain}}==
===If statements===
In Grain, if statements are expressions, meaning they can be used for variable assignments.
If they are used as an expression, the return value must be of the same type, meaning an else clause is always required.
If an if statement has nothing returned as the body (the body is of the Void type), the else clause can be omitted.
<syntaxhighlight lang="grain">
let x = if (1 < 2) {
":)"
} else { // The else clause is required here as x is a string
":("
}

if (2 > 3) {
print("This should never execute.")
} // We can omit the else clause here

// We use else if for chaining
if (1 > 2) {
print("1 is less than 2")
} else if (2 == 3) {
print("2 is 3")
} else {
print("This should always execute.")
}
</syntaxhighlight>

===Pattern matching===
Pattern matching in Grain is like a switch-statement with superpowers. Each case of a match defines the pattern that the data could fall into.
<syntaxhighlight lang="grain">
// A match statement more like the traditional switch statement
// often seen in other languages.
enum PizzaTopping { Cheese, Pepperoni, Peppers, Pineapple }

let topping = Peppers

match (topping) {
Cheese => print("Would it really be pizza without it?"),
Pepperoni => print("An instant classic."),
Peppers => {
// We can use a block for more expressions.
print("For those who like to spice things up.")
},
Pineapple => print("You do you.")
}
</syntaxhighlight>
As well as a traditional switch statement, we can match on the shape of the data.
If we keep with the pizza theme, this looks a bit like this.
<syntaxhighlight lang="grain">
enum Topping { Cheese, Pepperoni, Peppers, Pineapple }
enum Menu { Pizza(Topping), Calzone(Topping) }

let item = Calzone(Peppers)

match (item) {
Calzone(topping) => {
if (checkSpecials(topping)) {
print("These are half off this week.")
} else {
print("No current specials.")
}
},
_ => print("No current specials.")
}
</syntaxhighlight>


=={{header|Harbour}}==
=={{header|Harbour}}==
'''if-elseif-else-endif'''
'''if-elseif-else-endif'''
<lang visualfoxpro>IF x == 1
<syntaxhighlight lang="visualfoxpro">IF x == 1
SomeFunc1()
SomeFunc1()
ELSEIF x == 2
ELSEIF x == 2
Line 2,826: Line 3,194:
ELSE
ELSE
SomeFunc()
SomeFunc()
ENDIF</lang>
ENDIF</syntaxhighlight>


'''do case'''
'''do case'''
<lang visualfoxpro>DO CASE
<syntaxhighlight lang="visualfoxpro">DO CASE
CASE x == 1
CASE x == 1
SomeFunc1()
SomeFunc1()
Line 2,836: Line 3,204:
OTHERWISE
OTHERWISE
SomeFunc()
SomeFunc()
ENDCASE</lang>
ENDCASE</syntaxhighlight>


'''switch'''
'''switch'''
While '''if-elseif-else-endif''' and '''do case''' constructions allows using of any expressions as conditions, the '''switch''' allows literals only in conditional '''case''' statements. The advantage of the '''switch''' command is that it is much faster.
While '''if-elseif-else-endif''' and '''do case''' constructions allows using of any expressions as conditions, the '''switch''' allows literals only in conditional '''case''' statements. The advantage of the '''switch''' command is that it is much faster.
<lang visualfoxpro>SWITCH x
<syntaxhighlight lang="visualfoxpro">SWITCH x
CASE 1
CASE 1
SomeFunc1()
SomeFunc1()
Line 2,849: Line 3,217:
OTHERWISE
OTHERWISE
SomeFunc()
SomeFunc()
ENDSWITCH</lang>
ENDSWITCH</syntaxhighlight>


=={{header|Haskell}}==
=={{header|Haskell}}==


===if-then-else===
===if-then-else===
<lang haskell>fac x = if x==0 then
<syntaxhighlight lang="haskell">fac x = if x==0 then
1
1
else x * fac (x - 1)</lang>
else x * fac (x - 1)</syntaxhighlight>


===Guards===
===Guards===
<lang haskell>fac x | x==0 = 1
<syntaxhighlight lang="haskell">fac x | x==0 = 1
| x>0 = x * fac (x-1)</lang>
| x>0 = x * fac (x-1)</syntaxhighlight>
===Pattern matching===
===Pattern matching===
<lang haskell>fac 0 = 1
<syntaxhighlight lang="haskell">fac 0 = 1
fac x = x * fac (x-1)</lang>
fac x = x * fac (x-1)</syntaxhighlight>
===case statement===
===case statement===
<lang haskell>fac x = case x of 0 -> 1
<syntaxhighlight lang="haskell">fac x = case x of 0 -> 1
_ -> x * fac (x-1)</lang>
_ -> x * fac (x-1)</syntaxhighlight>


=={{header|HicEst}}==
=={{header|HicEst}}==
<lang hicest>IF( a > 5 ) WRITE(Messagebox) a ! single line IF
<syntaxhighlight lang="hicest">IF( a > 5 ) WRITE(Messagebox) a ! single line IF


IF( a >= b ) THEN
IF( a >= b ) THEN
Line 2,879: Line 3,247:
ELSE
ELSE
WRITE(StatusBar) a, b, some_string
WRITE(StatusBar) a, b, some_string
ENDIF</lang>
ENDIF</syntaxhighlight>


=={{header|HPPPL}}==
=={{header|HPPPL}}==
=== IF ===
=== IF ===
Note that X has to be a number; else a runtime error occurs.
Note that X has to be a number; else a runtime error occurs.
<lang HPPPL>IF X THEN
<syntaxhighlight lang="hpppl">IF X THEN
// do if X is not 0
// do if X is not 0
ELSE
ELSE
// do if X is 0
// do if X is 0
END;</lang>
END;</syntaxhighlight>
=== CASE ===
=== CASE ===
<lang HPPPL>CASE
<syntaxhighlight lang="hpppl">CASE
IF X == 1 THEN
IF X == 1 THEN
// do stuff if X equals 1
// do stuff if X equals 1
Line 2,902: Line 3,270:
DEFAULT
DEFAULT
// do other stuff
// do other stuff
END;</lang>
END;</syntaxhighlight>


=={{header|i}}==
=={{header|i}}==
<lang i>//'i' supports if, else, and else if
<syntaxhighlight lang="i">//'i' supports if, else, and else if
software {
software {
a = 3
a = 3
Line 2,916: Line 3,284:
print("a = ", a)
print("a = ", a)
end
end
}</lang>
}</syntaxhighlight>


=={{header|Icon}} and {{header|Unicon}}==
=={{header|Icon}} and {{header|Unicon}}==
Line 2,922: Line 3,290:
===if-then-else===
===if-then-else===
The control structure evaluates expr1 if expr0 succeeds and expr2 if it fails.
The control structure evaluates expr1 if expr0 succeeds and expr2 if it fails.
<lang Icon>if expr0 then
<syntaxhighlight lang="icon">if expr0 then
expr1
expr1
else
else
expr2</lang>
expr2</syntaxhighlight>
===case-of===
===case-of===
The first successful selection expression will select and evaluate the specific case.
The first successful selection expression will select and evaluate the specific case.
<lang Icon>case expr0 of {
<syntaxhighlight lang="icon">case expr0 of {
expr1 : expr2
expr1 : expr2
expr3 : expr4
expr3 : expr4
default: expr5
default: expr5
}</lang>
}</syntaxhighlight>
Note that expr1 and expr3 are expressions and not constants and it is possible to write expressions such as:
Note that expr1 and expr3 are expressions and not constants and it is possible to write expressions such as:
<lang Icon>case x of {
<syntaxhighlight lang="icon">case x of {
f(x) | g(x) : expr2
f(x) | g(x) : expr2
s(x) & t(x) : expr4
s(x) & t(x) : expr4
default: expr5
default: expr5
}</lang>
}</syntaxhighlight>
===Compound expressions (blocks)===
===Compound expressions (blocks)===
In the examples below, multiple expressions can be grouped as in:
In the examples below, multiple expressions can be grouped as in:
<syntaxhighlight lang="icon">{
<lang Icon>{
expr1
expr1
expr2
expr2
expr3
expr3
}</lang>
}</syntaxhighlight>
Which is equivalent to this:
Which is equivalent to this:
<lang Icon>{expr1; expr2; expr3}</lang>
<syntaxhighlight lang="icon">{expr1; expr2; expr3}</syntaxhighlight>
For example the following, which will write 4, looks strange but is valid:
For example the following, which will write 4, looks strange but is valid:
<lang Icon>write({1;2;3;4})</lang>
<syntaxhighlight lang="icon">write({1;2;3;4})</syntaxhighlight>
The value of a compound expression is the value of the last expression in the block.
The value of a compound expression is the value of the last expression in the block.
===Alternation===
===Alternation===
Alternation of expressions yields a value for the first succeeding expression.
Alternation of expressions yields a value for the first succeeding expression.
<lang Icon> expr1 | expr2 | expr3</lang>
<syntaxhighlight lang="icon"> expr1 | expr2 | expr3</syntaxhighlight>
===Conjunction===
===Conjunction===
Conjunctions yeild the value of the final expression provided all the previous expressions succeed.
Conjunctions yeild the value of the final expression provided all the previous expressions succeed.
<lang Icon> expr1 & expr2 & expr3</lang>
<syntaxhighlight lang="icon"> expr1 & expr2 & expr3</syntaxhighlight>
Alternately, conjunction can be written thus:
Alternately, conjunction can be written thus:
<lang Icon> (expr1, expr2, expr3)</lang>
<syntaxhighlight lang="icon"> (expr1, expr2, expr3)</syntaxhighlight>
===Conjunction, yielding a different result===
===Conjunction, yielding a different result===
The alternate form of conjunction can be modified to produce a different result (other than the last)
The alternate form of conjunction can be modified to produce a different result (other than the last)
<lang Icon> expr0(expr1, expr2, expr3)</lang>
<syntaxhighlight lang="icon"> expr0(expr1, expr2, expr3)</syntaxhighlight>
For example:
For example:
<lang Icon> 2(expr1, expr2, expr3)</lang>
<syntaxhighlight lang="icon"> 2(expr1, expr2, expr3)</syntaxhighlight>
Yields the value of expr2 if all of the expressions succeed.
Yields the value of expr2 if all of the expressions succeed.
<br>A more complicated example showing non-constant expressions:
<br>A more complicated example showing non-constant expressions:
<lang Icon> f(expr1)(g(expr2)(expr3,expr4,expr5))</lang>
<syntaxhighlight lang="icon"> f(expr1)(g(expr2)(expr3,expr4,expr5))</syntaxhighlight>
Note: if expr0 yields a value of type 'procedure' or 'string' the appropriate procedure (or operator) is invoked.
Note: if expr0 yields a value of type 'procedure' or 'string' the appropriate procedure (or operator) is invoked.


Line 2,975: Line 3,343:
Basic if/then:
Basic if/then:


<lang idl>if a eq 5 then print, "a equals five" [else print, "a is something else"]</lang>
<syntaxhighlight lang="idl">if a eq 5 then print, "a equals five" [else print, "a is something else"]</syntaxhighlight>


Any one statement (like these print statements) can always be expanded into a {begin ... end} pair with any amount of code in between. Thus the above will expand like this:
Any one statement (like these print statements) can always be expanded into a {begin ... end} pair with any amount of code in between. Thus the above will expand like this:


<lang idl>if a eq 5 then begin
<syntaxhighlight lang="idl">if a eq 5 then begin
... some code here ...
... some code here ...
endif [else begin
endif [else begin
... some other code here ...
... some other code here ...
endelse]</lang>
endelse]</syntaxhighlight>


===case===
===case===


<lang idl>case <expression> of
<syntaxhighlight lang="idl">case <expression> of
(choice-1): <command-1>
(choice-1): <command-1>
[(choice-2): <command-2> [...]]
[(choice-2): <command-2> [...]]
[else: <command-else>]
[else: <command-else>]
endcase</lang>
endcase</syntaxhighlight>


(Or replace any of the commands with {begin..end} pairs)
(Or replace any of the commands with {begin..end} pairs)
Line 2,997: Line 3,365:
===switch===
===switch===


<lang idl>switch <expression> of
<syntaxhighlight lang="idl">switch <expression> of
(choice-1): <command-1>
(choice-1): <command-1>
[(choice-2): <command-2> [...]]
[(choice-2): <command-2> [...]]
[else: <command-else>]
[else: <command-else>]
endswitch</lang>
endswitch</syntaxhighlight>


The <tt>switch</tt> will execute all commands starting with the matching result, while the <tt>case</tt> will only execute the matching one.
The <tt>switch</tt> will execute all commands starting with the matching result, while the <tt>case</tt> will only execute the matching one.
Line 3,007: Line 3,375:
===on_error===
===on_error===


<lang idl>on_error label</lang>
<syntaxhighlight lang="idl">on_error label</syntaxhighlight>


Will resume execution at label when an error is encountered. <tt>on_ioerror</tt> is similar but for IO errors.
Will resume execution at label when an error is encountered. <tt>on_ioerror</tt> is similar but for IO errors.
Line 3,013: Line 3,381:
=={{header|Inform 7}}==
=={{header|Inform 7}}==
===if-then-else===
===if-then-else===
<lang inform7>[short form]
<syntaxhighlight lang="inform7">[short form]
if N is 1, say "one.";
if N is 1, say "one.";
otherwise say "not one.";
otherwise say "not one.";
Line 3,026: Line 3,394:


[short and long forms can be negated with "unless"]
[short and long forms can be negated with "unless"]
unless N is 1, say "not one."</lang>
unless N is 1, say "not one."</syntaxhighlight>


===switch===
===switch===
<lang inform7>if N is:
<syntaxhighlight lang="inform7">if N is:
-- 1: say "one.";
-- 1: say "one.";
-- 2: say "two.";
-- 2: say "two.";
-- otherwise: say "not one or two.";</lang>
-- otherwise: say "not one or two.";</syntaxhighlight>


===if-then-else in text===
===if-then-else in text===
<lang inform7>say "[if N is 1]one[otherwise if N is 2]two[otherwise]three[end if].";
<syntaxhighlight lang="inform7">say "[if N is 1]one[otherwise if N is 2]two[otherwise]three[end if].";
say "[unless N is odd]even.[end if]";</lang>
say "[unless N is odd]even.[end if]";</syntaxhighlight>


===other branching text substitutions===
===other branching text substitutions===
Text that may be printed multiple times can also use sequential and random branching:
Text that may be printed multiple times can also use sequential and random branching:
<lang inform7>[a different color every time]
<syntaxhighlight lang="inform7">[a different color every time]
say "[one of]red[or]blue[or]green[at random].";
say "[one of]red[or]blue[or]green[at random].";


Line 3,047: Line 3,415:


[only appears once]
[only appears once]
say "[first time]Hello world![only]";</lang>
say "[first time]Hello world![only]";</syntaxhighlight>


===rulebook approach===
===rulebook approach===
Conditional logic may also be expressed in the form of a rulebook, with conditions on each rule:
Conditional logic may also be expressed in the form of a rulebook, with conditions on each rule:


<lang inform7>Number Factory is a room.
<syntaxhighlight lang="inform7">Number Factory is a room.


Number handling is a number based rulebook with default success.
Number handling is a number based rulebook with default success.
Line 3,064: Line 3,432:
follow the number handling rules for 2;
follow the number handling rules for 2;
follow the number handling rules for 4;
follow the number handling rules for 4;
follow the number handling rules for 5.</lang>
follow the number handling rules for 5.</syntaxhighlight>


=={{header|Isabelle}}==
=={{header|Isabelle}}==
<lang Isabelle>theory Scratch
<syntaxhighlight lang="isabelle">theory Scratch
imports Main
imports Main
begin
begin
Line 3,088: Line 3,456:
lemma "recurse n = 0" by(induction n) simp+
lemma "recurse n = 0" by(induction n) simp+


end</lang>
end</syntaxhighlight>


=={{header|J}}==
=={{header|J}}==
See [[Conditional Structures/J]]
See [[Conditional Structures/J]]

=={{header|Jakt}}==
<syntaxhighlight lang="jakt">
fn main() {
let a = 5
let b = 3

// If/else/else-if
if a > b {
println("a > b")
} else if a < b {
println("a < b")
} else {
println("a = b")
}

// Match
match a {
(..5) => {
println("a < 5")
}
5 => {
println("a == 5")
}
else => {
println("a > 5")
}
}

// Or equivalently
println(match a {
(..5) => "a < 5"
5 => "a == 5"
else => "a > 5"
})

// Hash based
let primality = [
1: false
2: false
3: true
4: false
5: true
6: false
]
let a_is_prime = primality[a]
println("a_is_prime = {}", a_is_prime)
}
</syntaxhighlight>


=={{header|Java}}==
=={{header|Java}}==
===if-then-else===
===if-then-else===
<lang java>if(s.equals("Hello World"))
<syntaxhighlight lang="java">if (s.equals("Hello World")) {
{
foo();
foo();
} else if (s.equals("Bye World"))
}
bar(); // braces optional for one-liners
else if(s.equals("Bye World"))
else {
bar();//{}'s optional for one-liners
else
{
deusEx();
deusEx();
}</lang>
}</syntaxhighlight>
Java also supports [[wp:Short-circuit_evaluation|short-circuit evaluation]]. So in a conditional like this:
Java also supports [[wp:Short-circuit_evaluation|short-circuit evaluation]]. So in a conditional like this:
<lang java>if(obj != null && obj.foo()){
<syntaxhighlight lang="java">if (obj != null && obj.foo()) {
aMethod();
aMethod();
}</lang>
}</syntaxhighlight>
<tt>obj.foo()</tt> will not be executed if <tt>obj != null</tt> returns false. It is possible to have conditionals without short circuit evaluation using the <tt>&</tt> and <tt>|</tt> operators (from [[Bitwise operations]]). So in this conditional:
<tt>obj.foo()</tt> will not be executed if <tt>obj != null</tt> returns false. It is possible to have conditionals without short circuit evaluation using the <tt>&</tt> and <tt>|</tt> operators (from [[Bitwise operations]]). So in this conditional:
<lang java>if(obj != null & obj.foo()){
<syntaxhighlight lang="java">if (obj != null & obj.foo()) {
aMethod();
aMethod();
}</lang>
}</syntaxhighlight>
You will get a null pointer exception if obj is null.
You will get a null pointer exception if <tt>obj</tt> is null.
===ternary===
===ternary===
<syntaxhighlight lang="java">s.equals("Hello World") ? foo() : bar();</syntaxhighlight>

The ternary operator is an expression, and is most often used as such:
<lang java>s.equals("Hello World") ? foo() : bar();</lang>
<syntaxhighlight lang="java">Object newValue = s.equals("Hello World") ? a : b;</syntaxhighlight>


===switch===
===switch===
This structure will only work if the code being switched on evaluates to an integer or character. There is no switching on Objects or floating-point types in Java (except for <code>String</code>s in Java 7 and higher).
This structure will only work if the code being switched on evaluates to an integer or character. There is no switching on <code>Object</code>s (except for Java 17 and higher), <code>long</code>s, or floating-point types in Java (except for <code>String</code>s and enum types in Java 7 and higher).
<lang java>switch(c) {
<syntaxhighlight lang="java">switch (c) {
case 'a':
case 'a':
foo();
foo();
break;
break;
case 'b':
case 'b':
bar();
bar();
default:
default:
foobar();
foobar();
}</lang>
}</syntaxhighlight>
This particular example can show the "fallthrough" behavior of a switch statement. If c is the character b, then bar() and foobar() will both be called. If c is the character a, only foo() will be called because of the break statement at the end of that case.
This particular example can show the "fallthrough" behavior of a switch statement. If c is the character b, then bar() and foobar() will both be called. If c is the character a, only foo() will be called because of the break statement at the end of that case.


Also, the switch statement can be easily translated into an if-else if-else statement. The example above is equivalent to:
Also, the switch statement can be easily translated into an if-else statement. The example above is equivalent to:
<lang java>if(c == 'a'){
<syntaxhighlight lang="java">if (c == 'a') {
foo();
foo();
}else if(c == 'b'){
} else if (c == 'b') {
bar();
bar();
foobar();
foobar();
}else{
} else {
foobar();
foobar();
}</lang>
}</syntaxhighlight>
Cases without breaks at the end require duplication of code for all cases underneath them until a break is found (like the else if block shown here).
Cases without breaks at the end require duplication of code for all cases underneath them until a break is found (like the else if block shown here).

===switch expressions===
{{works with|Java|14+}}
Switch statements can be expressions. They must be exhaustive, and return a value with the <tt>yield</tt> keyword.
<syntaxhighlight lang=“java”>int x = switch (c) {
case 'a':
foo();
yield 1;
case 'b':
bar();
default:
foobar();
yield 0;
}</syntaxhighlight>

There is also a new syntax, available for both statements and expressions, that does not use fallthrough:
<syntaxhighlight lang=“java”>int y = switch (c) {
case '1', '2' -> 1 // multiple cases can be on one line
default -> { // use a block for multiple statements
foobar();
yield 0;
}
}</syntaxhighlight>


=={{header|JavaScript}}==
=={{header|JavaScript}}==
Line 3,146: Line 3,584:
===if-then-else===
===if-then-else===


<lang javascript>if( s == "Hello World" ) {
<syntaxhighlight lang="javascript">if( s == "Hello World" ) {
foo();
foo();
} else if( s == "Bye World" ) {
} else if( s == "Bye World" ) {
Line 3,152: Line 3,590:
} else {
} else {
deusEx();
deusEx();
}</lang>
}</syntaxhighlight>


===switch===
===switch===


<lang javascript>switch(object) {
<syntaxhighlight lang="javascript">switch(object) {
case 1:
case 1:
one();
one();
Line 3,170: Line 3,608:
default:
default:
everythingElse();
everythingElse();
}</lang>
}</syntaxhighlight>


===conditional (ternary) operator (?:)===
===conditional (ternary) operator (?:)===


<lang javascript>var num = window.obj ? obj.getNumber() : null;</lang>
<syntaxhighlight lang="javascript">var num = window.obj ? obj.getNumber() : null;</syntaxhighlight>


The distinctive feature of the ternary operator (compared to JavaScript's other conditional structures) is that it evaluates as an expression rather than a statement, and can therefore be composed within larger expressions, making it a valuable resource of program structure in a functional idiom of JavaScript.
The distinctive feature of the ternary operator (compared to JavaScript's other conditional structures) is that it evaluates as an expression rather than a statement, and can therefore be composed within larger expressions, making it a valuable resource of program structure in a functional idiom of JavaScript.


<lang JavaScript>function takeWhile(lst, fnTest) {
<syntaxhighlight lang="javascript">function takeWhile(lst, fnTest) {
'use strict';
'use strict';
var varHead = lst.length ? lst[0] : null;
var varHead = lst.length ? lst[0] : null;
Line 3,187: Line 3,625:
) : []
) : []
) : [];
) : [];
}</lang>
}</syntaxhighlight>


=={{header|JCL}}==
=={{header|JCL}}==
Line 3,200: Line 3,638:
</pre>
</pre>
The syntax of COND parameter of the EXEC statement is :
The syntax of COND parameter of the EXEC statement is :
<lang jcl> COND=(rcval,relop,step)
<syntaxhighlight lang="jcl"> COND=(rcval,relop,step)
relop is a relational opeator : EQ NE GT LT GE LE (= ¬= < > <= >=) </lang>
relop is a relational opeator : EQ NE GT LT GE LE (= ¬= < > <= >=) </syntaxhighlight>
It is a condition to bypass a job step, and it can be translateted into :
It is a condition to bypass a job step, and it can be translateted into :
<lang jcl> if rcval relop step.rc then not execute the current step </lang>
<syntaxhighlight lang="jcl"> if rcval relop step.rc then not execute the current step </syntaxhighlight>
Example:
Example:
<lang jcl>//STEP6 EXEC PGM=MYPROG,COND=(0,NE,STEP3)</lang>
<syntaxhighlight lang="jcl">//STEP6 EXEC PGM=MYPROG,COND=(0,NE,STEP3)</syntaxhighlight>
<pre>
<pre>
if 0 ne STEP3.rc then skip step STEP6
if 0 ne STEP3.rc then skip step STEP6
Line 3,213: Line 3,651:
</pre>
</pre>
The conditions can be multiple :
The conditions can be multiple :
<lang jcl> COND=((rcval1,relop1,step1),(rcval2,relop2,step2),...) </lang>
<syntaxhighlight lang="jcl"> COND=((rcval1,relop1,step1),(rcval2,relop2,step2),...) </syntaxhighlight>
Means:
Means:
<lang jcl> if rcval1 relop1 step1.rc or rcval2 relop2 step2.rc or ... then not execute the current step </lang>
<syntaxhighlight lang="jcl"> if rcval1 relop1 step1.rc or rcval2 relop2 step2.rc or ... then not execute the current step </syntaxhighlight>
Example:
Example:
<lang jcl>//STEP6 EXEC PGM=MYPROG,COND=((4,LE,STEP1),(8,LE,STEP3)) </lang>
<syntaxhighlight lang="jcl">//STEP6 EXEC PGM=MYPROG,COND=((4,LE,STEP1),(8,LE,STEP3)) </syntaxhighlight>
<pre>
<pre>
if 4 le STEP1.rc or 8 le STEP3.rc then skip step STEP6
if 4 le STEP1.rc or 8 le STEP3.rc then skip step STEP6
Line 3,228: Line 3,666:
===if-then-else===
===if-then-else===


<lang jinja>
<syntaxhighlight lang="jinja">
print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
{{ loop.index }}) {{ lang }}{% if loop.last %}.{% else %},{% endif %}
{{ loop.index }}) {{ lang }}{% if loop.last %}.{% else %},{% endif %}
{%- endfor %}""").render())
{%- endfor %}""").render())
</syntaxhighlight>
</lang>


===ternary expressions===
===ternary expressions===


<lang jinja>
<syntaxhighlight lang="jinja">
print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
{{ loop.index }}) {{ lang }}{{ "." if loop.last else "," }}
{{ loop.index }}) {{ lang }}{{ "." if loop.last else "," }}
{%- endfor %}""").render())
{%- endfor %}""").render())
</syntaxhighlight>
</lang>


===short-circuit evaluation===
===short-circuit evaluation===


<lang jinja>
<syntaxhighlight lang="jinja">
print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
{{ loop.index }}) {{ lang }}{{ loop.last and "." or "," }}
{{ loop.index }}) {{ lang }}{{ loop.last and "." or "," }}
{%- endfor %}""").render())
{%- endfor %}""").render())
</syntaxhighlight>
</lang>


=={{header|jq}}==
=={{header|jq}}==
jq's main conditional construct is:<lang jq>if cond then f else g end</lang>where cond, f, and g, are filters, and where cond may evaluate to anything at all, it being understood that:
jq's main conditional construct is:<syntaxhighlight lang="jq">if cond then f else g end</syntaxhighlight>where cond, f, and g, are filters, and where cond may evaluate to anything at all, it being understood that:
# all JSON values are truthy except for false and null;
# all JSON values are truthy except for false and null;
# if cond evaluates to nothing (i.e., produces an empty stream), then the entire if-then-else-end expression also produces an empty stream.
# if cond evaluates to nothing (i.e., produces an empty stream), then the entire if-then-else-end expression also produces an empty stream.


The general pattern allows one or more "elif _ then _" clauses:
The general pattern allows one or more "elif _ then _" clauses:
<syntaxhighlight lang="jq">
<lang jq>
if cond then f elif cond1 then f1 .... else g end
if cond then f elif cond1 then f1 .... else g end
</syntaxhighlight>
</lang>


For example:<lang jq>
For example:<syntaxhighlight lang="jq">
if empty then 2 else 3 end # produces no value
if empty then 2 else 3 end # produces no value
if 1 then 2 else 3 end # produces 2
if 1 then 2 else 3 end # produces 2
if [false, false] then 2 else 3 end # produces 2
if [false, false] then 2 else 3 end # produces 2
if (true, true) then 2 else 3 end # produces a stream: 2, 2
if (true, true) then 2 else 3 end # produces a stream: 2, 2
</lang>Notice that if cond produces a nonempty stream, then the entire expression will typically do the same. Since f and g also can produce streams, this lends itself to interesting Cartesian-product possibilities.
</syntaxhighlight>Notice that if cond produces a nonempty stream, then the entire expression will typically do the same. Since f and g also can produce streams, this lends itself to interesting Cartesian-product possibilities.


There is no "case <exp>" construct, but the idiom illustrated by the following example can be used to avoid the need to create a temporary variable to hold the "case" expression:<lang jq>
There is no "case <exp>" construct, but the idiom illustrated by the following example can be used to avoid the need to create a temporary variable to hold the "case" expression:<syntaxhighlight lang="jq">
exp
exp
| if . == true then "true"
| if . == true then "true"
Line 3,274: Line 3,712:
elif type == "string" then .
elif type == "string" then .
else error("unexpected value: \(.)")
else error("unexpected value: \(.)")
end</lang>
end</syntaxhighlight>
Since jq's <tt>and</tt> and <tt>or</tt> are short-circuiting, they can also be used for branching, as can the binary disjunctive operator `//`.
Since jq's <tt>and</tt> and <tt>or</tt> are short-circuiting, they can also be used for branching, as can the binary disjunctive operator `//`.


Line 3,280: Line 3,718:
Note: this documentation is mostly copied from the Julia 0.6.0 documentation at: https://docs.julialang.org/en/stable/manual/control-flow/#man-conditional-evaluation-1
Note: this documentation is mostly copied from the Julia 0.6.0 documentation at: https://docs.julialang.org/en/stable/manual/control-flow/#man-conditional-evaluation-1
<h3>Conditional Evaluation</h3>
<h3>Conditional Evaluation</h3>
<syntaxhighlight lang="julia">
<lang Julia>
function test(x, y)
function test(x, y)
if x < y
if x < y
Line 3,299: Line 3,737:
julia> test(1, 1)
julia> test(1, 1)
x is equal to y
x is equal to y
</syntaxhighlight>
</lang>
<p>
<p>
The elseif and else blocks are optional, and as many elseif blocks as desired can be used. The condition expressions in the if-elseif-else construct are evaluated until the first one evaluates to true, after which the associated block is evaluated, and no further condition expressions or blocks are evaluated.
The elseif and else blocks are optional, and as many elseif blocks as desired can be used. The condition expressions in the if-elseif-else construct are evaluated until the first one evaluates to true, after which the associated block is evaluated, and no further condition expressions or blocks are evaluated.
</p><p>
</p><p>
The so-called "ternary operator", ?:, is closely related to the if-elseif-else syntax, but is used where a conditional choice between single expression values is required, as opposed to conditional execution of longer blocks of code. It gets its name from being the only operator in most languages taking three operands:
The so-called "ternary operator", ?:, is closely related to the if-elseif-else syntax, but is used where a conditional choice between single expression values is required, as opposed to conditional execution of longer blocks of code. It gets its name from being the only operator in most languages taking three operands:
</p><lang Julia>
</p><syntaxhighlight lang="julia">
a ? b : c
a ? b : c
</syntaxhighlight>
</lang>
<p>
<p>
The expression a, before the ?, is a condition expression, and the ternary operation evaluates the expression b, before the :, if the condition a is true or the expression c, after the :, if it is false. To facilitate chaining, the operator associates from right to left.
The expression a, before the ?, is a condition expression, and the ternary operation evaluates the expression b, before the :, if the condition a is true or the expression c, after the :, if it is false. To facilitate chaining, the operator associates from right to left.
Line 3,321: Line 3,759:
=={{header|Kabap}}==
=={{header|Kabap}}==
Kabap supports the '''if''' statement and a range of standard comparators. Truthiness is considered anything not "0" or 0.
Kabap supports the '''if''' statement and a range of standard comparators. Truthiness is considered anything not "0" or 0.
<syntaxhighlight lang="kabap">
<lang Kabap>
if 1;
if 1;
$result = "Execute";
$result = "Execute";
Line 3,377: Line 3,815:
}
}


</syntaxhighlight>
</lang>


=={{header|Keg}}==
=={{header|Keg}}==
Keg supports if statements like this:
Keg supports if statements like this:
<lang keg>?A>[The letter is larger than a|The letter is smaller than a]</lang>
<syntaxhighlight lang="keg">?A>[The letter is larger than a|The letter is smaller than a]</syntaxhighlight>
Usually the ending proprotions may be omitted:
Usually the ending proprotions may be omitted:
<lang keg>?![You did enter something]</lang>
<syntaxhighlight lang="keg">?![You did enter something]</syntaxhighlight>


Also Keg supports (though not intentionally) a form of short-circuit evaluation:
Also Keg supports (though not intentionally) a form of short-circuit evaluation:
<lang keg>2?1>*# Returns 2 if the input is larger than 1</lang>
<syntaxhighlight lang="keg">2?1>*# Returns 2 if the input is larger than 1</syntaxhighlight>


=={{header|Kotlin}}==
=={{header|Kotlin}}==
<lang scala>// version 1.0.6
<syntaxhighlight lang="scala">// version 1.0.6


fun main(args: Array<String>) {
fun main(args: Array<String>) {
Line 3,416: Line 3,854:
}
}
println("$i is $t")
println("$i is $t")
}</lang>
}</syntaxhighlight>
Sample input/output (program invoked without arguments):
Sample input/output (program invoked without arguments):
{{out}}
{{out}}
Line 3,436: Line 3,874:


=={{header|Lambdatalk}}==
=={{header|Lambdatalk}}==
<lang scheme>
<syntaxhighlight lang="scheme">
{if true then yes else no}
{if true then yes else no}
-> yes
-> yes
Line 3,454: Line 3,892:
{switch 0}
{switch 0}
-> 0 is zero
-> 0 is zero
</syntaxhighlight>
</lang>


=={{header|langur}}==
=={{header|langur}}==
If and given expressions always produce a value, even if it's nothing (null).
If and switch expressions always produce a value, even if it's nothing (null).


In the shortened forms, you dispense with the keywords (except the first one).
In the shortened forms, you dispense with the keywords (except the first one).
Line 3,463: Line 3,901:
===if expressions===
===if expressions===
If expressions are scoped per section.
If expressions are scoped per section.
<syntaxhighlight lang="langur">if .x == 0 {
<lang langur># using the fact that submatch() returns an empty array for no match ...
# ... and that a decoupling assignment returns a Boolean...

if val .alias, .name = submatch($re/^(\.idregex;)\\s*;\\s*(\.idregex;)/, .row) {
# success (2 or more values in array returned from submatch function)
# use .alias and .name here
...
...
} else if .x > 0 {
} else if .x > 0 {
Line 3,476: Line 3,909:
val .y = 70
val .y = 70
...
...
}</lang>
}</syntaxhighlight>

Prior to langur 0.10, you would use parentheses around the declared variable names (.alias, .name).


===shortened form if expression===
===shortened form if expression===
Line 3,485: Line 3,916:
This is more flexible than a ternary operator, as it allows more than one test. An else section is optional (null by default).
This is more flexible than a ternary operator, as it allows more than one test. An else section is optional (null by default).


<lang langur>if(.x > .y: ...; .x < .y: ...; /* else */ ...)</lang>
<syntaxhighlight lang="langur">if(.x > .y: ...; .x < .y: ...; /* else */ ...)</syntaxhighlight>


===if statements===
===simple if===
Langur 0.7.1 added "if statements," using a colon after the test condition. This is convenient for simple branching or assignments, without having to use curly braces, but does not allow for else if or else sections.
Simple if expressions use a colon after the test condition. This is convenient for simple branching or assignments, without having to use curly braces, but does not allow for else if or else sections.


<lang langur>if .x > .y: break</lang>
<syntaxhighlight lang="langur">if .x > .y: break</syntaxhighlight>


===given expressions===
===switch expressions===
Given expressions are highly flexible, and it is not all covered here. See langurlang.org for details.
Switch expressions are highly flexible, and it is not all covered here. See langurlang.org for details.


Switch defaults to testing that any condition is true (as familiar to many programmers), but this can be changed by specifying an infix operator within square brackets, such as switch[and].
Given expressions are scoped per section. Also, test expressions (such as the .x, .y, .z list below) may contain declarations which are scoped to the entire expression.


<lang langur>given .x, .y, .z {
<syntaxhighlight lang="langur">switch .x, .y, .z {
case true: ...
# any are true
case false, _: ...
# .x == false
case _, null, true: ...
# .y == null or .z == true
case xor _, true, true: ...
# .y == true xor .z == true
}

switch 0 {
case .x, .y: ...
# .x or .y equals 0
...
}

switch[and] .x, .y, .z {
case true: ...
case true: ...
# all are true
# all are true
Line 3,504: Line 3,952:
case _, null, true: ...
case _, null, true: ...
# .y == null and .z == true
# .y == null and .z == true
}</lang>
}</syntaxhighlight>


As of 0.7, complex test expressions are evaluated once, then compared against conditions.
Complex test expressions are evaluated once, then compared against conditions.

The default logical operator between multiple conditions is "and" (even when there is a single test expression). You can specify another operator after the "case" keyword, using something like "case or".

<lang langur>given .x, .y, != .z {
case 7 <, 14, 21: ...
# 7 < .x and .y == 14 and 21 != .z

case or > 100, _, re/abc/: ...
# .x > 100 or matching(re/abc/, .z)

case ; .a > .b: ...
# .a > .b

case _, _, == 7; xor .a <= .b: ...
# .z == 7 xor .a <= .b

default: ...
}</lang>


===implicit fallthrough===
===implicit fallthrough===
If a block of a given has any statements, there is no implicit fallthrough. A case with an empty block after it creates an implicit fallthrough.
If a block of a switch has any statements, there is no implicit fallthrough. A case with an empty block after it creates an implicit fallthrough.
<lang langur>given .x {
<syntaxhighlight lang="langur">switch .x {
case true:
case true:
# implicit fallthrough
# implicit fallthrough
Line 3,534: Line 3,964:
# no fallthrough
# no fallthrough
default: 1
default: 1
}</lang>
}</syntaxhighlight>


===explicit fallthrough from anywhere===
===explicit fallthrough from anywhere===
A fallthrough statement is allowed anywhere within a given block, not just at the end.
A fallthrough statement is allowed anywhere within a switch block, not just at the end. (It's typical in programming languages to only allow fallthrough at the end of the block.)

<lang langur>given .x {
<syntaxhighlight lang="langur">switch .x {
case true:
case true:
if .y > 100 {
if .y > 100 {
Line 3,546: Line 3,977:
}
}
case false: ...
case false: ...
}</lang>
}</syntaxhighlight>


===shortened form given===
===shortened form switch===
A shortened form given expects a single action expression per test and is more limited in other ways, as well (no explicit fallthrough, no alternate test expressions, no alternate logical operators). A default section is optional (null by default).
A shortened form expects a single action expression per test and is more limited in other ways, as well (no explicit fallthrough, no alternate test expressions, no alternate logical operators). A default section is optional (null by default).
<lang langur>given(.x, .y, .z;
<syntaxhighlight lang="langur">switch(.x, .y, .z;
true: ... ; # all are equal to true
true: ... ; # any are equal to true
_, >= .z: ...; # .y >= .z
_, >= .z: ...; # .y >= .z
... ) # default</lang>
... ) # default</syntaxhighlight>


=={{header|LC3 Assembly}}==
=={{header|LC3 Assembly}}==
The LC3 sets condition codes (N[egative], Z[ero], and/or P[ositive]) based on the results of instructions that write values into the general purpose registers. The BR instruction utilizes these condition codes are to branch conditionally. If the BR instruction specifies one or more condition codes and at least one specified code is set, then the PC will be updated to the branch address. If none of the specified condition codes is set, then the next sequential instruction will execute. If the BR instruction does not specify any condition codes, then it is an unconditional branch, so the branch will be taken.
The LC3 sets condition codes (N[egative], Z[ero], and/or P[ositive]) based on the results of instructions that write values into the general purpose registers. The BR instruction utilizes these condition codes are to branch conditionally. If the BR instruction specifies one or more condition codes and at least one specified code is set, then the PC will be updated to the branch address. If none of the specified condition codes is set, then the next sequential instruction will execute. If the BR instruction does not specify any condition codes, then it is an unconditional branch, so the branch will be taken.
<lang lc3asm>BR or BRnzp ; unconditional branch, i.e.
<syntaxhighlight lang="lc3asm">BR or BRnzp ; unconditional branch, i.e.
; branch if (result < 0 || result == 0 || result > 0)
; branch if (result < 0 || result == 0 || result > 0)
; ^ this is always true
; ^ this is always true
Line 3,566: Line 3,997:


; or any combination of these condition codes, e.g.
; or any combination of these condition codes, e.g.
BRnz ; branch if (result <= 0)</lang>
BRnz ; branch if (result <= 0)</syntaxhighlight>
The effect of <tt>if (x == y) { go to LABEL }</tt> is achieved by adding <tt>x</tt> to <tt>-y</tt> (the two's complements of <tt>y</tt>) and branching if the result is zero. The following example prints "Branch Taken!" because the values of <tt>x</tt> and <tt>y</tt> are both 1.
The effect of <tt>if (x == y) { go to LABEL }</tt> is achieved by adding <tt>x</tt> to <tt>-y</tt> (the two's complements of <tt>y</tt>) and branching if the result is zero. The following example prints "Branch Taken!" because the values of <tt>x</tt> and <tt>y</tt> are both 1.
<lang lc3asm>.orig x3000
<syntaxhighlight lang="lc3asm">.orig x3000
LD R1, x ; get x
LD R1, x ; get x
LD R2, y ; get y
LD R2, y ; get y
Line 3,586: Line 4,017:
taken .stringz "Branch Taken!"
taken .stringz "Branch Taken!"
nottaken .stringz "Branch Not Taken!"
nottaken .stringz "Branch Not Taken!"
.end</lang>
.end</syntaxhighlight>


=={{header|LIL}}==
=={{header|LIL}}==
LIL sports '''if''' with an optional code block for else conditions.
LIL sports '''if''' with an optional code block for else conditions.


<lang tcl>if {$a > 10} {print "code evaluated on true"}
<syntaxhighlight lang="tcl">if {$a > 10} {print "code evaluated on true"}
if {$a > 10} {print "again"} {print "code evaluated on false"}</lang>
if {$a > 10} {print "again"} {print "code evaluated on false"}</syntaxhighlight>


These can of course be nested in clear or nasty forms. '''if''' blocks can contain '''if''' blocks with as many optional else clauses as a programmer sees fit to intermingle.
These can of course be nested in clear or nasty forms. '''if''' blocks can contain '''if''' blocks with as many optional else clauses as a programmer sees fit to intermingle.
Line 3,601: Line 4,032:
{{works with|Lisaac|0.13.1}}
{{works with|Lisaac|0.13.1}}
===if-then-else===
===if-then-else===
<lang Lisaac>+ n : INTEGER;
<syntaxhighlight lang="lisaac">+ n : INTEGER;


n := 3;
n := 3;
Line 3,613: Line 4,044:
} else {
} else {
IO.put_string "n is none of the above\n";
IO.put_string "n is none of the above\n";
};</lang>
};</syntaxhighlight>
<lang Lisaac>(n = 2).if_true { "n is 2\n".print; };
<syntaxhighlight lang="lisaac">(n = 2).if_true { "n is 2\n".print; };
(n = 2).if_false { "n is not 2\n".print; };</lang>
(n = 2).if_false { "n is not 2\n".print; };</syntaxhighlight>
===when===
===when===
<lang Lisaac>+ n : INTEGER;
<syntaxhighlight lang="lisaac">+ n : INTEGER;


n := 3;
n := 3;
Line 3,629: Line 4,060:
.when 4 then {
.when 4 then {
"n is 4\n".print;
"n is 4\n".print;
};</lang>
};</syntaxhighlight>
There is no "else" or "otherwise" method.
There is no "else" or "otherwise" method.
If the values of the when-methods are overlapped, the related blocks will be evaluated ... they are not mutually exclusive.
If the values of the when-methods are overlapped, the related blocks will be evaluated ... they are not mutually exclusive.
Line 3,635: Line 4,066:
=={{header|Little}}==
=={{header|Little}}==


<lang C>int a = 3;
<syntaxhighlight lang="c">int a = 3;


// if-then-else
// if-then-else
Line 3,668: Line 4,099:
default:
default:
puts("is neither");
puts("is neither");
}</lang>
}</syntaxhighlight>


=={{header|Logo}}==
=={{header|Logo}}==
<lang logo>if :x < 0 [make "x 0 - :x]
<syntaxhighlight lang="logo">if :x < 0 [make "x 0 - :x]


ifelse emptyp :list [print [empty]] [print :list]</lang>
ifelse emptyp :list [print [empty]] [print :list]</syntaxhighlight>
[[UCB Logo]] and its descendants have also case:
[[UCB Logo]] and its descendants have also case:
<lang logo>to vowel? :letter
<syntaxhighlight lang="logo">to vowel? :letter
output case :letter [ [[a e i o u] "true] [else "false] ]
output case :letter [ [[a e i o u] "true] [else "false] ]
end
end
show vowel? "e
show vowel? "e
show vowel? "x</lang>
show vowel? "x</syntaxhighlight>
{{out}}
{{out}}
<lang logo>true
<syntaxhighlight lang="logo">true
false</lang>
false</syntaxhighlight>
Logo also provides TEST which is local to a procedure:
Logo also provides TEST which is local to a procedure:
<lang logo>to mytest :arg1 :arg2
<syntaxhighlight lang="logo">to mytest :arg1 :arg2
test :arg1 = :arg2
test :arg1 = :arg2
iftrue [print [Arguments are equal]]
iftrue [print [Arguments are equal]]
iffalse [print [Arguments are not equal]]
iffalse [print [Arguments are not equal]]
end</lang>
end</syntaxhighlight>


=={{header|LSE}}==
=={{header|LSE}}==
==={{header|SI..ALORS..SINON..FIN SI}}===
==={{header|SI..ALORS..SINON..FIN SI}}===
<lang LSE>SI A ET B ALORS
<syntaxhighlight lang="lse">SI A ET B ALORS
AFFICHER [4X, 'A ET B = .VRAI.',/]
AFFICHER [4X, 'A ET B = .VRAI.',/]
SINON
SINON
Line 3,701: Line 4,132:
SINON
SINON
AFFICHER [4X, 'A ET QUE B = .FAUX.',/]
AFFICHER [4X, 'A ET QUE B = .FAUX.',/]
FIN SI</lang>
FIN SI</syntaxhighlight>


==={{header|EVALUER}}===
==={{header|EVALUER}}===
<lang LSE>EVALUER X
<syntaxhighlight lang="lse">EVALUER X
QUAND 0
QUAND 0
AFFICHER [4X,'QUAND X=0',/]
AFFICHER [4X,'QUAND X=0',/]
Line 3,713: Line 4,144:
QUAND AUTRE
QUAND AUTRE
AFFICHER [4X,'QUAND X est autre, X=',U,/] X
AFFICHER [4X,'QUAND X est autre, X=',U,/] X
FIN EVALUER</lang>
FIN EVALUER</syntaxhighlight>


==={{header|SELON..ALLER EN..}}===
==={{header|SELON..ALLER EN..}}===
<lang LSE>0 AFFICHER [U,/] 'Faites votre choix:'
<syntaxhighlight lang="lse">0 AFFICHER [U,/] 'Faites votre choix:'
1 AFFICHER [8X,U,X,/] '0 VACHES'
1 AFFICHER [8X,U,X,/] '0 VACHES'
2 AFFICHER [8X,U,/] '1 MOUTONS'
2 AFFICHER [8X,U,/] '1 MOUTONS'
Line 3,723: Line 4,154:
10 AFFICHER [U,/] 'Vous avez choisi VACHES!'
10 AFFICHER [U,/] 'Vous avez choisi VACHES!'
15 TERMINER
15 TERMINER
20 AFFICHER [U,/] 'Vous avez choisi MOUTONS!'</lang>
20 AFFICHER [U,/] 'Vous avez choisi MOUTONS!'</syntaxhighlight>


==={{header|SI..ALORS..SINON..IS}}===
==={{header|SI..ALORS..SINON..IS}}===
<lang LSE>ENTIER U <- SI A ALORS 65535 SINON 1 IS</lang>
<syntaxhighlight lang="lse">ENTIER U <- SI A ALORS 65535 SINON 1 IS</syntaxhighlight>


==={{header|SELON..DANS..SINON..FIN}}===
==={{header|SELON..DANS..SINON..FIN}}===
<lang LSE>ENTIER U <- SELON A DANS 0, 255 SINON 1 FIN</lang>
<syntaxhighlight lang="lse">ENTIER U <- SELON A DANS 0, 255 SINON 1 FIN</syntaxhighlight>


=={{header|LSE64}}==
=={{header|LSE64}}==
The simple conditionals take single words rather than blocks of statements, as in most other languages.
The simple conditionals take single words rather than blocks of statements, as in most other languages.
<lang lse64>t : " true" ,t
<syntaxhighlight lang="lse64">t : " true" ,t
f : " false" ,t
f : " false" ,t
true if t
true if t
false ifnot f
false ifnot f
true ifelse t f</lang>
true ifelse t f</syntaxhighlight>


Cascading conditionals are constructed using duplicate definitions and "then", yielding a syntax reminiscent of functional language [[Pattern Matching]].
Cascading conditionals are constructed using duplicate definitions and "then", yielding a syntax reminiscent of functional language [[Pattern Matching]].
<lang lse64>onetwo : drop " Neither one nor two" ,t # default declared first
<syntaxhighlight lang="lse64">onetwo : drop " Neither one nor two" ,t # default declared first
onetwo : dup 2 = then " Two" ,t
onetwo : dup 2 = then " Two" ,t
onetwo : dup 1 = then " One" ,t</lang>
onetwo : dup 1 = then " One" ,t</syntaxhighlight>


Short-circuit operators "&&" and "||" are used for complex conditionals.
Short-circuit operators "&&" and "||" are used for complex conditionals.
<lang lse64>dup 0 = || ,t # avoid printing a null string</lang>
<syntaxhighlight lang="lse64">dup 0 = || ,t # avoid printing a null string</syntaxhighlight>


=={{header|Lua}}==
=={{header|Lua}}==
<syntaxhighlight lang="lua">
<lang Lua>
--if-then-elseif-then-else
--if-then-elseif-then-else
if a then
if a then
Line 3,780: Line 4,211:
}
}


cases[key]() --equivalent to dothis(), dothat(), or dotheother() respectively</lang>
cases[key]() --equivalent to dothis(), dothat(), or dotheother() respectively</syntaxhighlight>


=={{header|Luna}}==
=={{header|Luna}}==


===if-then-else===
===if-then-else===
<lang luna>if char == "<" then Prepend "<" acc else acc</lang>
<syntaxhighlight lang="luna">if char == "<" then Prepend "<" acc else acc</syntaxhighlight>
''(see: [https://github.com/luna/luna/issues/125#issuecomment-365683922 github/luna #125])''
''(see: [https://github.com/luna/luna/issues/125#issuecomment-365683922 github/luna #125])''


===case-of===
===case-of===
<lang luna>class JSON:
<syntaxhighlight lang="luna">class JSON:
...
...
def asText: case self of:
def asText: case self of:
JSONString t: t
JSONString t: t
other: throw "JSON.asText: not a text"</lang>
other: throw "JSON.asText: not a text"</syntaxhighlight>


''(see: [https://github.com/luna/luna/blob/77b1d974cb07528e9f195dd47e177dd497560da1/stdlib/Std/src/Base.luna#L1047-L1050 Std.JSON])''
''(see: [https://github.com/luna/luna/blob/77b1d974cb07528e9f195dd47e177dd497560da1/stdlib/Std/src/Base.luna#L1047-L1050 Std.JSON])''
Line 3,799: Line 4,230:
=={{header|M2000 Interpreter}}==
=={{header|M2000 Interpreter}}==
===If Then Else.if Else===
===If Then Else.if Else===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Module CheckIt {
Read a
Read a
Line 3,837: Line 4,268:
CheckIt 0
CheckIt 0
CheckIt -100
CheckIt -100
</syntaxhighlight>
</lang>


===IF() and IF$() - Ternary===
===IF() and IF$() - Ternary===
One expression evaluated only. We can use If$() to use string expressions
One expression evaluated only. We can use If$() to use string expressions
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
Module Checkit {
Read x
Read x
Line 3,858: Line 4,289:
Checkit 3, 20
Checkit 3, 20


</syntaxhighlight>
</lang>


Ternary can used as Elvis operator (a function here), when a false (or a Nothing, for some kind of objects) evaluated then return something after ->, else return true or the object so if A is object then If(A->,B) return A.
Ternary can used as Elvis operator (a function here), when a false (or a Nothing, for some kind of objects) evaluated then return something after ->, else return true or the object so if A is object then If(A->,B) return A.




<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
Module Checkit {
def a
def a
Line 3,876: Line 4,307:
}
}
Checkit
Checkit
</syntaxhighlight>
</lang>


===Select Case===
===Select Case===
We can use string, and three types of cases (all of them in one case), >1000, 10 to 40, 400
We can use string, and three types of cases (all of them in one case), >1000, 10 to 40, 400
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Module CheckIt {
Read a
Read a
Line 3,922: Line 4,353:
CheckIt -500
CheckIt -500


</syntaxhighlight>
</lang>


===Conditional loops===
===Conditional loops===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
x=10
x=10
While x>0 {
While x>0 {
Line 3,947: Line 4,378:
Until x=10
Until x=10


</syntaxhighlight>
</lang>


===On Goto, On Gosub===
===On Goto, On Gosub===
<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module CheckIt {
Module CheckIt {
For i=1 to 10 {
For i=1 to 10 {
Line 3,981: Line 4,412:
CheckIt
CheckIt


</syntaxhighlight>
</lang>
===If Then line No /label===
===If Then line No /label===
Line numbers are optional and can be in any order, but from start in current block, and if not found then replaced with exit, until search can't continue (at modules/function bounds, we can't jump out of a module or function).
Line numbers are optional and can be in any order, but from start in current block, and if not found then replaced with exit, until search can't continue (at modules/function bounds, we can't jump out of a module or function).


<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
a$="123"
a$="123"
if a$ ~ "12*" then 1000
if a$ ~ "12*" then 1000
Line 3,993: Line 4,424:
1000 Print "ok final"
1000 Print "ok final"
Goto alfa
Goto alfa
</syntaxhighlight>
</lang>


We can jump out of a sub, but we have to use Return to adjust the return stack.Wehn found Sub interpreter execute Exit statement so no need for End or Exit before sub beta()
We can jump out of a sub, but we have to use Return to adjust the return stack.Wehn found Sub interpreter execute Exit statement so no need for End or Exit before sub beta()
Line 3,999: Line 4,430:
We can call beta() using Gosub beta() (not Call, call is for modules and functions). If we have an array beta() then we must use Gosub beta() because interpreter prefer arrays, and raise error "missing ="
We can call beta() using Gosub beta() (not Call, call is for modules and functions). If we have an array beta() then we must use Gosub beta() because interpreter prefer arrays, and raise error "missing ="


<syntaxhighlight lang="m2000 interpreter">
<lang M2000 Interpreter>
Module Checkit {
Module Checkit {
Rem : Dim beta(10) ' remove Rem to get error when call beta() without Gosub
Rem : Dim beta(10) ' remove Rem to get error when call beta() without Gosub
Line 4,020: Line 4,451:
Checkit
Checkit


</syntaxhighlight>
</lang>


=={{header|Make}}==
=={{header|Make}}==
An if condition using pure make (no gmake extensions)
An if condition using pure make (no gmake extensions)
<lang make># make -f do.mk C=mycond if
<syntaxhighlight lang="make"># make -f do.mk C=mycond if
C=0
C=0


Line 4,035: Line 4,466:


false:
false:
@echo "was false."</lang>
@echo "was false."</syntaxhighlight>


Using it
Using it
<lang make>make -f do.mk if C=0
<syntaxhighlight lang="make">make -f do.mk if C=0
> was false.
> was false.


make -f do.mk if C=1
make -f do.mk if C=1
> was true.</lang>
> was true.</syntaxhighlight>


With out using recursion but letting make continue with non-failed
With out using recursion but letting make continue with non-failed
targets even when some of the targets failed (-k)
targets even when some of the targets failed (-k)
<lang make>C=0
<syntaxhighlight lang="make">C=0


if: true false
if: true false
Line 4,056: Line 4,487:
false:
false:
@expr $(C) >/dev/null && exit 1 || exit 0
@expr $(C) >/dev/null && exit 1 || exit 0
@echo "was false."</lang>
@echo "was false."</syntaxhighlight>


Invoking it. Note the use of -k which allows make to evaluate subsequent
Invoking it. Note the use of -k which allows make to evaluate subsequent
targets even when a previous non-related target failed.
targets even when a previous non-related target failed.
<lang make>|make -f do.mk -s -k C=1
<syntaxhighlight lang="make">|make -f do.mk -s -k C=1
was true.
was true.
*** Error code 1
*** Error code 1
|make -f do.mk -s -k C=0
|make -f do.mk -s -k C=0
*** Error code 1
*** Error code 1
was false.</lang>
was false.</syntaxhighlight>


Using gmake
Using gmake


<lang make>A=
<syntaxhighlight lang="make">A=
B=
B=


Line 4,079: Line 4,510:


do:
do:
@echo $(A) .. $(B)</lang>
@echo $(A) .. $(B)</syntaxhighlight>


Using it
Using it
<lang make>|gmake -f if.mk A=1
<syntaxhighlight lang="make">|gmake -f if.mk A=1
1 .. true
1 .. true
|gmake -f if.mk A=0
|gmake -f if.mk A=0
0 .. false</lang>
0 .. false</syntaxhighlight>


=={{header|Maple}}==
=={{header|Maple}}==
Line 4,092: Line 4,523:
=== Conditional statements ===
=== Conditional statements ===
Example syntax for conditional statements:
Example syntax for conditional statements:
<lang Maple>if x > 0 then
<syntaxhighlight lang="maple">if x > 0 then
res := x;
res := x;
else
else
res := -x;
res := -x;
end if;</lang>
end if;</syntaxhighlight>


Example syntax for conditional statements with else-if:
Example syntax for conditional statements with else-if:
<lang Maple>if x = 0 then
<syntaxhighlight lang="maple">if x = 0 then
res := y;
res := y;
elif y = 0 then
elif y = 0 then
Line 4,105: Line 4,536:
else
else
res := sqrt(x^2+y^2);
res := sqrt(x^2+y^2);
end if;</lang>
end if;</syntaxhighlight>


=== Conditional functions ===
=== Conditional functions ===
Line 4,130: Line 4,561:
===If statements===
===If statements===
Example:
Example:
<lang MATLAB>if x == 1
<syntaxhighlight lang="matlab">if x == 1
disp 'x==1';
disp 'x==1';
elseif x > 1
elseif x > 1
Line 4,136: Line 4,567:
else
else
disp 'x<1';
disp 'x<1';
end</lang>
end</syntaxhighlight>
===Switch statements===
===Switch statements===
Example:
Example:
<lang MATLAB>switch x
<syntaxhighlight lang="matlab">switch x
case 1
case 1
disp 'Hello';
disp 'Hello';
Line 4,146: Line 4,577:
otherwise
otherwise
disp 'Skynet Active';
disp 'Skynet Active';
end</lang>
end</syntaxhighlight>


=={{header|Maxima}}==
=={{header|Maxima}}==
<lang maxima>if test1 then (...) elseif test2 then (...) else (...);</lang>
<syntaxhighlight lang="maxima">if test1 then (...) elseif test2 then (...) else (...);</syntaxhighlight>


=={{header|MAXScript}}==
=={{header|MAXScript}}==
===if===
===if===
<lang maxscript>if x == 1 then
<syntaxhighlight lang="maxscript">if x == 1 then
(
(
print "one"
print "one"
Line 4,164: Line 4,595:
(
(
print "Neither one or two"
print "Neither one or two"
)</lang>
)</syntaxhighlight>


===case===
===case===
'''Form one'''
'''Form one'''
<lang maxscript>case x of
<syntaxhighlight lang="maxscript">case x of
(
(
1: (print "one")
1: (print "one")
2: (print "two")
2: (print "two")
default: (print "Neither one or two")
default: (print "Neither one or two")
)</lang>
)</syntaxhighlight>
'''Form two'''
'''Form two'''
<lang maxscript>case of
<syntaxhighlight lang="maxscript">case of
(
(
(x == 1): (print "one")
(x == 1): (print "one")
(x == 2): (print "two")
(x == 2): (print "two")
default: (print "Neither one or two")
default: (print "Neither one or two")
)</lang>
)</syntaxhighlight>


=={{header|MBS}}==
=={{header|MBS}}==


<lang MBS>INT x;
<syntaxhighlight lang="mbs">INT x;
x:=0;
x:=0;
IF x = 1 THEN
IF x = 1 THEN
Line 4,190: Line 4,621:
ELSE
ELSE
! Do something else
! Do something else
ENDIF;</lang>
ENDIF;</syntaxhighlight>


=={{header|MDL}}==
=={{header|MDL}}==
Line 4,200: Line 4,631:
An "else" part is traditionally implemented as a final clause whose first element is an atom, like <code>T</code>, since atoms always evaluate to themselves and are always true.
An "else" part is traditionally implemented as a final clause whose first element is an atom, like <code>T</code>, since atoms always evaluate to themselves and are always true.


<lang MDL><COND (<==? .X 1> <PRINC "one">)
<syntaxhighlight lang="mdl"><COND (<==? .X 1> <PRINC "one">)
(<==? .X 2> <PRINC "two">)
(<==? .X 2> <PRINC "two">)
(T <PRINC "something else">)></lang>
(T <PRINC "something else">)></syntaxhighlight>


===AND and OR===
===AND and OR===
Line 4,208: Line 4,639:
These short-circuiting boolean functions can also be used as simple conditionals.
These short-circuiting boolean functions can also be used as simple conditionals.


<lang MDL>;"Negate X if its value is less than 0"
<syntaxhighlight lang="mdl">;"Negate X if its value is less than 0"
<AND <L? .X 0> <SET X <- .X>>>
<AND <L? .X 0> <SET X <- .X>>>


;"Print a message unless the quiet flag is set"
;"Print a message unless the quiet flag is set"
<OR .QUIET? <PRINC "Finished">></lang>
<OR .QUIET? <PRINC "Finished">></syntaxhighlight>


=={{header|Metafont}}==
=={{header|Metafont}}==


<lang metafont>if conditionA:
<syntaxhighlight lang="metafont">if conditionA:
% do something
% do something
elseif conditionB:
elseif conditionB:
Line 4,223: Line 4,654:
else:
else:
% do this
% do this
fi;</lang>
fi;</syntaxhighlight>


The particularity of <tt>if</tt> construct in Metafont is that it can be part of an expression, and the "do something" <cite>does not need to fit into the syntactic structure</cite>. E.g. we can write something like
The particularity of <tt>if</tt> construct in Metafont is that it can be part of an expression, and the "do something" <cite>does not need to fit into the syntactic structure</cite>. E.g. we can write something like


<lang metafont>b := if a > 5: 3 + else: 2 - fi c;</lang>
<syntaxhighlight lang="metafont">b := if a > 5: 3 + else: 2 - fi c;</syntaxhighlight>


Alone, the code <tt>3 +</tt> does not mean anything; but once the condition is evaluated, the whole expression must become "correct"; e.g. if <tt>a > 5</tt>, the expression will be
Alone, the code <tt>3 +</tt> does not mean anything; but once the condition is evaluated, the whole expression must become "correct"; e.g. if <tt>a > 5</tt>, the expression will be
Line 4,236: Line 4,667:
=={{header|min}}==
=={{header|min}}==
{{works with|min|0.19.6}}
{{works with|min|0.19.6}}
<lang min>(true) ("I'm true") ("I'm false") if ; If first quotation evaluates to true,
<syntaxhighlight lang="min">(true) ("I'm true") ("I'm false") if ; If first quotation evaluates to true,
; evaluate second quotation.
; evaluate second quotation.
; Otherwise, evaluate the third.
; Otherwise, evaluate the third.
Line 4,247: Line 4,678:
((3 <) ("Smaller than 3" puts!)) ; quotation if the first quotation
((3 <) ("Smaller than 3" puts!)) ; quotation if the first quotation
((true) ("Exactly 3" puts!)) ; evaluates to true. Otherwise, move
((true) ("Exactly 3" puts!)) ; evaluates to true. Otherwise, move
) case ; on to the next one.</lang>
) case ; on to the next one.</syntaxhighlight>


=={{header|MiniScript}}==
=={{header|MiniScript}}==
MiniScript supports if/else-if/else, with arbitrary number of else-if sections when in block form:
MiniScript supports if/else-if/else, with arbitrary number of else-if sections when in block form:


<lang MiniScript>x = 42
<syntaxhighlight lang="miniscript">x = 42
if x < 10 then
if x < 10 then
print "small"
print "small"
Line 4,261: Line 4,692:
else
else
print "just right"
print "just right"
end if</lang>
end if</syntaxhighlight>


It also supports single-line if or if/else statements (though no else-if sections are permitted in this case):
It also supports single-line if or if/else statements (though no else-if sections are permitted in this case):


<lang MiniScript>x = 42
<syntaxhighlight lang="miniscript">x = 42
if x < 50 then print "small" else print "big"</lang>
if x < 50 then print "small" else print "big"</syntaxhighlight>


Finally, like many other languages, MiniScript uses short-circuit evaluation, a form of implicit branching where the rest of a boolean expression is not evaluated at all if the truth value can already be determined.
Finally, like many other languages, MiniScript uses short-circuit evaluation, a form of implicit branching where the rest of a boolean expression is not evaluated at all if the truth value can already be determined.


<lang MiniScript>isSmall = function(x)
<syntaxhighlight lang="miniscript">isSmall = function(x)
print "checking smallness"
print "checking smallness"
return x < 40
return x < 40
Line 4,280: Line 4,711:
end function
end function


isSmall(10) or isBig(100)</lang>
isSmall(10) or isBig(100)</syntaxhighlight>


{{out}}
{{out}}
<pre>checking smallness</pre>
<pre>checking smallness</pre>

=={{header|MIPS Assembly}}==
MIPS is a bit unusual in that it doesn't have "flags" per se. Every branch instruction takes one or more registers as an operand and does the comparison there.
===If/Else===
<syntaxhighlight lang="mips">BEQ $t0,$t1,Label ;branch to label if $t0 = $t1. If not, fallthrough to the instruction after the delay slot.
nop ;branch delay slot</syntaxhighlight>

The nice thing about this is, unlike most CISC architectures, you can make some important calculation that you'll use as a condition to branch, and before actually branching, do some other unrelated stuff without the CPU forgetting the correct way to branch. The following (rather contrived) example displays this idea in action:

<syntaxhighlight lang="mips">addu $t0,$t1 ;I'm going to branch based off this addition, but there's other things I want to do first.
lw $t3,($t4)
nop ;load delay slot
BEQ $t0,$t1,Label
nop ;branch delay slot</syntaxhighlight>

If you're wondering how a branch delay slot impacts the comparison, it doesn't. The delay slot instruction executes after the comparison has been made and CPU has decided whether to branch. (See [[MIPS Assembly]] for more info on what delay slots are.) As a result, code like this can introduce subtle off-by-one errors:

<syntaxhighlight lang="mips">BNEZ $t0,loop ;branch if $t0 is nonzero.
subiu $t0,1 ;this finishes at the same time the jumpback occurs.</syntaxhighlight>

MIPS also comes with greater than/less than constructs built-in.
* <code>BLT</code> <tt><</tt>
* <code>BLE</code> <tt><=</tt>
* <code>BGT</code> <tt>></tt>
* <code>BGE</code> <tt>>=</tt>

Adding a <code>U</code> to the end of any of the above makes the comparison unsigned. Remember, in assembly ''there are no signed/unsigned numbers, only signed/unsigned comparisons!''

<syntaxhighlight lang="mips">BGEU $t0,$t1,label ;branch if $t0 >= $t1, treating both as unsigned.
NOP
BLT $t7,$t3,label ;branch if $t7 < $t3, treating both as signed
NOP</syntaxhighlight>

Like most assembly languages, the label operand of a branch instruction is a hardware abstraction that allows you to more easily tell the assembler where you want the branch to go without having to figure it out yourself. In reality, the actual operand that the label represents is not an absolute address, but a calculated signed offset that is added to the program counter. Therefore there is a limit on how far away you can branch. Given that MIPS is a 32-bit CPU at a minimum, the maximum distance is very generous and you're extremely unlikely to ever need to branch further than it allows.

===Switch===
As usual, the easiest way to implement <code>switch</code> is with a lookup table, be it a table of function pointers or just a simple array. The example below is a bit abstract but you should get the idea.

<syntaxhighlight lang="mips">switchExample:
;this implementation assumes that all destinations end in jr ra, so you'll need to arrive here with JAL switchExample.
;$t0 = index (must be a multiple of 4 or the program counter will jump to a location that's not guaranteed to properly return.)
la cases,$t1
addiu $t1,$t0 ;MIPS can't do variable indexed offsetting so we have to add the offset ourselves.
lw $t8,($t1) ;dereference the pointer, $t8 contains the address we wish to "call"
nop
jr $t8 ;jump to the selected destination.
nop

cases:
.word foo
.word bar
.word baz

foo:
;code goes here
jr ra

bar:
;code goes here
jr ra

baz:
;code goes here
jr ra</syntaxhighlight>

If you're going to do this for real, you'll want some sort of bounds check on the index. That way, if the cases are out of bounds you can conditionally change the index to the address of your default case.


=={{header|МК-61/52}}==
=={{header|МК-61/52}}==
Conditional jumps are done by four instructions, comparing the register X with zero:
Conditional jumps are done by four instructions, comparing the register X with zero:


<lang>x=0 XX
<syntaxhighlight lang="text">x=0 XX
x#0 XX
x#0 XX
x>=0 XX
x>=0 XX
x<0 XX</lang>
x<0 XX</syntaxhighlight>


'''XX''' here is the address to which to make the jump in the event of failure of this condition (for this reason, these instructions are also called checks).
'''XX''' here is the address to which to make the jump in the event of failure of this condition (for this reason, these instructions are also called checks).
Line 4,297: Line 4,794:
=={{header|Modula-2}}==
=={{header|Modula-2}}==
===if-then-else===
===if-then-else===
<lang modula2>IF i = 1 THEN
<syntaxhighlight lang="modula2">IF i = 1 THEN
InOut.WriteString('One')
InOut.WriteString('One')
ELSIF i = 2 THEN
ELSIF i = 2 THEN
Line 4,305: Line 4,802:
ELSE
ELSE
InOut.WriteString('Other')
InOut.WriteString('Other')
END;</lang>
END;</syntaxhighlight>


===Case===
===Case===
<lang modula2>CASE i OF
<syntaxhighlight lang="modula2">CASE i OF
1 : InOut.WriteString('One')
1 : InOut.WriteString('One')
| 2 : InOut.WriteString('Two')
| 2 : InOut.WriteString('Two')
Line 4,314: Line 4,811:
ELSE
ELSE
InOut.WriteString('Other')
InOut.WriteString('Other')
END</lang>
END</syntaxhighlight>


=={{header|Modula-3}}==
=={{header|Modula-3}}==
===if-then-else===
===if-then-else===
<lang modula3>IF Foo = TRUE THEN
<syntaxhighlight lang="modula3">IF Foo = TRUE THEN
Bar();
Bar();
ELSE
ELSE
Baz();
Baz();
END;</lang>
END;</syntaxhighlight>


<lang modula3>IF Foo = "foo" THEN
<syntaxhighlight lang="modula3">IF Foo = "foo" THEN
Bar();
Bar();
ELSIF Foo = "bar" THEN
ELSIF Foo = "bar" THEN
Line 4,332: Line 4,829:
ELSE
ELSE
Zeepf();
Zeepf();
END;</lang>
END;</syntaxhighlight>


===Case===
===Case===
<lang modula3>CASE Foo OF
<syntaxhighlight lang="modula3">CASE Foo OF
| 1 => IO.Put("One\n");
| 1 => IO.Put("One\n");
| 2 => IO.Put("Two\n");
| 2 => IO.Put("Two\n");
Line 4,341: Line 4,838:
ELSE
ELSE
IO.Put("Something\n");
IO.Put("Something\n");
END;</lang>
END;</syntaxhighlight>
===Type-case===
===Type-case===
<tt>TYPECASE</tt> is used on reference types to perform different operations, depending on what it is a reference to.
<tt>TYPECASE</tt> is used on reference types to perform different operations, depending on what it is a reference to.
<lang modula3>TYPECASE ref OF
<syntaxhighlight lang="modula3">TYPECASE ref OF
| NULL => IO.Put("Null\n");
| NULL => IO.Put("Null\n");
| CHAR => IO.Put("Char\n");
| CHAR => IO.Put("Char\n");
Line 4,350: Line 4,847:
ELSE
ELSE
IO.Put("Something\n");
IO.Put("Something\n");
END;</lang>
END;</syntaxhighlight>


=={{header|Monicelli}}==
=={{header|Monicelli}}==
Monicelli has a single conditional structure that covers both if/then/else and switch/case
Monicelli has a single conditional structure that covers both if/then/else and switch/case
<lang monicelli>
<syntaxhighlight lang="monicelli">
che cosè var? # switch var
che cosè var? # switch var
minore di 0: # case var < 0
minore di 0: # case var < 0
Line 4,363: Line 4,860:
...
...
e velocità di esecuzione
e velocità di esecuzione
</syntaxhighlight>
</lang>


=={{header|Morfa}}==
=={{header|Morfa}}==
===if-then-else===
===if-then-else===
<lang morfa>
<syntaxhighlight lang="morfa">
if(s == "Hello World")
if(s == "Hello World")
{
{
Line 4,378: Line 4,875:
baz();
baz();
}
}
</syntaxhighlight>
</lang>
Morfa supports [[wp:Short-circuit_evaluation|short-circuit evaluation]], so <tt>obj.foo()</tt> won't be executed if <tt>obj</tt> is null:
Morfa supports [[wp:Short-circuit_evaluation|short-circuit evaluation]], so <tt>obj.foo()</tt> won't be executed if <tt>obj</tt> is null:
<lang morfa>
<syntaxhighlight lang="morfa">
if(obj isnt null and obj.foo())
if(obj isnt null and obj.foo())
doSomething();
doSomething();
</syntaxhighlight>
</lang>


===ternary===
===ternary===
<lang morfa>
<syntaxhighlight lang="morfa">
var t = if(s == "Hello World") foo() else bar();
var t = if(s == "Hello World") foo() else bar();
</syntaxhighlight>
</lang>


===switch===
===switch===
There is no fallthrough, <tt>break</tt> statement does not have any special meaning inside a switch. If the <tt>break</tt> is in a loop then <tt>break</tt> exits that loop, otherwise it is invalid.
There is no fallthrough, <tt>break</tt> statement does not have any special meaning inside a switch. If the <tt>break</tt> is in a loop then <tt>break</tt> exits that loop, otherwise it is invalid.
<lang morfa>
<syntaxhighlight lang="morfa">
switch (num)
switch (num)
{
{
Line 4,404: Line 4,901:
result = "a lot";
result = "a lot";
}
}
</syntaxhighlight>
</lang>


=={{header|MUMPS}}==
=={{header|MUMPS}}==
===If / I and ELSE / E===
===If / I and ELSE / E===
<lang MUMPS> IF A list-of-MUMPS-commands</lang>
<syntaxhighlight lang="mumps"> IF A list-of-MUMPS-commands</syntaxhighlight>
<p>All standard versions of MUMPS allow a ELSE command, which can be abbreviated to E. Instead of depending on the previous IF command, the ELSE command depends on the value of the system variable $TEST. $TEST is set whenever an IF command is executed, and whenever a timeout is specified. Since $TEST could be changed and not noticed by an unwary programmer it is important to remember when writing code.
<p>All standard versions of MUMPS allow a ELSE command, which can be abbreviated to E. Instead of depending on the previous IF command, the ELSE command depends on the value of the system variable $TEST. $TEST is set whenever an IF command is executed, and whenever a timeout is specified. Since $TEST could be changed and not noticed by an unwary programmer it is important to remember when writing code.


For example with the code:
For example with the code:
<lang MUMPS> IF T DO SUBROUTINE
<syntaxhighlight lang="mumps"> IF T DO SUBROUTINE
ELSE DO SOMETHING</lang>
ELSE DO SOMETHING</syntaxhighlight>
It isn't clear whether $TEST is changed or not, because the function SUBROUTINE might change the value of $TEST by using a timeout or an IF command.
It isn't clear whether $TEST is changed or not, because the function SUBROUTINE might change the value of $TEST by using a timeout or an IF command.


It is better to explicitly set the $TEST special variable using IF 1 for example:
It is better to explicitly set the $TEST special variable using IF 1 for example:
<syntaxhighlight lang="mumps">
<lang MUMPS>
IF T DO SUBROUTINE IF 1
IF T DO SUBROUTINE IF 1
ELSE DO SOMETHING</lang>
ELSE DO SOMETHING</syntaxhighlight>


Another common practice is to use the argumentless DO, as it pushes the $TEST variable onto a stack and replaces it after the "dot block" is complete. An example of this code is:
Another common practice is to use the argumentless DO, as it pushes the $TEST variable onto a stack and replaces it after the "dot block" is complete. An example of this code is:


<syntaxhighlight lang="mumps">
<lang MUMPS>
IF T DO
IF T DO
. DO SUBROUTINE
. DO SUBROUTINE
ELSE DO SOMETHING</lang>
ELSE DO SOMETHING</syntaxhighlight>




Line 4,432: Line 4,929:


===$Select / $S===
===$Select / $S===
<lang MUMPS> WRITE $SELECT(1=2:"Unequal",1=3:"More unequal",1:"Who cares?")</lang>
<syntaxhighlight lang="mumps"> WRITE $SELECT(1=2:"Unequal",1=3:"More unequal",1:"Who cares?")</syntaxhighlight>
<p>The $Select statement contains couplets separated by commas, which each consist of a conditional test, followed by a colon, and what to return if that condition is true.
<p>The $Select statement contains couplets separated by commas, which each consist of a conditional test, followed by a colon, and what to return if that condition is true.
The first part of the couplet must be a truth value. Since only zero is interpreted a truth value of false, any nonzero numbers when interpreted as a truth value will be considered to be true. Typically the number 1 is used as an explicitly true condition and is placed in the final couplet. If no conditions are true, the program's error processing is invoked. The very first condition that is true is the result of the expression. In the example, the value will always be "Unequal" as it is always true, and the rest of the $SELECT will never be used.</p>
The first part of the couplet must be a truth value. Since only zero is interpreted a truth value of false, any nonzero numbers when interpreted as a truth value will be considered to be true. Typically the number 1 is used as an explicitly true condition and is placed in the final couplet. If no conditions are true, the program's error processing is invoked. The very first condition that is true is the result of the expression. In the example, the value will always be "Unequal" as it is always true, and the rest of the $SELECT will never be used.</p>


===(command postconditional i.e. colon/:===
===(command postconditional i.e. colon/:===
<lang MUMPS> SET:(1=1) SKY="Blue"
<syntaxhighlight lang="mumps"> SET:(1=1) SKY="Blue"
GOTO:ReallyGo LABEL
GOTO:ReallyGo LABEL
QUIT:LoopDone
QUIT:LoopDone
WRITE:NotLastInSet ","</lang>
WRITE:NotLastInSet ","</syntaxhighlight>
<p>Most commands can take a "postconditional", which is a colon and some conditional statement immediately after the command followed by the command separator (space) and the usual arguments of the command. The command is executed only if the conditional statement evaluates to true.</p>
<p>Most commands can take a "postconditional", which is a colon and some conditional statement immediately after the command followed by the command separator (space) and the usual arguments of the command. The command is executed only if the conditional statement evaluates to true.</p>
<p>The exceptions are FOR, IF, and ELSE.
<p>The exceptions are FOR, IF, and ELSE.
Line 4,459: Line 4,956:
=={{header|Nanoquery}}==
=={{header|Nanoquery}}==
===if-then-else===
===if-then-else===
<lang nanoquery>if x = 0
<syntaxhighlight lang="nanoquery">if x = 0
foo()
foo()
else if x = 1
else if x = 1
Line 4,467: Line 4,964:
else
else
boz()
boz()
end</lang>
end</syntaxhighlight>


=={{header|Nemerle}}==
=={{header|Nemerle}}==
===if-else===
===if-else===
<tt>if (cond) <then> else <this>;</tt> is an expression in Nemerle, requiring both keywords (<tt>if</tt> and <tt>else</tt>) to be valid. <tt>when</tt> and <tt>unless</tt> are macros for which <this> = null. <tt>cond</tt> must be an expression that evaluates to a bool (true|false), other types aren't automatically assigned truth or falsehood as in some languages.
<tt>if (cond) <then> else <this>;</tt> is an expression in Nemerle, requiring both keywords (<tt>if</tt> and <tt>else</tt>) to be valid. <tt>when</tt> and <tt>unless</tt> are macros for which <this> = null. <tt>cond</tt> must be an expression that evaluates to a bool (true|false), other types aren't automatically assigned truth or falsehood as in some languages.
<lang Nemerle>if (the_answer == 42) FindQuestion() else Foo();
<syntaxhighlight lang="nemerle">if (the_answer == 42) FindQuestion() else Foo();
when (stock.price < buy_order) stock.Buy();
when (stock.price < buy_order) stock.Buy();
unless (text < "") Write(text);</lang>
unless (text < "") Write(text);</syntaxhighlight>


===match===
===match===
Much cleaner than stacked if-else's, similar in some ways to switch-case (but more flexible). See [http://nemerle.org/wiki/index.php?title=Quick_Guide#Pattern_Matching here], [http://nemerle.org/wiki/index.php?title=Grok_Variants_and_matching#Matching here], or, for extra detail, [http://nemerle.org/wiki/index.php?title=Patterns_%28ref%29 the reference].
Much cleaner than stacked if-else's, similar in some ways to switch-case (but more flexible). See [http://nemerle.org/wiki/index.php?title=Quick_Guide#Pattern_Matching here], [http://nemerle.org/wiki/index.php?title=Grok_Variants_and_matching#Matching here], or, for extra detail, [http://nemerle.org/wiki/index.php?title=Patterns_%28ref%29 the reference].
<lang Nemerle>match(x)
<syntaxhighlight lang="nemerle">match(x)
{
{
|1 => "x is one"
|1 => "x is one"
|x when (x < 5) => "x is less than five"
|x when (x < 5) => "x is less than five"
|_ => "x is at least five"
|_ => "x is at least five"
}</lang>
}</syntaxhighlight>


=={{header|NetRexx}}==
=={{header|NetRexx}}==
===IF-THEN-ELSE===
===IF-THEN-ELSE===
<lang NetRexx>-- simple construct
<syntaxhighlight lang="netrexx">-- simple construct
if logicalCondition then conditionWasTrue()
if logicalCondition then conditionWasTrue()
else conditionWasFalse()
else conditionWasFalse()
Line 4,520: Line 5,017:
conditionsWereFalse()
conditionsWereFalse()
...
...
end</lang>
end</syntaxhighlight>


===SELECT===
===SELECT===
Line 4,529: Line 5,026:


<tt>OTHERWISE</tt> is optional but may result in run-time errors (<tt>netrexx.lang.NoOtherwiseException</tt>) if it isn't provided.
<tt>OTHERWISE</tt> is optional but may result in run-time errors (<tt>netrexx.lang.NoOtherwiseException</tt>) if it isn't provided.
<lang NetRexx>-- simple construct
<syntaxhighlight lang="netrexx">-- simple construct
select
select
when logicalCondition1 then condition1()
when logicalCondition1 then condition1()
Line 4,544: Line 5,041:
catch ex1 = NoOtherwiseException
catch ex1 = NoOtherwiseException
ex1.printStackTrace()
ex1.printStackTrace()
end</lang>
end</syntaxhighlight>


===SELECT-CASE===
===SELECT-CASE===
<lang NetRexx>-- simple construct
<syntaxhighlight lang="netrexx">-- simple construct
select case cc
select case cc
when 'A' then say 'the case is A'
when 'A' then say 'the case is A'
when 'B' then say 'the case is B'
when 'B' then say 'the case is B'
otherwise say 'selection not recognized'
otherwise say 'selection not recognized'
end</lang>
end</syntaxhighlight>


'''Note:''' This is functionally equivalent to:
'''Note:''' This is functionally equivalent to:
<lang NetRexx>select
<syntaxhighlight lang="netrexx">select
when cc == 'A' then ...
when cc == 'A' then ...
when cc == 'B' then ...
when cc == 'B' then ...
...</lang>
...</syntaxhighlight>


===SELECT Optional Features===
===SELECT Optional Features===
Line 4,571: Line 5,068:


<tt>PROTECT</tt> is used for program concurrency &amp; synchonization in multi-threaded programs.
<tt>PROTECT</tt> is used for program concurrency &amp; synchonization in multi-threaded programs.
<lang NetRexx>select label sl protect cc case cc
<syntaxhighlight lang="netrexx">select label sl protect cc case cc
when 'A' then do
when 'A' then do
say 'the case is A'
say 'the case is A'
Line 4,590: Line 5,087:
say 'selection done'
say 'selection done'
say 'TTFN'
say 'TTFN'
end sl</lang>
end sl</syntaxhighlight>


=={{header|newLISP}}==
=={{header|newLISP}}==
===if===
===if===
'''Interpreter:''' [[newLISP]] v.9.0
'''Interpreter:''' [[newLISP]] v.9.0
<lang lisp>(set 'x 1)
<syntaxhighlight lang="lisp">(set 'x 1)
(if (= x 1) (println "is 1"))</lang>
(if (= x 1) (println "is 1"))</syntaxhighlight>
A third expression can be used as an else.
A third expression can be used as an else.
<lang lisp>(set 'x 0)
<syntaxhighlight lang="lisp">(set 'x 0)
(if (= x 1) (println "is 1") (println "not 1"))</lang>
(if (= x 1) (println "is 1") (println "not 1"))</syntaxhighlight>


=={{header|Nim}}==
=={{header|Nim}}==
===if-then-else===
===if-then-else===
<lang nim>if x == 0:
<syntaxhighlight lang="nim">if x == 0:
foo()
foo()
elif x == 1:
elif x == 1:
Line 4,610: Line 5,107:
baz()
baz()
else:
else:
boz()</lang>
boz()</syntaxhighlight>


===case-of===
===case-of===
<lang nim>case x
<syntaxhighlight lang="nim">case x
of 0:
of 0:
foo()
foo()
Line 4,621: Line 5,118:
baz()
baz()
else: # All cases must be covered
else: # All cases must be covered
boz()</lang>
boz()</syntaxhighlight>


=={{header|Objeck}}==
=={{header|Objeck}}==
===if-else===
===if-else===
<lang objeck>
<syntaxhighlight lang="objeck">
a := GetValue();
a := GetValue();
if(a < 5) {
if(a < 5) {
Line 4,636: Line 5,133:
"equal to 5"->PrintLine();
"equal to 5"->PrintLine();
};
};
</syntaxhighlight>
</lang>


===select===
===select===
<lang objeck>
<syntaxhighlight lang="objeck">
a := GetValue();
a := GetValue();
select(a) {
select(a) {
Line 4,654: Line 5,151:
}
}
};
};
</syntaxhighlight>
</lang>


=={{header|Object Pascal}}==
=={{header|Object Pascal}}==
Line 4,667: Line 5,164:
===if-then-else===
===if-then-else===


<lang ocaml>let condition = true
<syntaxhighlight lang="ocaml">let condition = true


if condition then
if condition then
1 (* evaluate something *)
1 (* evaluate something *)
else
else
2 (* evaluate something *)</lang>
2 (* evaluate something *)</syntaxhighlight>


If-then-else has higher precedence than <tt>;</tt> (the semicolon), so if you want to have multiple statements with side effects inside an "if", you have to enclose it with <tt>begin</tt>...<tt>end</tt> or with parentheses:
If-then-else has higher precedence than <tt>;</tt> (the semicolon), so if you want to have multiple statements with side effects inside an "if", you have to enclose it with <tt>begin</tt>...<tt>end</tt> or with parentheses:


<lang ocaml>if condition then begin
<syntaxhighlight lang="ocaml">if condition then begin
(); (* evaluate things for side effects *)
(); (* evaluate things for side effects *)
5
5
Line 4,683: Line 5,180:
(); (* evaluate things for side effects *)
(); (* evaluate things for side effects *)
42
42
end</lang>
end</syntaxhighlight>


===match-with===
===match-with===
<lang ocaml>match expression with
<syntaxhighlight lang="ocaml">match expression with
| 0 -> () (* evaluate something *)
| 0 -> () (* evaluate something *)
| 1 -> () (* evaluate something *)
| 1 -> () (* evaluate something *)
| n when n mod 2 = 0 -> () (* evaluate something *)
| n when n mod 2 = 0 -> () (* evaluate something *)
| _ -> () (* evaluate something *)</lang>
| _ -> () (* evaluate something *)</syntaxhighlight>


The first <tt>|</tt> is optional, and usually omitted.
The first <tt>|</tt> is optional, and usually omitted.
Line 4,700: Line 5,197:
=={{header|Octave}}==
=={{header|Octave}}==
'''if-then-elseif-else'''
'''if-then-elseif-else'''
<lang octave>if (condition)
<syntaxhighlight lang="octave">if (condition)
% body
% body
endif
endif
Line 4,716: Line 5,213:
else
else
% otherwise body
% otherwise body
endif</lang>
endif</syntaxhighlight>


'''switch'''
'''switch'''
<lang octave>switch( expression )
<syntaxhighlight lang="octave">switch( expression )
case label1
case label1
% code for label1
% code for label1
Line 4,726: Line 5,223:
otherwise
otherwise
% none of the previous
% none of the previous
endswitch</lang>
endswitch</syntaxhighlight>


''Labels'' can be numeric or string, or cells to group several possibilities:
''Labels'' can be numeric or string, or cells to group several possibilities:


<lang octave>switch ( x )
<syntaxhighlight lang="octave">switch ( x )
case 1
case 1
disp("it is 1");
disp("it is 1");
Line 4,737: Line 5,234:
otherwise
otherwise
disp("unknown!");
disp("unknown!");
endswitch</lang>
endswitch</syntaxhighlight>


=={{header|Oforth}}==
=={{header|Oforth}}==
Line 4,743: Line 5,240:
Conditional structures are :
Conditional structures are :


<lang Oforth>aBoolean ifTrue: [ ...]
<syntaxhighlight lang="oforth">aBoolean ifTrue: [ ...]
aBoolean ifFalse: [ ... ]
aBoolean ifFalse: [ ... ]
aObject ifNull: [ ... ]
aObject ifNull: [ ... ]
aObject ifNotNull: [ ... ]
aObject ifNotNull: [ ... ]
aObject ifZero: [ ... ]</lang>
aObject ifZero: [ ... ]</syntaxhighlight>


Each conditional structure consume the object on the top of the stack.
Each conditional structure consume the object on the top of the stack.
Each conditional structure can be followed by a else block
Each conditional structure can be followed by a else block
<lang Oforth>else: [ ... ]</lang>
<syntaxhighlight lang="oforth">else: [ ... ]</syntaxhighlight>


Example :
Example :


<lang Oforth>Number virtual: sgn
<syntaxhighlight lang="oforth">Number virtual: sgn
self isPositive
self isPositive
ifTrue: [ self ==0 ifTrue: [ 0 ] else: [ 1 ] ]
ifTrue: [ self ==0 ifTrue: [ 0 ] else: [ 1 ] ]
else: [ -1 ] ;</lang>
else: [ -1 ] ;</syntaxhighlight>


=={{header|Ol}}==
=={{header|Ol}}==
if-then, the simplest conditional primitive.
if-then, the simplest conditional `if` primitive.
<lang scheme>
<syntaxhighlight lang="scheme">
(if (= (* 2 2) 4) (print "if-then: equal"))
(if (= (* 2 2) 4)
(if (= (* 2 2) 6) (print "if-then: non equal"))
(print "if-then: equal"))
(if (= (* 2 2) 6)
(print "if-then: should not be printed"))
; ==> if-then: equal
; ==> if-then: equal
</syntaxhighlight>
</lang>


if-then-else, the full conditional 'if' primitive.
if-then-else, the full conditional `if` primitive.
<lang scheme>
<syntaxhighlight lang="scheme">
(if (= (* 2 2) 4) (print "if-then-else: equal") (print "if-then-else: non equal"))
(if (= (* 2 2) 4)
(if (= (* 2 2) 6) (print "if-then-else: non equal") (print "if-then-else: i don't know"))
(print "if-then-else: equal")
(print "if-then-else: non equal"))
; ==> if-then-else: equal
; ==> if-then-else: equal
; ==> if-then-else: i don't know
</lang>


(if (= (* 2 2) 6)
unless, the opposite for 'if'.
(print "if-then-else: equal")
<lang scheme>
(unless (= (* 2 2) 4) (print "unless: non equal"))
(print "if-then-else: non equal"))
; ==> if-then-else: non equal
(unless (= (* 2 2) 6) (print "unless: i don't know"))
</syntaxhighlight>
(unless (= (* 2 2) 4) (print "unless: non equal") (print "unless: equal"))

(unless (= (* 2 2) 6) (print "unless: i don't know") (print "unless: non equal"))
when and unless, the simplification of `if` without `begin`
; ==> unless: i don't know
<syntaxhighlight lang="scheme">
; ==> unless: equal
(when (= (* 2 2) 4)
; ==> unless: i don't know
(print "when: ..just do something..")
</lang>
(print "when: equal"))
; ==> when: ..just do something..
; ==> when: equal

(unless (= (* 2 2) 6)
(print "unless: ..just do something..")
(print "unless: not equal"))
; ==> unless: ..just do something..
; ==> unless: not equal
</syntaxhighlight>

if-then-else, extended conditional `if` primitive.
<syntaxhighlight lang="scheme">
(if (= (* 2 2) 4)
(print "if-then-else*: equal")
else
(print "if-then-else*: ..just do something..")
(print "if-then-else*: non equal"))
; ==> if-then-else*: equal

(if (= (* 2 2) 4)
then
(print "if-then-else*: ..just do something..")
(print "if-then-else*: equal")
else
(print "if-then-else*: ..just do something..")
(print "if-then-else*: non equal"))
; ==> if-then-else*: ..just do something..
; ==> if-then-else*: equal

(if (= (* 2 2) 4) ; same as `when`
then
(print "if-then-else*: ..just do something..")
(print "if-then-else*: equal"))
; ==> if-then-else*: ..just do something..
; ==> if-then-else*: equal
</syntaxhighlight>


case, the sequence of comparing values.
case, the sequence of comparing values.
<lang scheme>
<syntaxhighlight lang="scheme">
(case (* 2 2)
(case (* 2 2)
(3
(3 ; exact number
(print "case: 3"))
(print "case: 3"))
(4
(4 ; exact number
(print "case: 4"))
(print "case: 4"))
((5 6 7)
((5 6 7) ; list of numbers
(print "case: 5 or 6 or 7"))
(print "case: 5 or 6 or 7"))
(else
(else
(print "case: i don't know")))
(print "case: i don't know")))
; ==> case: 4
; ==> case: 4
</lang>


; extended case with usable else
additionally, case can select vectors with variables filling
(case (* 2 2)
<lang scheme>
(3 ; exact number
(case (vector 'selector 1 2 3)
(print "case: 3"))
(else => (lambda (num)
(print "case: real value is " num))))
; ==> case: real value is 4

(case (* 2 2)
(3 ; exact number
(print "case: 3"))
(else is num
(print "case: real value is " num)))
; ==> case: real value is 4

; extended case with vectors
(case ['selector 1 2 3]
(['case1 x y]
(['case1 x y]
(print "case: case1 " x ", " y))
(print "case: case1 " x ", " y))
Line 4,811: Line 5,359:
(else
(else
(print "case: i don't know")))
(print "case: i don't know")))
; ==> tuple-case: selector 1, 2, 3
; ==> case: selector 1, 2, 3
</syntaxhighlight>
</lang>


cond, the sequnce of comparators.
cond, the sequnce of comparators.
<lang scheme>
<syntaxhighlight lang="scheme">
(cond
(cond
((= (* 2 2) 4)
((= (* 2 2) 4)
Line 4,824: Line 5,372:
(print "cond: i don't know")))
(print "cond: i don't know")))
; ==> cond: equal
; ==> cond: equal
</syntaxhighlight>
</lang>


case-lambda, selecting the lambda based on arguments count.
case-lambda, selecting the lambda based on arguments count.
<lang scheme>
<syntaxhighlight lang="scheme">
(define smart (case-lambda
(define smart (case-lambda
((x)
((x)
Line 4,838: Line 5,386:
(smart 1 2) ; ==> 1, 2, -
(smart 1 2) ; ==> 1, 2, -
(smart 1 2 3) ; ==> 1, 2, 3
(smart 1 2 3) ; ==> 1, 2, 3
</syntaxhighlight>
</lang>


=={{header|ooRexx}}==
=={{header|ooRexx}}==
Line 4,847: Line 5,395:
may also be a list of conditional expressions separated by commas. The expressions are evaluated left-to-right, and evaluation
may also be a list of conditional expressions separated by commas. The expressions are evaluated left-to-right, and evaluation
will stop with the first '0' result. For example,
will stop with the first '0' result. For example,
<lang ooRexx>if arg~isa(.string) & arg~left(1) == "*" then call processArg arg</lang>
<syntaxhighlight lang="oorexx">if arg~isa(.string) & arg~left(1) == "*" then call processArg arg</syntaxhighlight>


would fail with a syntax error if the variable arg does not hold a string because the right-hand-side of the expression
would fail with a syntax error if the variable arg does not hold a string because the right-hand-side of the expression
is still evaluated. This can be coded as
is still evaluated. This can be coded as


<lang ooRexx>if arg~isa(.string), arg~left(1) == "*" then call processArg arg</lang>
<syntaxhighlight lang="oorexx">if arg~isa(.string), arg~left(1) == "*" then call processArg arg</syntaxhighlight>
With this form, the second conditional expression is only evaluated if the first expression is true.
With this form, the second conditional expression is only evaluated if the first expression is true.


===IF THEN --- IF THEN/ELSE===
===IF THEN --- IF THEN/ELSE===
<syntaxhighlight lang="oorexx">
<lang ooRexx>
if y then x=6 /* Y must be either 0 or 1 */
if y then x=6 /* Y must be either 0 or 1 */


Line 4,882: Line 5,430:
else nop
else nop
else if z<0 then z=-y
else if z<0 then z=-y
</syntaxhighlight>
</lang>


===SELECT WHEN===
===SELECT WHEN===
<syntaxhighlight lang="oorexx">
<lang ooRexx>
/*the WHEN conditional operators are the same as */
/*the WHEN conditional operators are the same as */
/*the IF conditional operators. */
/*the IF conditional operators. */
Line 4,900: Line 5,448:
/*were satisfiied, a SYNTAX condition is raised (error).*/
/*were satisfiied, a SYNTAX condition is raised (error).*/
end
end
</syntaxhighlight>
</lang>
===SELECT WHEN/OTHERWISE===
===SELECT WHEN/OTHERWISE===
<syntaxhighlight lang="oorexx">
<lang ooRexx>
select
select
when a=='angel' then many='host'
when a=='angel' then many='host'
Line 4,917: Line 5,465:
exit 13
exit 13
end
end
</syntaxhighlight>
</lang>


=={{header|OxygenBasic}}==
=={{header|OxygenBasic}}==
<lang oxygenbasic>
<syntaxhighlight lang="oxygenbasic">
if a then b=c else b=d
if a then b=c else b=d


Line 4,942: Line 5,490:
end select
end select


</syntaxhighlight>
</lang>


=={{header|Oz}}==
=={{header|Oz}}==
===if-then-else===
===if-then-else===
<lang oz>proc {PrintParity X}
<syntaxhighlight lang="oz">proc {PrintParity X}
if {IsEven X} then
if {IsEven X} then
{Show even}
{Show even}
Line 4,954: Line 5,502:
{Show 'should not happen'}
{Show 'should not happen'}
end
end
end</lang>
end</syntaxhighlight>


===if-then-else as a ternary operator===
===if-then-else as a ternary operator===
<lang oz>fun {Max X Y}
<syntaxhighlight lang="oz">fun {Max X Y}
if X > Y then X else Y end
if X > Y then X else Y end
end</lang>
end</syntaxhighlight>


===case statement===
===case statement===
<lang oz>fun {Fac X}
<syntaxhighlight lang="oz">fun {Fac X}
case X of 0 then 1
case X of 0 then 1
[] _ then X * {Fac X-1}
[] _ then X * {Fac X-1}
end
end
end</lang>
end</syntaxhighlight>


=={{header|PARI/GP}}==
=={{header|PARI/GP}}==
GP uses a simple <code>if</code> statement:
GP uses a simple <code>if</code> statement:
<lang parigp>if(condition, do_if_true, do_if_false)</lang>
<syntaxhighlight lang="parigp">if(condition, do_if_true, do_if_false)</syntaxhighlight>
and short-circuit <code>&&</code> and <code>||</code> (which can be abbreviated <code>&</code> and <code>|</code> if desired).
and short-circuit <code>&&</code> and <code>||</code> (which can be abbreviated <code>&</code> and <code>|</code> if desired).


Line 4,978: Line 5,526:
===if-then-else===
===if-then-else===


<lang pascal>IF condition1 THEN
<syntaxhighlight lang="pascal">IF condition1 THEN
procedure1
procedure1
ELSE
ELSE
Line 5,000: Line 5,548:
procedure3;
procedure3;
procedure4
procedure4
END;</lang>
END;</syntaxhighlight>


=== case ===
=== case ===
Line 5,009: Line 5,557:
In Pascal there is no fall-through to the next case. When execution reaches the end of a matching clause, it continues after the end of the case statement, not in the code for the next case.
In Pascal there is no fall-through to the next case. When execution reaches the end of a matching clause, it continues after the end of the case statement, not in the code for the next case.


<lang pascal>case i of
<syntaxhighlight lang="pascal">case i of
1,4,9: { executed if i is 1, 4 or 9 }
1,4,9: { executed if i is 1, 4 or 9 }
DoSomething;
DoSomething;
Line 5,018: Line 5,566:
else
else
DoYetAnotherThing;
DoYetAnotherThing;
end;</lang>
end;</syntaxhighlight>


Given the variable "X" as a char the following is valid:
Given the variable "X" as a char the following is valid:


<lang pascal>Case X of
<syntaxhighlight lang="pascal">Case X of
'A' : statement ;
'A' : statement ;
'B' : statement ;
'B' : statement ;
Line 5,028: Line 5,576:
else
else
Statement ;
Statement ;
end;</lang>
end;</syntaxhighlight>


=={{header|Perl}}==
=={{header|Perl}}==
Line 5,035: Line 5,583:
===if/else===
===if/else===


<lang perl>if ($expression) {
<syntaxhighlight lang="perl">if ($expression) {
do_something;
do_something;
}</lang>
}</syntaxhighlight>


<lang perl># postfix conditional
<syntaxhighlight lang="perl"># postfix conditional
do_something if $expression;</lang>
do_something if $expression;</syntaxhighlight>


<lang perl>if ($expression) {
<syntaxhighlight lang="perl">if ($expression) {
do_something;
do_something;
}
}
else {
else {
do_fallback;
do_fallback;
}</lang>
}</syntaxhighlight>


<lang perl>if ($expression1) {
<syntaxhighlight lang="perl">if ($expression1) {
do_something;
do_something;
}
}
Line 5,057: Line 5,605:
else {
else {
do_fallback;
do_fallback;
}</lang>
}</syntaxhighlight>


===unless===
===unless===
Line 5,069: Line 5,617:
The ternary operator is used as an expression within a statement, rather than as a control flow structure containing one or more statements. It is frequently used in assignment, or sometimes for passing function call arguments that vary depending on some condition.
The ternary operator is used as an expression within a statement, rather than as a control flow structure containing one or more statements. It is frequently used in assignment, or sometimes for passing function call arguments that vary depending on some condition.


<lang perl>$variable = $expression ? $value_for_true : $value_for_false;</lang>
<syntaxhighlight lang="perl">$variable = $expression ? $value_for_true : $value_for_false;</syntaxhighlight>


===logical operators===
===logical operators===


<lang perl>$condition and do_something; # equivalent to $condition ? do_something : $condition</lang>
<syntaxhighlight lang="perl">$condition and do_something; # equivalent to $condition ? do_something : $condition</syntaxhighlight>


<lang perl>$condition or do_something; # equivalent to $condition ? $condition : do_something</lang>
<syntaxhighlight lang="perl">$condition or do_something; # equivalent to $condition ? $condition : do_something</syntaxhighlight>


<code>&&</code> and <code>||</code> have the same semantics as <code>and</code> and <code>or</code>, respectively, but their precedence is much higher, making them better for conditional expressions than control flow.
<code>&&</code> and <code>||</code> have the same semantics as <code>and</code> and <code>or</code>, respectively, but their precedence is much higher, making them better for conditional expressions than control flow.
Line 5,085: Line 5,633:
{{works with|Perl|5.10}}
{{works with|Perl|5.10}}


<lang perl>use feature "switch";
<syntaxhighlight lang="perl">use feature "switch";
given ($input) {
given ($input) {
when (0) { print 'input == 0'; }
when (0) { print 'input == 0'; }
Line 5,092: Line 5,640:
when (/rats/) { print 'input matches rats'; }
when (/rats/) { print 'input matches rats'; }
default { do_fallback; }
default { do_fallback; }
}</lang>
}</syntaxhighlight>


=={{header|Phix}}==
=={{header|Phix}}==
{{libheader|Phix/basics}}
{{libheader|Phix/basics}}
===if===
===if===
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">(phixonline)-->
<span style="color: #008080;">if</span> <span style="color: #000000;">name<span style="color: #0000FF;">=<span style="color: #008000;">"Pete"</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">with</span> <span style="color: #008080;">javascript_semantics</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">name</span><span style="color: #0000FF;">=</span><span style="color: #008000;">"Pete"</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">age<span style="color: #0000FF;">><span style="color: #000000;">50</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">age</span><span style="color: #0000FF;">></span><span style="color: #000000;">50</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">age<span style="color: #0000FF;"><<span style="color: #000000;">20</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">elsif</span> <span style="color: #000000;">age</span><span style="color: #0000FF;"><</span><span style="color: #000000;">20</span> <span style="color: #008080;">then</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #008080;">else</span>
<span style="color: #008080;">else</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<!--</lang>-->
<!--</syntaxhighlight>-->


There is no limit to the number of elsif clauses, including 0. The else clause is also optional,
There is no limit to the number of elsif clauses, including 0. The else clause is also optional,
Line 5,114: Line 5,663:


===iff===
===iff===
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">-->
<span style="color: #000000;">somevar</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff<span style="color: #0000FF;">(<span style="color: #000000;">flag<span style="color: #0000FF;">?<span style="color: #000000;">true_expr<span style="color: #0000FF;">:<span style="color: #000000;">false_expr<span style="color: #0000FF;">)
<span style="color: #000000;">somevar</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff<span style="color: #0000FF;">(<span style="color: #000000;">flag<span style="color: #0000FF;">?<span style="color: #000000;">true_expr<span style="color: #0000FF;">:<span style="color: #000000;">false_expr<span style="color: #0000FF;">)
<!--</lang>-->
<!--</syntaxhighlight>-->


In an iff() expression, only one of true_expr or false_expr will be evaluated, not both.
In an iff() expression, only one of true_expr or false_expr will be evaluated, not both.
Line 5,124: Line 5,673:
first if statement, and in the second the conditions are evaluated at compile-time and code is only
first if statement, and in the second the conditions are evaluated at compile-time and code is only
emitted for one of the branches.
emitted for one of the branches.
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">-->
<span style="color: #008080;">constant</span> <span style="color: #000000;">DEBUG<span style="color: #0000FF;">=<span style="color: #004600;">false</span>
<span style="color: #008080;">constant</span> <span style="color: #000000;">DEBUG<span style="color: #0000FF;">=<span style="color: #004600;">false</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">DEBUG</span> <span style="color: #008080;">then</span>
<span style="color: #008080;">if</span> <span style="color: #000000;">DEBUG</span> <span style="color: #008080;">then</span>
Line 5,134: Line 5,683:
<span style="color: #7060A8;">puts<span style="color: #0000FF;">(<span style="color: #000000;">1<span style="color: #0000FF;">,<span style="color: #008000;">"this is linux\n"<span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts<span style="color: #0000FF;">(<span style="color: #000000;">1<span style="color: #0000FF;">,<span style="color: #008000;">"this is linux\n"<span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if
<span style="color: #008080;">end</span> <span style="color: #008080;">if
<!--</lang>-->
<!--</syntaxhighlight>-->


===switch===
===switch===
<!--<lang Phix>-->
<!--<syntaxhighlight lang="phix">-->
<span style="color: #008080;">switch</span> <span style="color: #000000;">v</span> <span style="color: #000080;font-style:italic;">/*with fallthrough*/</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">switch</span> <span style="color: #000000;">v</span> <span style="color: #000080;font-style:italic;">/*with fallthrough*/</span> <span style="color: #008080;">do</span>
<span style="color: #008080;">case</span> <span style="color: #000000;">1<span style="color: #0000FF;">,<span style="color: #000000;">2<span style="color: #0000FF;">:</span>
<span style="color: #008080;">case</span> <span style="color: #000000;">1<span style="color: #0000FF;">,<span style="color: #000000;">2<span style="color: #0000FF;">:</span>
Line 5,150: Line 5,699:
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #000080;font-style:italic;">-- do something</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">switch
<span style="color: #008080;">end</span> <span style="color: #008080;">switch
<!--</lang>-->
<!--</syntaxhighlight>-->


By default there is no fallthough on switch clauses, however you can add(/uncomment) a directive, and you can
By default there is no fallthough on switch clauses, however you can add(/uncomment) a directive, and you can
Line 5,166: Line 5,715:
use them, also have some conditional guards for cross-platform support
use them, also have some conditional guards for cross-platform support


<syntaxhighlight lang="phix">without js -- (but maybe, at some point, and obviously that is as custom verbatim JavaScript code instead of assembly code)
<lang Phix>#ilASM{
#ilASM{
[32]
[32]
mov eax,[var]
mov eax,[var]
Line 5,187: Line 5,737:
syscall
syscall
[]
[]
}</lang>
}</syntaxhighlight>


=={{header|PHL}}==
=={{header|PHL}}==
Line 5,193: Line 5,743:
If-else:
If-else:


<lang phl>var a = 5;
<syntaxhighlight lang="phl">var a = 5;
if (a == 5) {
if (a == 5) {
doSomething();
doSomething();
Line 5,200: Line 5,750:
} else {
} else {
error();
error();
}</lang>
}</syntaxhighlight>


=={{header|PHP}}==
=={{header|PHP}}==
Line 5,208: Line 5,758:
'''Interpreter''': [[PHP]] 3.x, 4.x, 5.x
'''Interpreter''': [[PHP]] 3.x, 4.x, 5.x


<lang php><?php
<syntaxhighlight lang="php"><?php


$foo = 3;
$foo = 3;
Line 5,229: Line 5,779:
}
}


?></lang>
?></syntaxhighlight>


===switch===
===switch===
Line 5,235: Line 5,785:
'''Interpreter''': [[PHP]] 3.x & 4.x & 5.x
'''Interpreter''': [[PHP]] 3.x & 4.x & 5.x


<lang php><?php
<syntaxhighlight lang="php"><?php


switch ($i)
switch ($i)
Line 5,252: Line 5,802:
}
}


?></lang>
?></syntaxhighlight>


===See Also===
===See Also===
Line 5,269: Line 5,819:
Here are examples of each of these constructs.
Here are examples of each of these constructs.


<lang Picat>go =>
<syntaxhighlight lang="picat">go =>
N = 10,
N = 10,


Line 5,314: Line 5,864:
% condition in function head
% condition in function head
test_func(N) = "less than 14", N < 14 => true.
test_func(N) = "less than 14", N < 14 => true.
test_func(_N) = "not less than 14" => true. </lang>
test_func(_N) = "not less than 14" => true. </syntaxhighlight>


{{out}}
{{out}}
Line 5,326: Line 5,876:
=={{header|PicoLisp}}==
=={{header|PicoLisp}}==
===Two-way conditions===
===Two-way conditions===
<lang PicoLisp>(if (condition) # If the condition evaluates to non-NIL
<syntaxhighlight lang="picolisp">(if (condition) # If the condition evaluates to non-NIL
(then-do-this) # Then execute the following expression
(then-do-this) # Then execute the following expression
(else-do-that) # Else execute all other expressions
(else-do-that) # Else execute all other expressions
Line 5,334: Line 5,884:
(then-do-this) # Then execute the following expression
(then-do-this) # Then execute the following expression
(else-do-that) # Else execute all other expressions
(else-do-that) # Else execute all other expressions
(and-more) )</lang>
(and-more) )</syntaxhighlight>
One-way conditions
One-way conditions
<lang PicoLisp>(when (condition) # If the condition evaluates to non-NIL
<syntaxhighlight lang="picolisp">(when (condition) # If the condition evaluates to non-NIL
(then-do-this) # Then execute tall following expressions
(then-do-this) # Then execute tall following expressions
(and-more) )
(and-more) )
Line 5,342: Line 5,892:
(unless (condition) # If the condition evaluates to NIL
(unless (condition) # If the condition evaluates to NIL
(then-do-this) # Then execute all following expressions
(then-do-this) # Then execute all following expressions
(and-more) )</lang>
(and-more) )</syntaxhighlight>
===Four-way condition===
===Four-way condition===
<lang PicoLisp>(if2 (condition1) (condition2) # If both conditions evaluate to non-NIL
<syntaxhighlight lang="picolisp">(if2 (condition1) (condition2) # If both conditions evaluate to non-NIL
(expression-both) # Then execute this expression
(expression-both) # Then execute this expression
(expression-first) # Otherwise this for the first
(expression-first) # Otherwise this for the first
(expression-second) # or this the second condition.
(expression-second) # or this the second condition.
(expression-none) # If both are NIL, all following expressions
(expression-none) # If both are NIL, all following expressions
(and-more) )</lang>
(and-more) )</syntaxhighlight>
===Multiple conditions===
===Multiple conditions===
<lang PicoLisp>(cond
<syntaxhighlight lang="picolisp">(cond
((condition1) # If this condition evaluates to non-NIL
((condition1) # If this condition evaluates to non-NIL
(expression 1) # Execute these expression(s)
(expression 1) # Execute these expression(s)
Line 5,371: Line 5,921:
(NIL # If none evaluated to NIL
(NIL # If none evaluated to NIL
(expression 1) # Execute these expression(s)
(expression 1) # Execute these expression(s)
(more 1) )</lang>
(more 1) )</syntaxhighlight>


===Selection===
===Selection===
<lang PicoLisp>(case (expression) # Evaluate the expression
<syntaxhighlight lang="picolisp">(case (expression) # Evaluate the expression
(value1 # If it is equal to, or member of, 'value1'
(value1 # If it is equal to, or member of, 'value1'
(do-this1) # Execute these expression(s)
(do-this1) # Execute these expression(s)
Line 5,382: Line 5,932:
(do-that2) )
(do-that2) )
(T # Else execute final expression(s)
(T # Else execute final expression(s)
(do-something-else) ) )</lang>
(do-something-else) ) )</syntaxhighlight>


=={{header|PL/I}}==
=={{header|PL/I}}==
===if-then-else===
===if-then-else===
<lang pli>if condition_exp then unique_statement; else unique_statement;
<syntaxhighlight lang="pli">if condition_exp then unique_statement; else unique_statement;


if condition_exp then
if condition_exp then
Line 5,399: Line 5,949:
else do;
else do;
list_of_statements;
list_of_statements;
end;</lang>
end;</syntaxhighlight>


So a cascading form can be derived from:
So a cascading form can be derived from:
<lang pli>if condition_exp1 then
<syntaxhighlight lang="pli">if condition_exp1 then
statement_1;
statement_1;
else if condition_exp2 then
else if condition_exp2 then
Line 5,422: Line 5,972:
else do;
else do;
list_of_statements;
list_of_statements;
end;</lang>
end;</syntaxhighlight>


=== case ===
=== case ===
Line 5,428: Line 5,978:


==== select - format 1 ====
==== select - format 1 ====
<lang pli>select (i); /* select on value of variable */
<syntaxhighlight lang="pli">select (i); /* select on value of variable */
when (1,4,9)
when (1,4,9)
do;
do;
Line 5,443: Line 5,993:
statement_s;
statement_s;
end;
end;
end;</lang>
end;</syntaxhighlight>


==== select - format 2 ====
==== select - format 2 ====
<lang pli>select; /* select first matching condition */
<syntaxhighlight lang="pli">select; /* select first matching condition */
when (i = 4)
when (i = 4)
do;
do;
Line 5,466: Line 6,016:
statement_s;
statement_s;
end;
end;
end;</lang>
end;</syntaxhighlight>


Notes:
Notes:
Line 5,476: Line 6,026:
=={{header|PL/M}}==
=={{header|PL/M}}==
IF-THEN-ELSE:
IF-THEN-ELSE:
<lang pli>/* IF-THEN-ELSE - THE ELSE STATEMENT; PART IS OPTIONAL */
<syntaxhighlight lang="pli">/* IF-THEN-ELSE - THE ELSE STATEMENT; PART IS OPTIONAL */
IF COND THEN STATEMENT1; ELSE STATEMENT2;
IF COND THEN STATEMENT1; ELSE STATEMENT2;


Line 5,483: Line 6,033:
ELSE IF CONB2 THEN STATEMENT2;
ELSE IF CONB2 THEN STATEMENT2;
ELSE IF CONB3 THEN STATEMENT3;
ELSE IF CONB3 THEN STATEMENT3;
ELSE STATEMENTX;</lang>
ELSE STATEMENTX;</syntaxhighlight>


DO-CASE:
DO-CASE:
<lang pli>/* CASE STATEMENT - EXECUTES STATEMENT0, STATEMENT1, ETC. */
<syntaxhighlight lang="pli">/* CASE STATEMENT - EXECUTES STATEMENT0, STATEMENT1, ETC. */
/* DEPENDING ON WHETHER EXPR EVALUATES TO 0, 1, ... */
/* DEPENDING ON WHETHER EXPR EVALUATES TO 0, 1, ... */
/* EXPR MUST BE IN RANGE OR THE PROGRAM WILL JUMP TO HYPERSPACE */
/* EXPR MUST BE IN RANGE OR THE PROGRAM WILL JUMP TO HYPERSPACE */
Line 5,493: Line 6,043:
STATEMENT1;
STATEMENT1;
...
...
END;</lang>
END;</syntaxhighlight>

=={{header|Plain English}}==
Plain English only has one kind of conditional, called a "conditional".
<syntaxhighlight lang="text">If [a decider], [do something]; [do another thing].</syntaxhighlight>
The first parameter is a decider that returns yes or no. If the result was yes, all the other statements on the same line as the conditional will execute. Otherwise, execution continues immediately to the next line.

If the decider uses a negative word, the negative word is removed, the decider is done normally, and the result is reversed.

Conditionals may not go beyond 1 SLOC. Conditionals cannot be nested.


=={{header|Pop11}}==
=={{header|Pop11}}==
Line 5,499: Line 6,058:
The simplest conditional is:
The simplest conditional is:


<lang pop11>if condition then
<syntaxhighlight lang="pop11">if condition then
;;; Action
;;; Action
endif;</lang>
endif;</syntaxhighlight>


Two way conditional looks like:
Two way conditional looks like:


<lang pop11>if condition then
<syntaxhighlight lang="pop11">if condition then
;;; Action1
;;; Action1
else
else
;;; Alternative action
;;; Alternative action
endif;</lang>
endif;</syntaxhighlight>


One can do multiway choice using elseif clause
One can do multiway choice using elseif clause


<lang pop11>if condition1 then
<syntaxhighlight lang="pop11">if condition1 then
;;; Action1
;;; Action1
elseif condition2 then
elseif condition2 then
Line 5,523: Line 6,082:
else
else
;;; Alternative action
;;; Alternative action
endif;</lang>
endif;</syntaxhighlight>


Instead of if keyword one can use unless keyword.
Instead of if keyword one can use unless keyword.


<lang pop11>unless condition then /* Action */ endunless;</lang>
<syntaxhighlight lang="pop11">unless condition then /* Action */ endunless;</syntaxhighlight>


has the same meaning as
has the same meaning as


<lang pop11>if not(condition) then /* Action */ endif;</lang>
<syntaxhighlight lang="pop11">if not(condition) then /* Action */ endif;</syntaxhighlight>


One can also use elseunless keword.
One can also use elseunless keword.


<lang pop11>if condition1 then
<syntaxhighlight lang="pop11">if condition1 then
;;; Action1
;;; Action1
elseunless condition2 then
elseunless condition2 then
Line 5,541: Line 6,100:
endif;
endif;
;;; Action2
;;; Action2
endif;</lang>
endif;</syntaxhighlight>


has the same meaning as
has the same meaning as


<lang pop11>if condition1 then
<syntaxhighlight lang="pop11">if condition1 then
;;; Action1
;;; Action1
elseif not(condition2) then
elseif not(condition2) then
;;; Action2
;;; Action2
endif;</lang>
endif;</syntaxhighlight>


Note that conditional must end in matching keyword, if must be finished by endif, unless must be finished by endunless (in the
Note that conditional must end in matching keyword, if must be finished by endif, unless must be finished by endunless (in the
Line 5,556: Line 6,115:
Pop11 conditional is an expression:
Pop11 conditional is an expression:


<lang pop11>if x > 0 then 1 elseif x < 0 then -1 else 0 endif -> sign_x ;</lang>
<syntaxhighlight lang="pop11">if x > 0 then 1 elseif x < 0 then -1 else 0 endif -> sign_x ;</syntaxhighlight>


assigns sign of x to sign_x.
assigns sign of x to sign_x.
Line 5,562: Line 6,121:
Instead of multiway if one can use switchon construct (which is equivalent to a special case of if, but may be shorter).
Instead of multiway if one can use switchon construct (which is equivalent to a special case of if, but may be shorter).


<lang pop11>switchon(x)
<syntaxhighlight lang="pop11">switchon(x)
case .isstring then printf('A1');
case .isstring then printf('A1');
notcase .isinteger then printf('A2');
notcase .isinteger then printf('A2');
Line 5,568: Line 6,127:
case > 4 andcase < 15 then printf('A4');
case > 4 andcase < 15 then printf('A4');
else printf('A5');
else printf('A5');
endswitchon;</lang>
endswitchon;</syntaxhighlight>


There is also multiway goto statement and conditional control transfers, we explain them together with other control transfers
There is also multiway goto statement and conditional control transfers, we explain them together with other control transfers
Line 5,575: Line 6,134:
Pop11 also has preprocessor allowing conditional compilation:
Pop11 also has preprocessor allowing conditional compilation:


<lang pop11>#_IF condition1
<syntaxhighlight lang="pop11">#_IF condition1
/* Variant 1 */
/* Variant 1 */
#_ELSEIF condition2
#_ELSEIF condition2
Line 5,581: Line 6,140:
#_ELSE
#_ELSE
/* Variant 3 */
/* Variant 3 */
#_ENDIF</lang>
#_ENDIF</syntaxhighlight>


condition1 and condition2 are arbitrary Pop11 expressions (they have access to all previously compiled code).
condition1 and condition2 are arbitrary Pop11 expressions (they have access to all previously compiled code).
Line 5,591: Line 6,150:
The "<tt>if</tt>" operator uses two items form the stack, a procedure and a boolean. It will execute the procedure if the boolean is true. It will not leave anything on the stack (but the procedure might):
The "<tt>if</tt>" operator uses two items form the stack, a procedure and a boolean. It will execute the procedure if the boolean is true. It will not leave anything on the stack (but the procedure might):


<lang postscript>9 10 lt {(9 is less than 10) show} if</lang>
<syntaxhighlight lang="postscript">9 10 lt {(9 is less than 10) show} if</syntaxhighlight>


The "<tt>ifelse</tt>" operator expects two procedures and executes the one or the other depending on the value of the boolean. I.e. this:
The "<tt>ifelse</tt>" operator expects two procedures and executes the one or the other depending on the value of the boolean. I.e. this:


<lang postscript>/a 5 lt {(yeah)} {(nope)} ifelse show</lang>
<syntaxhighlight lang="postscript">/a 5 lt {(yeah)} {(nope)} ifelse show</syntaxhighlight>


will render either the string "yeah" or "nope" depending on whether <tt>a</tt> is less than 5 or not.
will render either the string "yeah" or "nope" depending on whether <tt>a</tt> is less than 5 or not.
Line 5,601: Line 6,160:
=={{header|PowerShell}}==
=={{header|PowerShell}}==
===If, ElseIf, Else===
===If, ElseIf, Else===
<lang powershell># standard if
<syntaxhighlight lang="powershell"># standard if
if (condition) {
if (condition) {
# ...
# ...
Line 5,620: Line 6,179:
} else {
} else {
# ...
# ...
}</lang>
}</syntaxhighlight>
===Switch===
===Switch===
<lang powershell># standard switch
<syntaxhighlight lang="powershell"># standard switch
switch ($var) {
switch ($var) {
1 { "Value was 1" }
1 { "Value was 1" }
Line 5,651: Line 6,210:
"\d+" { "Line started with a number" }
"\d+" { "Line started with a number" }
"\s+" { "Line started with whitespace" }
"\s+" { "Line started with whitespace" }
}</lang>
}</syntaxhighlight>


=={{header|Prolog}}==
=={{header|Prolog}}==
Line 5,657: Line 6,216:
A "pure" Prolog program by its very nature is one very long, very complicated boolean test. Absolutely every executable portion of Prolog is a test that succeeds or fails. Here are some examples, thus, of using conditionals in Prolog:
A "pure" Prolog program by its very nature is one very long, very complicated boolean test. Absolutely every executable portion of Prolog is a test that succeeds or fails. Here are some examples, thus, of using conditionals in Prolog:


<lang Prolog>go :- write('Hello, World!'), nl.</lang>
<syntaxhighlight lang="prolog">go :- write('Hello, World!'), nl.</syntaxhighlight>


While operationally this looks like a program that when go/0 is executed will print "Hello, World!" and exit, it is actually a predicate, in the strict logical sense of the term, that tests conditions. Denotationally we'd describe it as "go/0 succeeds iff write/1 succeeds with its passed-in argument, and if nl/0 subsequently succeeds." (The fact that write/1 and nl/0 **always** succeed and that we use them for their side effects only doesn't matter to the Prolog view of a program.)
While operationally this looks like a program that when go/0 is executed will print "Hello, World!" and exit, it is actually a predicate, in the strict logical sense of the term, that tests conditions. Denotationally we'd describe it as "go/0 succeeds iff write/1 succeeds with its passed-in argument, and if nl/0 subsequently succeeds." (The fact that write/1 and nl/0 **always** succeed and that we use them for their side effects only doesn't matter to the Prolog view of a program.)


<lang Prolog>fact(foo).
<syntaxhighlight lang="prolog">fact(foo).
fact(bar).
fact(bar).
fact(baz).
fact(baz).


go :- fact(booger).
go :- fact(booger).
go :- fact(bar).</lang>
go :- fact(bar).</syntaxhighlight>


This example shows a few features of Prolog's testing and, specifically, shows nondeterminism and backtracking in action. In this we have a predicate fact/1 (so named because in this format, without an executable body, it is termed a "fact" in the literature). It has two clauses asserting both "bar" and "baz" as facts. go/0 also has two clauses. If we execute go/0, the runtime will tell us "true" (or, in some implementations, "yes") to indicate that the predicate call was successful. Denotationally we would say "fact(X) succeeds iff X unifies with foo, X unifies with bar, or X unifies with baz". We would also say "go/0 succeeds iff fact(booger) succeeds or if fact(bar) succeeds". When running, the first clause of go/0 will be executed and fact(booger) will be tested. fact(booger) does not match fact(bar) nor does it match fact(baz) so it fails. This leads the runtime to go back and try again with the **second** go/0 clause. In this one fact(bar) does, in fact, match fact(bar), so the overall test passes. A Prolog program is, thus, a very complicated tree of if/then statements, in effect.
This example shows a few features of Prolog's testing and, specifically, shows nondeterminism and backtracking in action. In this we have a predicate fact/1 (so named because in this format, without an executable body, it is termed a "fact" in the literature). It has two clauses asserting both "bar" and "baz" as facts. go/0 also has two clauses. If we execute go/0, the runtime will tell us "true" (or, in some implementations, "yes") to indicate that the predicate call was successful. Denotationally we would say "fact(X) succeeds iff X unifies with foo, X unifies with bar, or X unifies with baz". We would also say "go/0 succeeds iff fact(booger) succeeds or if fact(bar) succeeds". When running, the first clause of go/0 will be executed and fact(booger) will be tested. fact(booger) does not match fact(bar) nor does it match fact(baz) so it fails. This leads the runtime to go back and try again with the **second** go/0 clause. In this one fact(bar) does, in fact, match fact(bar), so the overall test passes. A Prolog program is, thus, a very complicated tree of if/then statements, in effect.


<lang Prolog>fact(X) :-
<syntaxhighlight lang="prolog">fact(X) :-
( X = foo
( X = foo
; X = bar
; X = bar
Line 5,677: Line 6,236:
go :-
go :-
( fact(booger)
( fact(booger)
; fact(bar) ).</lang>
; fact(bar) ).</syntaxhighlight>


This version is semantically the same as the previous one. (In actual execution, because of some runtime optimizations, there are some minor differences in outcome, but nothing that would change the logical interpretation of the program.) Here we're showing more explicitly the various "or" conditions. In Prolog "," is roughly equivalent to "and" (conjunction) while ";" is roughly equivalent to "or" (disjunction). Because of this, and because of the fact we've taken separate clauses now and put them into explicit disjunctions it is clearer that we're performing a series of if/then tests in effect.
This version is semantically the same as the previous one. (In actual execution, because of some runtime optimizations, there are some minor differences in outcome, but nothing that would change the logical interpretation of the program.) Here we're showing more explicitly the various "or" conditions. In Prolog "," is roughly equivalent to "and" (conjunction) while ";" is roughly equivalent to "or" (disjunction). Because of this, and because of the fact we've taken separate clauses now and put them into explicit disjunctions it is clearer that we're performing a series of if/then tests in effect.
Line 5,683: Line 6,242:
That being said, Prolog does have something that's very akin to real if/then statements (or, more accurately, similar to the ternary operator of languages like C):
That being said, Prolog does have something that's very akin to real if/then statements (or, more accurately, similar to the ternary operator of languages like C):


<lang Prolog>fact(X) :-
<syntaxhighlight lang="prolog">fact(X) :-
( X = bar -> write('You got me!'), nl
( X = bar -> write('You got me!'), nl
; write(X), write(' is not right!'), nl, fail ).
; write(X), write(' is not right!'), nl, fail ).
Line 5,689: Line 6,248:
go :-
go :-
( fact(booger)
( fact(booger)
; fact(bar) ).</lang>
; fact(bar) ).</syntaxhighlight>


In this version of fact/1, the -> operator is used to perform a more traditional if/then/else. The general construct is ( condition -> succeed_branch ; fail_branch ). In this case if the parameter passed in unifies with 'bar', a message is written (recall that write/1 and nl/0 always succeed!) and the whole predicate exists with a success. If, on the other hand, the unification fails (you pass anything other than 'bar') it writes a snarky message and then calls fail/0, a predicate that, as its name suggests, always fails. There are more implications to using the conditional expression in Prolog; it is generally considered code smell. Other operators also exist for handling conditionals (like *->) that lack the "smell" of the conditional operator. The reasons for this are out of scope, however, for this article. Just know that the fact/1 predicate could have used *-> in place of -> and been more "sound" as a result.
In this version of fact/1, the -> operator is used to perform a more traditional if/then/else. The general construct is ( condition -> succeed_branch ; fail_branch ). In this case if the parameter passed in unifies with 'bar', a message is written (recall that write/1 and nl/0 always succeed!) and the whole predicate exists with a success. If, on the other hand, the unification fails (you pass anything other than 'bar') it writes a snarky message and then calls fail/0, a predicate that, as its name suggests, always fails. There are more implications to using the conditional expression in Prolog; it is generally considered code smell. Other operators also exist for handling conditionals (like *->) that lack the "smell" of the conditional operator. The reasons for this are out of scope, however, for this article. Just know that the fact/1 predicate could have used *-> in place of -> and been more "sound" as a result.
Line 5,696: Line 6,255:
{{works with|PureBasic|4.41}}
{{works with|PureBasic|4.41}}
===If, Elseif, Else===
===If, Elseif, Else===
<lang PureBasic>If a = 0
<syntaxhighlight lang="purebasic">If a = 0
Debug "a = 0"
Debug "a = 0"


Line 5,705: Line 6,264:
Debug "a < 0"
Debug "a < 0"


EndIf</lang>
EndIf</syntaxhighlight>


===Select===
===Select===
<lang PureBasic>Variable = 2
<syntaxhighlight lang="purebasic">Variable = 2


Select Variable
Select Variable
Line 5,722: Line 6,281:
Default
Default
Debug "Variable = something else..."
Debug "Variable = something else..."
EndSelect</lang>
EndSelect</syntaxhighlight>


===CompilerIf===
===CompilerIf===
Compiler conditional structures works like normal conditional structures, except they are evaluated at compile time, and thus have to use constant expressions. Any defined constant can be used, these examples uses built-in constants.
Compiler conditional structures works like normal conditional structures, except they are evaluated at compile time, and thus have to use constant expressions. Any defined constant can be used, these examples uses built-in constants.
<syntaxhighlight lang="purebasic">
<lang PureBasic>
CompilerIf #PB_Compiler_OS = #PB_OS_Linux And #PB_Compiler_Processor = #PB_Processor_x86
CompilerIf #PB_Compiler_OS = #PB_OS_Linux And #PB_Compiler_Processor = #PB_Processor_x86
Debug "Compiled on x86 Linux"
Debug "Compiled on x86 Linux"
Line 5,732: Line 6,291:
Debug "Compiled on something else"
Debug "Compiled on something else"
CompilerEndIf
CompilerEndIf
</syntaxhighlight>
</lang>


===CompilerSelect===
===CompilerSelect===
<syntaxhighlight lang="purebasic">
<lang PureBasic>
CompilerSelect #PB_Compiler_OS
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Linux
CompilerCase #PB_OS_Linux
Line 5,746: Line 6,305:
Debug "Compiled on something else"
Debug "Compiled on something else"
CompilerEndIf
CompilerEndIf
</syntaxhighlight>
</lang>


=={{header|Python}}==
=={{header|Python}}==
===if-then-else===
===if-then-else===


<lang python>if x == 0:
<syntaxhighlight lang="python">if x == 0:
foo()
foo()
elif x == 1:
elif x == 1:
Line 5,758: Line 6,317:
baz()
baz()
else:
else:
boz()</lang>
boz()</syntaxhighlight>


===ternary expressions===
===ternary expressions===
'''Interpreter:''' [[Python]] 2.5
'''Interpreter:''' [[Python]] 2.5


<lang python>true_value if condition else false_value</lang>
<syntaxhighlight lang="python">true_value if condition else false_value</syntaxhighlight>


Example:
Example:
<lang python>>>> secret='foo'
<syntaxhighlight lang="python">>>> secret='foo'
>>> print 'got it' if secret=='foo' else 'try again'
>>> print 'got it' if secret=='foo' else 'try again'
'got it'</lang>
'got it'</syntaxhighlight>


'''Note:''' this syntax is valid as an expression, the clauses cannot constain statements. The foregoing example is equivalent to:
'''Note:''' this syntax is valid as an expression, the clauses cannot constain statements. The foregoing example is equivalent to:


<lang python>>>> secret = 'foo'
<syntaxhighlight lang="python">>>> secret = 'foo'
>>> result = 'got it' if secret=='foo' else 'try again'
>>> result = 'got it' if secret=='foo' else 'try again'
>>> print result
>>> print result
'got it'</lang>
'got it'</syntaxhighlight>


===Function dispatch dictionary===
===Function dispatch dictionary===
Line 5,781: Line 6,340:
In some cases it's useful to associate functions with keys in a dictionary; and simply use this in lieu of long sequences of "if...elif...elif..." statements.
In some cases it's useful to associate functions with keys in a dictionary; and simply use this in lieu of long sequences of "if...elif...elif..." statements.


<lang python>dispatcher = dict()
<syntaxhighlight lang="python">dispatcher = dict()
dispatcher[0]=foo # Not foo(): we bind the dictionary entry to the function's object,
dispatcher[0]=foo # Not foo(): we bind the dictionary entry to the function's object,
# NOT to the results returned by an invocation of the function
# NOT to the results returned by an invocation of the function
Line 5,791: Line 6,350:
# or with no "default" case:
# or with no "default" case:
if x in dispatcher:
if x in dispatcher:
results=dispatcher[x]()</lang>
results=dispatcher[x]()</syntaxhighlight>


<lang python># The above, but with a dict literal
<syntaxhighlight lang="python"># The above, but with a dict literal
dispatcher = {
dispatcher = {
0: foo,
0: foo,
Line 5,800: Line 6,359:
}
}
# ...
# ...
results = dispatcher.get(x, boz)()</lang>
results = dispatcher.get(x, boz)()</syntaxhighlight>


<lang python># Or without the temp variable
<syntaxhighlight lang="python"># Or without the temp variable
# (it's up to the reader to decide how "pythonic" this is or isn't)
# (it's up to the reader to decide how "pythonic" this is or isn't)
results = {
results = {
Line 5,808: Line 6,367:
1: bar,
1: bar,
2: baz,
2: baz,
}.get(x, boz)()</lang>
}.get(x, boz)()</syntaxhighlight>


This can be particularly handy when using [[wp:Currying|currying]] techniques, or when lambda expressions or meta-function generators (factories) can be used in place of normal named functions.
This can be particularly handy when using [[wp:Currying|currying]] techniques, or when lambda expressions or meta-function generators (factories) can be used in place of normal named functions.


In general a dispatch table or class/object abstraction (using dynamic method over-rides) is considered preferable to chains of ''if ... elif ... elif ...'' in Python programming.
In general a dispatch table or class/object abstraction (using dynamic method over-rides) is considered preferable to chains of ''if ... elif ... elif ...'' in Python programming.

=={{header|QB64}}==
<syntaxhighlight lang="qb64">

Print "QB64/Qbasic conditional structures"
Dim k As String
Menu 1
View Print 13 To 23
Print "A menu example using the many options of IF statement"
k = " "
12: While k <> ""
k = UCase$(Input$(1))
If k = "O" GoTo O
If k = "F" Then 22
If k = "S" Then GoSub S: GoTo 12
If k = "C" Then GoSub 4: GoTo 12
If k = "E" Then GoSub 5: Exit While
Wend
Cls
Print "the same menu example with Select Case"
Sleep 2
While k <> ""
k = UCase$(Input$(1))

Select Case k
Case "O"
Print "You choose O"
Case "F"
Print "You choose F"
Case "S"
Print "You choose S"
Case "C"
Print "You choose C"
Case "E"
Print "You choose Exit"
_Delay 1
Exit While
Case Else
Print "Wrong choice"
End Select
Wend
View Print
Cls
Menu 2
View Print 13 To 23
Print "menu demonstration using ON value GOTO"
k = " "
While k <> ""
k = Input$(1)
On Val(k) GOSUB 1, 2, 3, 4, 5
Wend
End

1:
Print "Chosen O"
Return

2:
Print "Chosen F"
Return

3:
Print "Chosen S"
Return

4:
Print "Chosen C"
Return

5:
Print "Chosen E"
If k = "5" Then End
Return


O:
Print "You choose O"
GoTo 12

22:
Print "You choose F"
GoTo 12

S:
Print "You choose S"
Return



Sub Menu (Kind As Integer)
Locate 7, 33: Color 3, 4
Print "Choose the item"
Color 7, 0
Locate , 33
If Kind = 1 Then Print "Open a file"; Else Print "1) Open a file";
Color 14, 1
Locate , 33
If Kind = 1 Then Print "O" Else Print "1"
Color 7, 0

Locate , 33
If Kind = 1 Then Print "Find a file"; Else Print "2) Find a file";
Color 14, 1
Locate , 33
If Kind = 1 Then Print "F" Else Print "2"
Color 7, 0

Locate , 33
If Kind = 1 Then Print "Scan a file"; Else Print "3) Scan a file";
Color 14, 1
Locate , 33
If Kind = 1 Then Print "S" Else Print "3"
Color 7, 0

Locate , 33
If Kind = 1 Then Print "Copy a file"; Else Print "4) Copy a file";
Color 14, 1
Locate , 33
If Kind = 1 Then Print "C" Else Print "4"
Color 7, 0

Locate , 33
If Kind = 1 Then Print "Exit from Menu"; Else Print "5) Exit from Menu";
Color 14, 1
Locate , 33
If Kind = 1 Then Print "E" Else Print "5"
Color 7, 0

End Sub
</syntaxhighlight>



=={{header|Quackery}}==
=={{header|Quackery}}==
Line 5,883: Line 6,573:


(<code>]'[</code>, pronounced "meta-literal" grants the property of <code>'</code> (pronounced "literal", <code>'</code> places the item following it on the stack and unconditionally branches over it) to the enclosing nest.)
(<code>]'[</code>, pronounced "meta-literal" grants the property of <code>'</code> (pronounced "literal", <code>'</code> places the item following it on the stack and unconditionally branches over it) to the enclosing nest.)

See [[Flow-control structures#Quackery]] for a deeper dive into Quackery control flow.


=={{header|R}}==
=={{header|R}}==
===if===
===if===
Like most languages, R has an if statement as well as if-then-else:
Like most languages, R has an if statement as well as if-then-else:
<lang rsplus>x <- 0
<syntaxhighlight lang="rsplus">x <- 0
if(x == 0) print("foo")
if(x == 0) print("foo")
x <- 1
x <- 1
if(x == 0) print("foo")
if(x == 0) print("foo")
if(x == 0) print("foo") else print("bar")</lang>
if(x == 0) print("foo") else print("bar")</syntaxhighlight>
{{out}}
{{out}}
<pre>> if(x == 0) print("foo")
<pre>> if(x == 0) print("foo")
Line 5,901: Line 6,593:
===switch===
===switch===
R also has switch, but it's a function rather than a special form of any sort. In fact, R has two versions of switch: one for numbers and one for characters.
R also has switch, but it's a function rather than a special form of any sort. In fact, R has two versions of switch: one for numbers and one for characters.
<lang rsplus>x <- 2
<syntaxhighlight lang="rsplus">x <- 2
switch(x, print("Print if x == 1"), print("Print if x == 2"))</lang>
switch(x, print("Print if x == 1"), print("Print if x == 2"))</syntaxhighlight>
A notable part of the numeric version of switch is that, rounding and coercion aside, the cases must correspond exactly to the number of arguments given minus one. For example, the second argument of the switch statement will only be matched if the first argument equals (or is coerced to) 1 and the third argument will only do so for 2. There is no way to supply default cases or start from a number other than 1.
A notable part of the numeric version of switch is that, rounding and coercion aside, the cases must correspond exactly to the number of arguments given minus one. For example, the second argument of the switch statement will only be matched if the first argument equals (or is coerced to) 1 and the third argument will only do so for 2. There is no way to supply default cases or start from a number other than 1.
<lang rsplus>x <- 3
<syntaxhighlight lang="rsplus">x <- 3
switch(x, print("Print if x == 1"), print("Print if x == 2"))
switch(x, print("Print if x == 1"), print("Print if x == 2"))
x <- 2.7
x <- 2.7
switch(x, print("Print if x == 1"), print("Print if x == 2 or if there is rounding to 2"))</lang>
switch(x, print("Print if x == 1"), print("Print if x == 2 or if there is rounding to 2"))</syntaxhighlight>
The other switch, the one that works for characters, is much more sensible. Its rules are clearly laid out in documentation, but rely on R's mechanisms for names, which makes them a little bit complicated. See [https://cran.r-project.org/doc/manuals/r-release/R-lang.html#switch the language definition] for a reasonably simple example.
The other switch, the one that works for characters, is much more sensible. Its rules are clearly laid out in documentation, but rely on R's mechanisms for names, which makes them a little bit complicated. See [https://cran.r-project.org/doc/manuals/r-release/R-lang.html#switch the language definition] for a reasonably simple example.
<lang rsplus>x <- "match"
<syntaxhighlight lang="rsplus">x <- "match"
switch(x, mat = 0, match = 10, other = 100, 1000)
switch(x, mat = 0, match = 10, other = 100, 1000)
x <- "ma"
x <- "ma"
switch(x, mat = 0, match = 10, other = 100, 1000)
switch(x, mat = 0, match = 10, other = 100, 1000)
x <- "foo"
x <- "foo"
switch(x, mat = 0, match = 10, other = 100, 1000)</lang>
switch(x, mat = 0, match = 10, other = 100, 1000)</syntaxhighlight>
{{out}}
{{out}}
<pre>> switch(x, print("Print if x == 1"), print("Print if x == 2"))
<pre>> switch(x, print("Print if x == 1"), print("Print if x == 2"))
Line 5,935: Line 6,627:


Note also that it is not a ternary operator and its documentation warns against using it as such. In my experience, its most common use is in recoding data. For example:
Note also that it is not a ternary operator and its documentation warns against using it as such. In my experience, its most common use is in recoding data. For example:
<lang rsplus>data <- c(1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0)
<syntaxhighlight lang="rsplus">data <- c(1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0)
ifelse(data == 1, "Yes", "No")</lang>
ifelse(data == 1, "Yes", "No")</syntaxhighlight>
{{out}}
{{out}}
<pre>> ifelse(data == 1, "Yes", "No")
<pre>> ifelse(data == 1, "Yes", "No")
Line 5,945: Line 6,637:
===[http://docs.racket-lang.org/reference/if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29 if]===
===[http://docs.racket-lang.org/reference/if.html#%28form._%28%28quote._~23~25kernel%29._if%29%29 if]===
If-expressions in Racket must have both branches
If-expressions in Racket must have both branches
<lang racket>
<syntaxhighlight lang="racket">
(if (< x 10)
(if (< x 10)
"small"
"small"
"big")
"big")
</syntaxhighlight>
</lang>


===[http://docs.racket-lang.org/reference/when_unless.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._when%29%29 when/unless]===
===[http://docs.racket-lang.org/reference/when_unless.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._when%29%29 when/unless]===
One-sided conditional expressions use "when" and "unless". These are more convenient for side-effects since they have an implicit "begin" around their body, and you can also include new definitions
One-sided conditional expressions use "when" and "unless". These are more convenient for side-effects since they have an implicit "begin" around their body, and you can also include new definitions
<lang racket>
<syntaxhighlight lang="racket">
(when (< x 10)
(when (< x 10)
(define y (* x 10))
(define y (* x 10))
(printf "small\n"))
(printf "small\n"))
</syntaxhighlight>
</lang>


===[http://docs.racket-lang.org/reference/if.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._cond%29%29 cond]===
===[http://docs.racket-lang.org/reference/if.html#%28form._%28%28lib._racket%2Fprivate%2Fletstx-scheme..rkt%29._cond%29%29 cond]===
Used for multiple conditions:
Used for multiple conditions:
<lang racket>
<syntaxhighlight lang="racket">
(printf "x is ~a\n"
(printf "x is ~a\n"
(cond [(< x 1) "tiny"]
(cond [(< x 1) "tiny"]
Line 5,969: Line 6,661:
[(< x 100000000) "huge"]
[(< x 100000000) "huge"]
[else "gigantic"]))
[else "gigantic"]))
</syntaxhighlight>
</lang>


===[http://docs.racket-lang.org/reference/case.html#%28form._%28%28lib._racket%2Fprivate%2Fmore-scheme..rkt%29._case%29%29 case]===
===[http://docs.racket-lang.org/reference/case.html#%28form._%28%28lib._racket%2Fprivate%2Fmore-scheme..rkt%29._case%29%29 case]===
Similar to a "switch" statement in other languages
Similar to a "switch" statement in other languages
<lang racket>
<syntaxhighlight lang="racket">
(case x
(case x
[(1) "one"]
[(1) "one"]
Line 5,982: Line 6,674:
[(5 7 9) "odd"]
[(5 7 9) "odd"]
[else "something else"])
[else "something else"])
</syntaxhighlight>
</lang>


===etc===
===etc===
Line 5,994: Line 6,686:
</li><li> <tt>unless</tt> no longer permits <tt>elsif</tt> or <tt>else</tt> blocks.
</li><li> <tt>unless</tt> no longer permits <tt>elsif</tt> or <tt>else</tt> blocks.
</li><li> If the block of an <tt>if</tt>, <tt>elsif</tt>, or <tt>unless</tt> has a nonzero arity, the value of the conditional expression is used as an argument to the block:
</li><li> If the block of an <tt>if</tt>, <tt>elsif</tt>, or <tt>unless</tt> has a nonzero arity, the value of the conditional expression is used as an argument to the block:
<lang perl6>if won() -> $prize {
<syntaxhighlight lang="raku" line>if won() -> $prize {
say "You won $prize.";
say "You won $prize.";
}</lang>
}</syntaxhighlight>
If an <tt>else</tt> block has a nonzero arity, it receives the value of the condition tested by the last <tt>if</tt> or <tt>elsif</tt>. </li></ul>
If an <tt>else</tt> block has a nonzero arity, it receives the value of the condition tested by the last <tt>if</tt> or <tt>elsif</tt>. </li></ul>
===given/when===
===given/when===
Switch structures are done by topicalization and by smartmatching in Raku. They are somewhat orthogonal, you can use a <tt>given</tt> block without <tt>when</tt>, and vice versa. But the typical use is:
Switch structures are done by topicalization and by smartmatching in Raku. They are somewhat orthogonal, you can use a <tt>given</tt> block without <tt>when</tt>, and vice versa. But the typical use is:
<lang perl6>given lc prompt("Done? ") {
<syntaxhighlight lang="raku" line>given lc prompt("Done? ") {
when 'yes' { return }
when 'yes' { return }
when 'no' { next }
when 'no' { next }
default { say "Please answer either yes or no." }
default { say "Please answer either yes or no." }
}</lang>
}</syntaxhighlight>
<tt>when</tt> blocks are allowed in any block that topicalizes <tt>$_</tt>, including a
<tt>when</tt> blocks are allowed in any block that topicalizes <tt>$_</tt>, including a
<tt>for</tt> loop (assuming one of its loop variables is bound to <tt>$_</tt>)
<tt>for</tt> loop (assuming one of its loop variables is bound to <tt>$_</tt>)
or the body of a method (if you have declared the invocant as <tt>$_</tt>)." See [https://design.raku.org/S04.html#Switch_statements Synopsis 4].
or the body of a method (if you have declared the invocant as <tt>$_</tt>)." See more at: https://docs.raku.org/language/control#index-entry-switch_(given)


There are also statement modifier forms of all of the above.
There are also statement modifier forms of all of the above.
Line 6,013: Line 6,705:
===Ternary operator===
===Ternary operator===
The [[wp:ternary operator|ternary operator]] looks like this:
The [[wp:ternary operator|ternary operator]] looks like this:
<lang perl6>$expression ?? do_something !! do_fallback</lang>
<syntaxhighlight lang="raku" line>$expression ?? do_something !! do_fallback</syntaxhighlight>


===Other short-circuiting operators===
===Other short-circuiting operators===
Line 6,021: Line 6,713:
===If-Either-Case-Switch===
===If-Either-Case-Switch===
If the result is true, the block! will be evaluated. If false nothing happens.
If the result is true, the block! will be evaluated. If false nothing happens.
<lang Red>>> if 10 > 2 [print "ten is bigger"]
<syntaxhighlight lang="red">>> if 10 > 2 [print "ten is bigger"]
ten is bigger</lang>
ten is bigger</syntaxhighlight>
===EITHER===
===EITHER===
If the result is true the first block! will be evaluated.
If the result is true the first block! will be evaluated.
If false the second block! will be evaluated.
If false the second block! will be evaluated.
<lang Red>>> either 3 > 2 [print "Three larger"][print "Nope!"]
<syntaxhighlight lang="red">>> either 3 > 2 [print "Three larger"][print "Nope!"]
Three larger</lang>
Three larger</syntaxhighlight>
===CASE===
===CASE===
The block! following the first true condition is evaluated.
The block! following the first true condition is evaluated.
<lang Red>n: 50
<syntaxhighlight lang="red">n: 50
case [
case [
n < 10 [print "small number"]
n < 10 [print "small number"]
Line 6,051: Line 6,743:
medium number
medium number
large number
large number
none of these</lang>
none of these</syntaxhighlight>


===SWITCH===
===SWITCH===
<lang Red>switch "india" [
<syntaxhighlight lang="red">switch "india" [
"a" [print "string"]
"a" [print "string"]
23 [print "integer"]
23 [print "integer"]
Line 6,070: Line 6,762:
]
]


no match</lang>
no match</syntaxhighlight>


=={{header|Retro}}==
=={{header|Retro}}==
===choose, if, and -if===
===choose, if, and -if===
<lang Retro>condition [ true statements ] if
<syntaxhighlight lang="retro">condition [ true statements ] if
condition [ false statements ] -if
condition [ false statements ] -if
condition [ true statements ] [ false statements ] choose</lang>
condition [ true statements ] [ false statements ] choose</syntaxhighlight>


These forms can be used interactively, or inside function definitions.
These forms can be used interactively, or inside function definitions.


===when===
===when===
<lang Retro>:foo (n-)
<syntaxhighlight lang="retro">:foo (n-)
#1 [ ( if quote evaluates to true ) ] case
#1 [ ( if quote evaluates to true ) ] case
#2 [ ( if quote evaluates to true ) ] case
#2 [ ( if quote evaluates to true ) ] case
#3 [ ( if quote evaluates to true ) ] case
#3 [ ( if quote evaluates to true ) ] case
drop ( default action ) ;</lang>
drop ( default action ) ;</syntaxhighlight>


=={{header|REXX}}==
=={{header|REXX}}==
===IF--THEN, IF--THEN--ELSE===
===IF--THEN, IF--THEN--ELSE===
<lang rexx>if y then @=6 /* Y must be either 0 or 1 */
<syntaxhighlight lang="rexx">if y then @=6 /* Y must be either 0 or 1 */


if t**2>u then x=y /*simple IF with THEN & ELSE. */
if t**2>u then x=y /*simple IF with THEN & ELSE. */
Line 6,106: Line 6,798:
substr(abc,4,1)=='~' then if z=0 then call punt
substr(abc,4,1)=='~' then if z=0 then call punt
else nop /*NOP pairs up IF*/
else nop /*NOP pairs up IF*/
else if z<0 then z=-y /*alignment helps*/</lang>
else if z<0 then z=-y /*alignment helps*/</syntaxhighlight>


===SELECT--WHEN===
===SELECT--WHEN===
<lang rexx> /*the WHEN conditional operators are the same as*/
<syntaxhighlight lang="rexx"> /*the WHEN conditional operators are the same as*/
/*the IF conditional operators. */
/*the IF conditional operators. */
select
select
Line 6,132: Line 6,824:
when a=='wolf' then many='pack'
when a=='wolf' then many='pack'
otherwise many='?'
otherwise many='?'
end /*2nd select*/ /* [↑] uses OTHERWISE as a catch-all.*/</lang>
end /*2nd select*/ /* [↑] uses OTHERWISE as a catch-all.*/</syntaxhighlight>


===SELECT--WHEN/OTHERWISE===
===SELECT--WHEN/OTHERWISE===
<lang rexx> select
<syntaxhighlight lang="rexx"> select
when g=='angel' then many='host'
when g=='angel' then many='host'
when g=='ass' | g=='donkey' then many='pace'
when g=='ass' | g=='donkey' then many='pace'
Line 6,148: Line 6,840:
say
say
exit 13
exit 13
end /*select*/</lang>
end /*select*/</syntaxhighlight>


=={{header|Rhope}}==
=={{header|Rhope}}==
{{works with|Rhope|alpha 1}}
{{works with|Rhope|alpha 1}}
===if-then-else===
===if-then-else===
<lang rhope>If[cond]
<syntaxhighlight lang="rhope">If[cond]
|:
|:
Do Something[]
Do Something[]
:||:
:||:
Do Something Else[]
Do Something Else[]
:|</lang>
:|</syntaxhighlight>


=={{header|Ring}}==
=={{header|Ring}}==
'''if-but-else-ok'''
'''if-but-else-ok'''
<lang ring>If x == 1
<syntaxhighlight lang="ring">If x == 1
SomeFunc1()
SomeFunc1()
But x == 2
But x == 2
Line 6,168: Line 6,860:
Else
Else
SomeFunc()
SomeFunc()
Ok</lang>
Ok</syntaxhighlight>


'''Switch'''
'''Switch'''
<lang ring>Switch x
<syntaxhighlight lang="ring">Switch x
On 1
On 1
SomeFunc1()
SomeFunc1()
Line 6,178: Line 6,870:
Other
Other
SomeFunc()
SomeFunc()
Off</lang>
Off</syntaxhighlight>


=={{header|RLaB}}==
=={{header|RLaB}}==
Line 6,184: Line 6,876:
=== if ===
=== if ===
Block of instructions following the ''if'' command has to be always enclosed in curly brackets.
Block of instructions following the ''if'' command has to be always enclosed in curly brackets.
<syntaxhighlight lang="rlab">
<lang RLaB>
if (x==1)
if (x==1)
{
{
// do something
// do something
}
}
</syntaxhighlight>
</lang>


=== if-else ===
=== if-else ===
Line 6,195: Line 6,887:
Consider an example:
Consider an example:


<syntaxhighlight lang="rlab">
<lang RLaB>
if (x==1)
if (x==1)
{
{
Line 6,204: Line 6,896:
y = sin(const.pi*(1-x)) / (1-x);
y = sin(const.pi*(1-x)) / (1-x);
}
}
</syntaxhighlight>
</lang>


<syntaxhighlight lang="rlab">
<lang RLaB>
if (x==1)
if (x==1)
{
{
Line 6,219: Line 6,911:
y = rand();
y = rand();
}}
}}
</syntaxhighlight>
</lang>

=={{header|RPL}}==
'''IF..THEN'''
'''IF''' <instruction(s)> '''THEN''' <instruction(s)> '''END'''
'''IF..THEN..ELSE'''
'''IF''' <instruction(s)> '''THEN''' <instruction(s)> '''ELSE''' <instruction(s)> '''END'''
Instructions between <code>IF</code> and <code>THEN</code> are not mandatory, but recommended for lisibility. The interpreter considers <code>IF</code> as a null word and performs branching when meeting the word <code>THEN</code>: if stack level 1 is not equal to zero, the instructions between <code>THEN</code> and <code>END</code> will be executed.

<code>IFT</code> and <code>IFTE</code> are stack-based conditonal structures. <code>IFT</code> evaluates the content of stack level 1 only if the content of stack level 2 is not zero, otherwise it is dropped. <code>IFTE</code> evaluates the content of stack level 1 if the content of stack level 2 is zero, otherwise if evaluates the content of stack level 2.

'''CASE..END'''
'''CASE'''
<instruction(s)> '''THEN''' <instruction(s)> '''END'''
<instruction(s)> '''THEN''' <instruction(s)> '''END'''
<span style="color:grey">@ as many branches as needed</span>
<instruction(s)> <span style="color:grey">@ default branch (optional)</span>
'''END'''


=={{header|Ruby}}==
=={{header|Ruby}}==
Line 6,225: Line 6,934:


=={{header|Run BASIC}}==
=={{header|Run BASIC}}==
<lang Runbasic>' Boolean Evaluations
<syntaxhighlight lang="runbasic">' Boolean Evaluations
'
'
' > Greater Than
' > Greater Than
Line 6,304: Line 7,013:
print "color unknown"
print "color unknown"


end select</lang>
end select</syntaxhighlight>


=={{header|Rust}}==
=={{header|Rust}}==
Line 6,310: Line 7,019:
====Conditional compilation====
====Conditional compilation====
Rust supports conditional compilation via the `cfg` annotation.
Rust supports conditional compilation via the `cfg` annotation.
<lang rust>// This function will only be compiled if we are compiling on Linux
<syntaxhighlight lang="rust">// This function will only be compiled if we are compiling on Linux
#[cfg(target_os = "linux")]
#[cfg(target_os = "linux")]
fn running_linux() {
fn running_linux() {
Line 6,331: Line 7,040:
))]
))]
fn highly_specific_function() {}
fn highly_specific_function() {}
</syntaxhighlight>
</lang>
Conditional compilation may also be achieved via the `cfg!` macro.
Conditional compilation may also be achieved via the `cfg!` macro.
<lang rust>fn main() {
<syntaxhighlight lang="rust">fn main() {
if cfg!(target_os = "linux") {
if cfg!(target_os = "linux") {
// Do something
// Do something
}
}
}</lang>
}</syntaxhighlight>


====Generics (static dispatch)====
====Generics (static dispatch)====
By default, generics in Rust are monomorphized, so no vtable lookups at runtime are necessary.
By default, generics in Rust are monomorphized, so no vtable lookups at runtime are necessary.
<lang rust>trait PrintType {
<syntaxhighlight lang="rust">trait PrintType {
fn print_type(&self);
fn print_type(&self);
}
}
Line 6,368: Line 7,077:
prints_type_of_args(&'a', &2.0);
prints_type_of_args(&'a', &2.0);
prints_type_of_args(&'a', &'b');
prints_type_of_args(&'a', &'b');
}</lang>
}</syntaxhighlight>


===Runtime===
===Runtime===
====If-statement====
====If-statement====
<lang rust>if some_conditional {
<syntaxhighlight lang="rust">if some_conditional {
do_stuff();
do_stuff();
} else if some_other_conditional {
} else if some_other_conditional {
Line 6,392: Line 7,101:
// Do something with x_coord and y_coord
// Do something with x_coord and y_coord
}
}
}</lang>
}</syntaxhighlight>


====Match statement====
====Match statement====
Match statements are essentially more powerful switch statements
Match statements are essentially more powerful switch statements
<lang rust>fn some_other_function(p: Option<Point>) {
<syntaxhighlight lang="rust">fn some_other_function(p: Option<Point>) {
match p {
match p {
Some(Point { x: 0, y: 0 }) => println!("Point is on origin"),
Some(Point { x: 0, y: 0 }) => println!("Point is on origin"),
Line 6,405: Line 7,114:
None => println!("We didn't get a point"),
None => println!("We didn't get a point"),
}
}
}</lang>
}</syntaxhighlight>


====Generics (dynamic dispatch)====
====Generics (dynamic dispatch)====
Generics may also be accomplished via dynamic dispatch, so the actual code that is run is determined at compile time.
Generics may also be accomplished via dynamic dispatch, so the actual code that is run is determined at compile time.
Using the same trait defined in the static dispatch section:
Using the same trait defined in the static dispatch section:
<lang rust>fn prints_args_dynamic(arg1: &PrintType, arg2: &PrintType) {
<syntaxhighlight lang="rust">fn prints_args_dynamic(arg1: &PrintType, arg2: &PrintType) {
arg1.print_type();
arg1.print_type();
arg2.print_type();
arg2.print_type();
Line 6,417: Line 7,126:
prints_args_dynamic(&'a', &2.0);
prints_args_dynamic(&'a', &2.0);
prints_args_dynamic(&6.3,&'c');
prints_args_dynamic(&6.3,&'c');
}</lang>
}</syntaxhighlight>


=={{header|Sather}}==
=={{header|Sather}}==


<lang sather> if EXPR then
<syntaxhighlight lang="sather"> if EXPR then
-- CODE
-- CODE
elsif EXPR then
elsif EXPR then
Line 6,427: Line 7,136:
else
else
-- CODE
-- CODE
end;</lang>
end;</syntaxhighlight>


EXPR must evaluate to BOOL (true or false); <code>elsif</code> and <code>else</code> are optional.
EXPR must evaluate to BOOL (true or false); <code>elsif</code> and <code>else</code> are optional.


<lang sather> case EXPR
<syntaxhighlight lang="sather"> case EXPR
when EXPRL then
when EXPRL then
-- CODE
-- CODE
Line 6,438: Line 7,147:
else
else
-- CODE
-- CODE
end;</lang>
end;</syntaxhighlight>


EXPRL is a single expression or a comma-separated list of exressions. The expressions must evaluate to comparable objects (the method <code>is_eq</code> must be implemented)
EXPRL is a single expression or a comma-separated list of exressions. The expressions must evaluate to comparable objects (the method <code>is_eq</code> must be implemented)
Line 6,444: Line 7,153:
=={{header|Scala}}==
=={{header|Scala}}==
{{libheader|Scala}}
{{libheader|Scala}}
<lang Scala> if (n == 12) "twelve" else "not twelve"
<syntaxhighlight lang="scala"> if (n == 12) "twelve" else "not twelve"
today match {
today match {
Line 6,454: Line 7,163:
Accumulate_Sales
Accumulate_Sales
case _ => {}
case _ => {}
}</lang>
}</syntaxhighlight>


=={{header|Scheme}}==
=={{header|Scheme}}==
Line 6,461: Line 7,170:
===Primitive===
===Primitive===
====if====
====if====
<lang>(if <test> <consequent> <alternate>)</lang>
<syntaxhighlight lang="text">(if <test> <consequent> <alternate>)</syntaxhighlight>
<lang>(if <test> <consequent>)</lang>
<syntaxhighlight lang="text">(if <test> <consequent>)</syntaxhighlight>
Example:
Example:
<lang scheme>(display
<syntaxhighlight lang="scheme">(display
(if (> 1 2)
(if (> 1 2)
"yes"
"yes"
Line 6,472: Line 7,181:
(if (> 1 2)
(if (> 1 2)
(- 1 2)))
(- 1 2)))
(newline)</lang>
(newline)</syntaxhighlight>
{{out}}
{{out}}
<pre>no
<pre>no
Line 6,479: Line 7,188:
===Derived===
===Derived===
====cond====
====cond====
<lang>(cond <clause1> <clause2> ...)</lang>
<syntaxhighlight lang="text">(cond <clause1> <clause2> ...)</syntaxhighlight>
Example:
Example:
<lang scheme>(display
<syntaxhighlight lang="scheme">(display
(cond ((> 1 2) "greater")
(cond ((> 1 2) "greater")
((< 1 2) "less")))
((< 1 2) "less")))
Line 6,489: Line 7,198:
((< 1 1) "less")
((< 1 1) "less")
(else "equal")))
(else "equal")))
(newline)</lang>
(newline)</syntaxhighlight>
{{out}}
{{out}}
<pre>less
<pre>less
Line 6,495: Line 7,204:


====case====
====case====
<lang>(case <key> <clause1> <clause2> ...)</lang>
<syntaxhighlight lang="text">(case <key> <clause1> <clause2> ...)</syntaxhighlight>
Example:
Example:
<lang scheme>(display
<syntaxhighlight lang="scheme">(display
(case (* 2 3)
(case (* 2 3)
((2 3 5 7) "prime")
((2 3 5 7) "prime")
Line 6,507: Line 7,216:
((w y) "semivowel")
((w y) "semivowel")
(else "consonant")))
(else "consonant")))
(newline)</lang>
(newline)</syntaxhighlight>
{{out}}
{{out}}
<pre>composite
<pre>composite
Line 6,532: Line 7,241:
There can be single or multiple statements.
There can be single or multiple statements.
An if-statement can have multiple elsif parts.
An if-statement can have multiple elsif parts.
<lang seed7>if condition then
<syntaxhighlight lang="seed7">if condition then
statement
statement
end if;
end if;
Line 6,554: Line 7,263:
else
else
statement3;
statement3;
end if;</lang>
end if;</syntaxhighlight>


=== case ===
=== case ===
<lang seed7>case i of
<syntaxhighlight lang="seed7">case i of
when {1, 4, 9}: # Executed if i is 1, 4 or 9
when {1, 4, 9}: # Executed if i is 1, 4 or 9
statement1;
statement1;
Line 6,566: Line 7,275:
otherwise:
otherwise:
statement4;
statement4;
end case;</lang>
end case;</syntaxhighlight>


=={{header|SIMPOL}}==
=={{header|SIMPOL}}==
===if-else if-else===
===if-else if-else===
<lang simpol>if x == 1
<syntaxhighlight lang="simpol">if x == 1
foo()
foo()
else if x == 2
else if x == 2
Line 6,576: Line 7,285:
else
else
foobar()
foobar()
end if</lang>
end if</syntaxhighlight>


===ternary if function===
===ternary if function===
<lang simpol>.if(x == 1, "hello", "world")</lang>
<syntaxhighlight lang="simpol">.if(x == 1, "hello", "world")</syntaxhighlight>


=={{header|Simula}}==
=={{header|Simula}}==
Line 6,589: Line 7,298:
'''if''' X=Y '''then''' K:=I
'''if''' X=Y '''then''' K:=I
An example:
An example:
<lang simula>BEGIN
<syntaxhighlight lang="simula">BEGIN
INTEGER i,j;
INTEGER i,j;
i:=1; j:=2;
i:=1; j:=2;
Line 6,607: Line 7,316:
END;
END;
OutImage
OutImage
END</lang>
END</syntaxhighlight>
Simula 67 has also a switch structure:
Simula 67 has also a switch structure:
declaration::= '''switch''' switch:=list_of labels
declaration::= '''switch''' switch:=list_of labels
statement::= '''goto''' switch[expression]
statement::= '''goto''' switch[expression]
An example:
An example:
<lang simula>BEGIN
<syntaxhighlight lang="simula">BEGIN
INTEGER i,j;
INTEGER i,j;
SWITCH target:=L1,L2,L3;
SWITCH target:=L1,L2,L3;
Line 6,622: Line 7,331:
L3: OutText("CC");
L3: OutText("CC");
OutImage
OutImage
END</lang>
END</syntaxhighlight>


=={{header|Slate}}==
=={{header|Slate}}==
===ifTrue/ifFalse===
===ifTrue/ifFalse===
<lang slate>"Conditionals in Slate are really messages sent to Boolean objects. Like Smalltalk. (But the compiler might optimize some cases)"
<syntaxhighlight lang="slate">"Conditionals in Slate are really messages sent to Boolean objects. Like Smalltalk. (But the compiler might optimize some cases)"
balance > 0
balance > 0
ifTrue: [inform: 'still sitting pretty!'.]
ifTrue: [inform: 'still sitting pretty!'.]
ifFalse: [inform: 'No money till payday!'.].</lang>
ifFalse: [inform: 'No money till payday!'.].</syntaxhighlight>




===caseOf:otherwise:===
===caseOf:otherwise:===
<lang slate>c@(Net URLPathEncoder traits) convert
<syntaxhighlight lang="slate">c@(Net URLPathEncoder traits) convert
[ | byte1 byte2 byte3 digit1 digit2|
[ | byte1 byte2 byte3 digit1 digit2|
[c in isAtEnd] whileFalse:
[c in isAtEnd] whileFalse:
Line 6,647: Line 7,356:
} otherwise: [c out nextPut: byte1].
} otherwise: [c out nextPut: byte1].
].
].
].</lang>
].</syntaxhighlight>


===whileTrue:/whileFalse:===
===whileTrue:/whileFalse:===


<lang slate>[p isAtEnd] whileFalse: [p next evaluate]].</lang>
<syntaxhighlight lang="slate">[p isAtEnd] whileFalse: [p next evaluate]].</syntaxhighlight>

=={{header|Slope}}==

The following examples are highly derived, but should give the basics. All of the forms below (if, case, cond) return the result of evaluating their associated expression/consequent. The examples below tend toward side effects, so mostly return the empty list.

===if===

Syntax:
<syntaxhighlight lang="text">(if [test] [consequent] [[alternate]])</syntaxhighlight>

Example:

<syntaxhighlight lang="slope">(define my-file (file-open-read "my-file.txt"))
(if my-file (write (read-all my-file)) (! "Could not open file"))</syntaxhighlight>

===case===

Syntax:
<syntaxhighlight lang="text">(case [value] (match-val expression)...)</syntaxhighlight>

Example:
<syntaxhighlight lang="slope">
(case my-enum
(string (do-string my-enum))
(bool (do-bool my-enum))
(proc (my-enum))
(number (do-number my-enum))
(else (! "No match found in case")))</syntaxhighlight>

===cond===

Syntax:
<syntaxhighlight lang="text">(cond ([test] [expression])...)</syntaxhighlight>

Example:
<syntaxhighlight lang="slope">(define my-num 123)
(cond
((positive? my-num) 'positive)
((negative? my-num) 'negative)
(else 'zero))</syntaxhighlight>

=={{header|SmallBASIC}}==

===if===

<syntaxhighlight lang="basic">
IF foo == 1
PRINT "one"
ELSEIF foo == 2
PRINT "two"
ELSE
PRINT "something else"
ENDIF
</syntaxhighlight>

===Inline if===
<syntaxhighlight lang="basic">ans = iff(x <= 5, 0, 10)</syntaxhighlight>

===select===
<syntaxhighlight lang="basic">
select case x
case 12
print "x is 12"
case 13,14,15
print "x is 13,14,or 15"
case iff(x <= 4, x, x + 1)
print "x <= 4"
case else
print "x is not <=4,12,13,14,15"
end select
</syntaxhighlight>


=={{header|Smalltalk}}==
=={{header|Smalltalk}}==
Line 6,667: Line 7,447:
Conditionals in Smalltalk are really messages sent to Boolean objects.
Conditionals in Smalltalk are really messages sent to Boolean objects.
<br>The most basic conditional is the ifTrue/ifFalse, which is defined in 4 variants in the Boolean class &sup1; (the receiver is the following examples is a boolean, which get the alternative code pieces as argument):
<br>The most basic conditional is the ifTrue/ifFalse, which is defined in 4 variants in the Boolean class &sup1; (the receiver is the following examples is a boolean, which get the alternative code pieces as argument):
<lang smalltalk>
<syntaxhighlight lang="smalltalk">
balance > 0
balance > 0
ifTrue: [Transcript cr; show: 'still sitting pretty!'.]
ifTrue: [Transcript cr; show: 'still sitting pretty!'.]
Line 6,679: Line 7,459:
ifFalse:[ self gotoHappyHour ]
ifFalse:[ self gotoHappyHour ]
ifTrue:[ self noDrinksToday ].
ifTrue:[ self noDrinksToday ].
</syntaxhighlight>
</lang>


You can also use them as the ternary operator
You can also use them as the ternary operator


<lang smalltalk>abs := x > 0 ifTrue: [ x ] ifFalse: [ x negated ]</lang>
<syntaxhighlight lang="smalltalk">abs := x > 0 ifTrue: [ x ] ifFalse: [ x negated ]</syntaxhighlight>


Or get the alternatives from somewhere else (for example, passed as parameter)
Or get the alternatives from somewhere else (for example, passed as parameter)


<lang smalltalk>...
<syntaxhighlight lang="smalltalk">...
trueAction := [ ... do something ].
trueAction := [ ... do something ].
falseAction := [ ... do something else ...].
falseAction := [ ... do something else ...].
...
...
abs := x > 0 ifTrue:trueAction ifFalse:falseAction. "3)"</lang>
abs := x > 0 ifTrue:trueAction ifFalse:falseAction. "3)"</syntaxhighlight>


Note &sup1; strictly speaking, these are methods (aka virtual functions) in the subclasses of Boolean (True and False) if which true and false are singletons. Thus, conditional execution is actually implemented via polymorphism, in that those methods either do or do not evaluate their argument (or one of the alternatives). The compiler will optimize and inline special cases (i.e. boolean receivers).
Note &sup1; strictly speaking, these are methods (aka virtual functions) in the subclasses of Boolean (True and False) if which true and false are singletons. Thus, conditional execution is actually implemented via polymorphism, in that those methods either do or do not evaluate their argument (or one of the alternatives). The compiler will optimize and inline special cases (i.e. boolean receivers).
Line 6,698: Line 7,478:


===Switch Case===
===Switch Case===
<lang smalltalk>|x|
<syntaxhighlight lang="smalltalk">|x|
x := 1.
x := 1.
value :=
value :=
Line 6,706: Line 7,486:
[3]->['three']
[3]->['three']
}
}
otherwise:['none of them'].</lang>
otherwise:['none of them'].</syntaxhighlight>


=={{header|SNOBOL4}}==
=={{header|SNOBOL4}}==
SNOBOL4 has no structured programming features, but the two constructs in question could be easily emulated with FAILURE/SUCCESS and indirect jumps
SNOBOL4 has no structured programming features, but the two constructs in question could be easily emulated with FAILURE/SUCCESS and indirect jumps


<lang snobol> A = "true"
<syntaxhighlight lang="snobol"> A = "true"
* "if-then-else"
* "if-then-else"
if A "true" :s(goTrue)f(goFalse)
if A "true" :s(goTrue)f(goFalse)
Line 6,724: Line 7,504:
default output = "A is neither FALSE nor TRUE"
default output = "A is neither FALSE nor TRUE"
esac
esac
end</lang>
end</syntaxhighlight>


=={{header|SNUSP}}==
=={{header|SNUSP}}==


<lang snusp>$==?\==zero=====!/==#
<syntaxhighlight lang="snusp">$==?\==zero=====!/==#
\==non zero==/</lang>
\==non zero==/</syntaxhighlight>


'''?''' is the only conditional operator. It skips one character if the current cell is zero.
'''?''' is the only conditional operator. It skips one character if the current cell is zero.
Line 6,743: Line 7,523:
If statement:
If statement:


<lang sparkling>var odd = 13;
<syntaxhighlight lang="sparkling">var odd = 13;
if odd % 2 != 0 {
if odd % 2 != 0 {
print("odd");
print("odd");
}</lang>
}</syntaxhighlight>


If-else statement:
If-else statement:


<lang sparkling>var odd = 13;
<syntaxhighlight lang="sparkling">var odd = 13;
if odd % 2 != 0 {
if odd % 2 != 0 {
print("odd");
print("odd");
} else {
} else {
print("even");
print("even");
}</lang>
}</syntaxhighlight>


If and if-else statements can be chained:
If and if-else statements can be chained:


<lang sparkling>var nodiv3 = 13;
<syntaxhighlight lang="sparkling">var nodiv3 = 13;
if nodiv3 % 3 == 0 {
if nodiv3 % 3 == 0 {
print("divisible by 3");
print("divisible by 3");
Line 6,766: Line 7,546:
} else {
} else {
print("gives 2 remainder");
print("gives 2 remainder");
}</lang>
}</syntaxhighlight>


There's no "switch-case" statement in Sparkling yet, but it's work in progress.
There's no "switch-case" statement in Sparkling yet, but it's work in progress.
Line 6,773: Line 7,553:
{{works with|MS SQL|2005}}
{{works with|MS SQL|2005}}
===Conditional Expression===
===Conditional Expression===
<lang sql>case when a then b else c end
<syntaxhighlight lang="sql">case when a then b else c end


declare @n int
declare @n int
Line 6,781: Line 7,561:
--If/ElseIf expression
--If/ElseIf expression
set @n=5
set @n=5
print case when @n=3 then 'Three' when @n=4 then 'Four' else 'Other' end</lang>
print case when @n=3 then 'Three' when @n=4 then 'Four' else 'Other' end</syntaxhighlight>


===If/Else===
===If/Else===
<lang sql>declare @n int
<syntaxhighlight lang="sql">declare @n int
set @n=123
set @n=123
if @n=123
if @n=123
Line 6,792: Line 7,572:
ELSE
ELSE
if @n=124 print 'one two four'
if @n=124 print 'one two four'
else print 'other'</lang>
else print 'other'</syntaxhighlight>


=={{header|SSEM}}==
=={{header|SSEM}}==
The SSEM's only conditional operation is <tt>011 Test</tt>, which causes the computer to skip the next instruction if the value held in the accumulator is negative. This program illustrates it: assuming address 10 stores a variable, we test whether its negation is negative (i.e. whether the variable itself is positive). If it is, we skip the next instruction and proceed with the program; but, if it is not negative (i.e. the variable is negative or zero), we jump to address 1 + the value stored at address 14. It is easy to see how this can be used to implement loops, other conditional tests, etc.
The SSEM's only conditional operation is <tt>011 Test</tt>, which causes the computer to skip the next instruction if the value held in the accumulator is negative. This program illustrates it: assuming address 10 stores a variable, we test whether its negation is negative (i.e. whether the variable itself is positive). If it is, we skip the next instruction and proceed with the program; but, if it is not negative (i.e. the variable is negative or zero), we jump to address 1 + the value stored at address 14. It is easy to see how this can be used to implement loops, other conditional tests, etc.
<lang ssem>01010000000000100000000000000000 -10 to c
<syntaxhighlight lang="ssem">01010000000000100000000000000000 -10 to c
00000000000000110000000000000000 Test
00000000000000110000000000000000 Test
01110000000000000000000000000000 14 to CI</lang>
01110000000000000000000000000000 14 to CI</syntaxhighlight>


=={{header|Stata}}==
=={{header|Stata}}==
Line 6,804: Line 7,584:
This is an equivalent of a ternary ?: in C, useful for instance when creating a variable with '''[https://www.stata.com/help.cgi?generate gen]'''. See '''[https://www.stata.com/help.cgi?cond cond]''' in Stata help.
This is an equivalent of a ternary ?: in C, useful for instance when creating a variable with '''[https://www.stata.com/help.cgi?generate gen]'''. See '''[https://www.stata.com/help.cgi?cond cond]''' in Stata help.


<lang stata>clear
<syntaxhighlight lang="stata">clear
set obs 4
set obs 4
gen a = cond(mod(_n, 2)==1, "A", "B")
gen a = cond(mod(_n, 2)==1, "A", "B")
Line 6,814: Line 7,594:
| A |
| A |
| B |
| B |
+---+</lang>
+---+</syntaxhighlight>


=== if command ===
=== if command ===
This one is mainly useful in programs. See '''[https://www.stata.com/help.cgi?ifcmd ifcmd]''' in Stata help. To illustrate the command, here is a program that checks if a number is prime.
This one is mainly useful in programs. See '''[https://www.stata.com/help.cgi?ifcmd ifcmd]''' in Stata help. To illustrate the command, here is a program that checks if a number is prime.


<lang stata>program isprime
<syntaxhighlight lang="stata">program isprime
sca n = `0'
sca n = `0'
sca p = 1
sca p = 1
Line 6,852: Line 7,632:


isprime `=10^12-11'
isprime `=10^12-11'
999999999989 is prime.</lang>
999999999989 is prime.</syntaxhighlight>


=== if expression ===
=== if expression ===
When used in a command, '''[https://www.stata.com/help.cgi?if if]''' means the command is to be applied to the data subset for which the if expression is true.
When used in a command, '''[https://www.stata.com/help.cgi?if if]''' means the command is to be applied to the data subset for which the if expression is true.


<lang stata>clear
<syntaxhighlight lang="stata">clear
set obs 100
set obs 100
count
count
100
100
count if mod(_n, 3)==0
count if mod(_n, 3)==0
33</lang>
33</syntaxhighlight>


=== if statement in Mata ===
=== if statement in Mata ===
See [https://www.stata.com/help.cgi?%5bM-2%5d%20if Stata help]. Here is an equivalent of the above program to check if a number is prime.
See [https://www.stata.com/help.cgi?%5bM-2%5d%20if Stata help]. Here is an equivalent of the above program to check if a number is prime.


<lang stata>function isprime(n) {
<syntaxhighlight lang="stata">function isprime(n) {
if (n<5) return(n==2 | n==3)
if (n<5) return(n==2 | n==3)
else if (mod(n, 2)==0) return(0)
else if (mod(n, 2)==0) return(0)
Line 6,879: Line 7,659:


isprime(10^12-11)
isprime(10^12-11)
1</lang>
1</syntaxhighlight>


=== ternary operator in Mata ===
=== ternary operator in Mata ===
Line 6,885: Line 7,665:
See [https://www.stata.com/help.cgi?m2_op_conditional Stata help]. Here is a recursive implementation of the Fibonacci sequence, to illustrate.
See [https://www.stata.com/help.cgi?m2_op_conditional Stata help]. Here is a recursive implementation of the Fibonacci sequence, to illustrate.


<lang stata>function fib(n) {
<syntaxhighlight lang="stata">function fib(n) {
return(n<2 ? n : fib(n-1)+fib(n-2))
return(n<2 ? n : fib(n-1)+fib(n-2))
}
}


fib(10)
fib(10)
55</lang>
55</syntaxhighlight>


=={{header|Swahili}}==
=={{header|Swahili}}==
===if-else if-else (kama-au-sivyo)===
===if-else if-else (kama-au-sivyo)===
<lang swahili>kama (kweli) {
<syntaxhighlight lang="swahili">kama (kweli) {
andika("statement")
andika("statement")
} au (kweli /* condition */) {
} au (kweli /* condition */) {
Line 6,902: Line 7,682:
} sivyo {
} sivyo {
andika("statement")
andika("statement")
}</lang>
}</syntaxhighlight>


=={{header|Tailspin}}==
=={{header|Tailspin}}==
Tailspin has only one true conditional structure, a set of matchers. Each templates (sort of a function that takes one input value and emits zero or more outputs) has a set of matchers. If it only has matchers, they are invoked. If the templates has a
Tailspin has only one true conditional structure, a set of matchers. Each templates (sort of a function that takes one input value and emits zero or more outputs) has a set of matchers. If it only has matchers, they are invoked. If the templates has a
block, the matchers are invoked by sending to them (by "-> #"). The matchers can also be used as a looping structure by sending values back to be matched (also by "-> #").
block, the matchers are invoked by sending to them (by "-> #"). The matchers can also be used as a looping structure by sending values back to be matched (also by "-> #").
<lang tailspin>
<syntaxhighlight lang="tailspin">
templates foo
templates foo
when <=0> do 'zero' -> !OUT::write
when <=0> do 'zero' -> !OUT::write
Line 6,916: Line 7,696:
otherwise 'odd' -> !OUT::write
otherwise 'odd' -> !OUT::write
end foo
end foo
</syntaxhighlight>
</lang>


=={{header|Tcl}}==
=={{header|Tcl}}==


===if-then-else===
===if-then-else===
<lang tcl>if {$foo == 3} {
<syntaxhighlight lang="tcl">if {$foo == 3} {
puts "foo is three"
puts "foo is three"
} elseif {$foo == 4} {
} elseif {$foo == 4} {
Line 6,927: Line 7,707:
} else {
} else {
puts "foo is neither three nor four"
puts "foo is neither three nor four"
}</lang>
}</syntaxhighlight>
or (using the ternary operator of expressions)
or (using the ternary operator of expressions)
<lang tcl>set result [expr { $foo == 3 ? "three" : "not three" }]</lang>
<syntaxhighlight lang="tcl">set result [expr { $foo == 3 ? "three" : "not three" }]</syntaxhighlight>


===switch===
===switch===
<lang tcl>switch -- $foo {
<syntaxhighlight lang="tcl">switch -- $foo {
3 {puts "foo is three"}
3 {puts "foo is three"}
4 {puts "foo is four"}
4 {puts "foo is four"}
default {puts "foo is something else"}
default {puts "foo is something else"}
}</lang>
}</syntaxhighlight>
Note that the <tt>switch</tt> command can also use glob matching (like <tt>case</tt> in the Bourne Shell) or regular-expression matching.
Note that the <tt>switch</tt> command can also use glob matching (like <tt>case</tt> in the Bourne Shell) or regular-expression matching.


Line 6,944: Line 7,724:


===If Statement===
===If Statement===
<lang tern>if(a > b)
<syntaxhighlight lang="tern">if(a > b)
println(a);</lang>
println(a);</syntaxhighlight>


===If Else Statement===
===If Else Statement===
<lang tern>if(a > b) {
<syntaxhighlight lang="tern">if(a > b) {
println(a);
println(a);
} else {
} else {
println(b);
println(b);
}</lang>
}</syntaxhighlight>


===Unless Statement===
===Unless Statement===
<lang tern>unless(a > b) {
<syntaxhighlight lang="tern">unless(a > b) {
println(b);
println(b);
} else {
} else {
println(a);
println(a);
}</lang>
}</syntaxhighlight>


===Switch Statement===
===Switch Statement===
<lang tern>switch(a) {
<syntaxhighlight lang="tern">switch(a) {
case 10:
case 10:
case 11:
case 11:
Line 6,969: Line 7,749:
default:
default:
println(b);
println(b);
}</lang>
}</syntaxhighlight>


=={{header|TI-83 BASIC}}==
=={{header|TI-83 BASIC}}==
Line 6,976: Line 7,756:
'''Basic form'''
'''Basic form'''
<br> with only one statement for the true part:
<br> with only one statement for the true part:
<lang ti83b>If condition
<syntaxhighlight lang="ti83b">If condition
statement</lang>
statement</syntaxhighlight>
or in one line
or in one line
<lang ti83b>If condition : statement</lang>
<syntaxhighlight lang="ti83b">If condition : statement</syntaxhighlight>


'''If-Then form'''
'''If-Then form'''
<lang ti83b>If condition
<syntaxhighlight lang="ti83b">If condition
Then
Then
statements
statements
End</lang>
End</syntaxhighlight>


'''If-Then-Else form'''
'''If-Then-Else form'''
<lang ti83b>If condition
<syntaxhighlight lang="ti83b">If condition
Then
Then
statements
statements
Else
Else
statements
statements
End</lang>
End</syntaxhighlight>


=={{header|Toka}}==
=={{header|Toka}}==
Line 7,000: Line 7,780:
( condition ) ( quote ) ifTrue
( condition ) ( quote ) ifTrue


<lang toka>100 100 = [ ." True\n" ] ifTrue
<syntaxhighlight lang="toka">100 100 = [ ." True\n" ] ifTrue
100 200 = [ ." True\n" ] ifTrue</lang>
100 200 = [ ." True\n" ] ifTrue</syntaxhighlight>


===ifFalse===
===ifFalse===
( condition ) ( quote ) ifFalse
( condition ) ( quote ) ifFalse


<lang toka>100 100 = [ ." True\n" ] ifFalse
<syntaxhighlight lang="toka">100 100 = [ ." True\n" ] ifFalse
100 200 = [ ." True\n" ] ifFalse</lang>
100 200 = [ ." True\n" ] ifFalse</syntaxhighlight>


===ifTrueFalse===
===ifTrueFalse===
( condition ) ( true quote ) ( false quote ) ifTrueFalse
( condition ) ( true quote ) ( false quote ) ifTrueFalse


<lang toka>100 100 = [ ." Equal\n" ] [ ." Not Equal\n" ] ifTrueFalse
<syntaxhighlight lang="toka">100 100 = [ ." Equal\n" ] [ ." Not Equal\n" ] ifTrueFalse
100 200 = [ ." Equal\n" ] [ ." Not Equal\n" ] ifTrueFalse</lang>
100 200 = [ ." Equal\n" ] [ ." Not Equal\n" ] ifTrueFalse</syntaxhighlight>


=={{header|TorqueScript}}==
=={{header|TorqueScript}}==
Line 7,019: Line 7,799:
===if-then-else===
===if-then-else===


<lang tqs>// numbers and objects
<syntaxhighlight lang="tqs">// numbers and objects
if(%num == 1)
if(%num == 1)
{
{
Line 7,045: Line 7,825:
{
{
deusEx();
deusEx();
}</lang>
}</syntaxhighlight>


===switch===
===switch===


<lang tqs>// numbers and objects
<syntaxhighlight lang="tqs">// numbers and objects
switch(%num)
switch(%num)
{
{
Line 7,077: Line 7,857:
default:
default:
somethingElse();
somethingElse();
}</lang>
}</syntaxhighlight>


===conditional (ternary) operator (?:)===
===conditional (ternary) operator (?:)===


<lang tqs>%formatted = %str @ ((getSubStr(%str,strLen(%str) - 1,1) $= "s") ? "'" : "'s");</lang>
<syntaxhighlight lang="tqs">%formatted = %str @ ((getSubStr(%str,strLen(%str) - 1,1) $= "s") ? "'" : "'s");</syntaxhighlight>


=={{header|Transd}}==

Transd has as an universal conditional expression - the '''if-elsif-else''' operator. Also, the conditional evaluation
is achieved through logical functions.

<syntaxhighlight lang="Scheme">#lang transd

MainModule: {
_start: (λ locals: b 1 c 0
(textout (if b "OK" else "NO") "\n")

// switch/case emulation

(textout (* 5
(if (== b 0) 2
elsif (== b 1) 5
else 6)) "\n")

// example of using 'or' as a conditional construct

(or (!= c 0) (textout "c is 0"))
)
}</syntaxhighlight>
{{out}}
<pre>
OK
25
c is 0
</pre>


=={{header|Trith}}==
=={{header|Trith}}==
===branch===
===branch===
<lang trith>true ["yes" print] ["no" print] branch</lang>
<syntaxhighlight lang="trith">true ["yes" print] ["no" print] branch</syntaxhighlight>
===when===
===when===
<lang trith>true ["yes" print] when</lang>
<syntaxhighlight lang="trith">true ["yes" print] when</syntaxhighlight>
===unless===
===unless===
<lang trith>false ["no" print] unless</lang>
<syntaxhighlight lang="trith">false ["no" print] unless</syntaxhighlight>




=={{header|True BASIC}}==
=={{header|True BASIC}}==
<lang basic>
<syntaxhighlight lang="basic">
! IF-ELSEIF-ELSE-END IF
! IF-ELSEIF-ELSE-END IF
! SELECT-CASE
! SELECT-CASE
Line 7,128: Line 7,939:


ON expresión Gosub label1, label2 ELSE label3
ON expresión Gosub label1, label2 ELSE label3
</syntaxhighlight>
</lang>


=={{header|TUSCRIPT}}==
=={{header|TUSCRIPT}}==
===IF ELSEIF ELSE ENDIF===
===IF ELSEIF ELSE ENDIF===
<lang tuscript>
<syntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
$$ MODE TUSCRIPT


Line 7,143: Line 7,954:
---> do something
---> do something
ENDIF
ENDIF
</syntaxhighlight>
</lang>
===SELECT CASE DEFAULT ENDSELECT===
===SELECT CASE DEFAULT ENDSELECT===
<lang tuscript>
<syntaxhighlight lang="tuscript">
$$ MODE TUSCRIPT
$$ MODE TUSCRIPT


Line 7,160: Line 7,971:
---> do something
---> do something
ENDSELECT
ENDSELECT
</syntaxhighlight>
</lang>


=={{header|TXR}}==
=={{header|TXR}}==
Line 7,172: Line 7,983:
For instance the <code>choose</code> construct will select, from among those clauses which match successfully, the one which maximizes or minimizes the length of an extracted variable binding:
For instance the <code>choose</code> construct will select, from among those clauses which match successfully, the one which maximizes or minimizes the length of an extracted variable binding:


<lang txr>
<syntaxhighlight lang="txr">
@(choose :shortest x)
@(choose :shortest x)
@x:@y
@x:@y
Line 7,179: Line 7,990:
@(or)
@(or)
@x+@y
@x+@y
@(end)</lang>
@(end)</syntaxhighlight>


Suppose the input is something which can match all three patterns in different ways:
Suppose the input is something which can match all three patterns in different ways:
Line 7,198: Line 8,009:
For instance:
For instance:


<lang txr>@(all)
<syntaxhighlight lang="txr">@(all)
@x:y@
@x:y@
@z<-@w
@z<-@w
Line 7,205: Line 8,016:
We have a match: (x, y, z, w) = (@x, @y, @z, @w).
We have a match: (x, y, z, w) = (@x, @y, @z, @w).
@(end)
@(end)
@(end)</lang>
@(end)</syntaxhighlight>


If any subclause fails to match, then <code>all</code> stops processing subsequent clauses. There are subtleties though, because an earlier clause can produce variable bindings which are visible to later clauses.
If any subclause fails to match, then <code>all</code> stops processing subsequent clauses. There are subtleties though, because an earlier clause can produce variable bindings which are visible to later clauses.
If previously bound variable is bound again, it must be to an identical piece of text:
If previously bound variable is bound again, it must be to an identical piece of text:


<lang txr>@# match a line which contains some piece of text x
<syntaxhighlight lang="txr">@# match a line which contains some piece of text x
@# after the rightmost occurence of : such that the same piece
@# after the rightmost occurence of : such that the same piece
@# of text also occurs at the start of the line preceded by -->
@# of text also occurs at the start of the line preceded by -->
Line 7,217: Line 8,028:
@(and)
@(and)
-->@x@/.*/
-->@x@/.*/
@(end)</lang>
@(end)</syntaxhighlight>


<pre>$ echo "-->asdfhjig:asdf" | txr -B weird.txr -
<pre>$ echo "-->asdfhjig:asdf" | txr -B weird.txr -
Line 7,233: Line 8,044:
The basic syntax is <code>if ''command-list''; then ''command-list''; fi</code>. If the first command list succeeds (by returning 0 for success), then the shell runs the second command list.
The basic syntax is <code>if ''command-list''; then ''command-list''; fi</code>. If the first command list succeeds (by returning 0 for success), then the shell runs the second command list.


<lang sh>if test 3 -lt 5; then echo '3 is less than 5'; fi</lang>
<syntaxhighlight lang="sh">if test 3 -lt 5; then echo '3 is less than 5'; fi</syntaxhighlight>


==== Else and elif ====
==== Else and elif ====
Line 7,239: Line 8,050:
There are optional <code>elif</code> (else if) and <code>else</code> clauses.
There are optional <code>elif</code> (else if) and <code>else</code> clauses.


<lang sh>if test 4 -ge 6; then
<syntaxhighlight lang="sh">if test 4 -ge 6
echo '4 is greater than or equal to 6'
then echo '4 is greater than or equal to 6'
elif test 4 -lt 6; then
elif test 4 -lt 6
echo '4 is less than 6'
then echo '4 is less than 6'
else echo '4 compares not to 6'
else
fi</syntaxhighlight>
echo '4 compares not to 6'
fi</lang>


==== Switch conditionals ====
==== Switch conditionals ====
Line 7,251: Line 8,061:
The Unix shell provides support for multibranch switch conditional constructs using the case statement:
The Unix shell provides support for multibranch switch conditional constructs using the case statement:


<lang sh>case value in
<syntaxhighlight lang="sh">case value in
choicea)
choicea)
foo
foo
Line 7,258: Line 8,068:
bar
bar
;;
;;
esac</lang>
esac</syntaxhighlight>


==== Conditional branching using operators ====
==== Conditional branching using operators ====
Line 7,264: Line 8,074:
One can also use <code>&&</code> and <code>||</code> as conditional structures; see [[short-circuit evaluation#UNIX Shell]].
One can also use <code>&&</code> and <code>||</code> as conditional structures; see [[short-circuit evaluation#UNIX Shell]].


<lang sh>test 3 -lt 5 && echo '3 is less than 5'
<syntaxhighlight lang="sh">test 3 -lt 5 && echo '3 is less than 5'
test 4 -ge 6 || echo '4 is not greater than or equal to 6'</lang>
test 4 -ge 6 || echo '4 is not greater than or equal to 6'</syntaxhighlight>


==== Conditional loops ====
==== Conditional loops ====
Line 7,271: Line 8,081:
The Unix shell also supports conditional loops:
The Unix shell also supports conditional loops:


<lang sh># This is a while loop
<syntaxhighlight lang="sh"># This is a while loop
l=1
l=1
while [ l -le 5 ]; do
while [ l -le 5 ]; do
Line 7,281: Line 8,091:
until [ l -eq 5 ]; do
until [ l -eq 5 ]; do
echo $l
echo $l
done</lang>
done</syntaxhighlight>


==={{header|C Shell}}===
==={{header|C Shell}}===
The single-line <code>if</code> syntax is <code>if (''expression'') ''simple-command''</code>.
The single-line <code>if</code> syntax is <code>if (''expression'') ''simple-command''</code>.


<lang csh>if (3 < 5) echo '3 is less than 5'
<syntaxhighlight lang="csh">if (3 < 5) echo '3 is less than 5'
if ({ grep -q ^root: /etc/passwd }) echo 'passwd has root'</lang>
if ({ grep -q ^root: /etc/passwd }) echo 'passwd has root'</syntaxhighlight>


The multi-line <code>if</code> syntax has a <code>then</code> clause, and can have optional <code>else if</code> and <code>else</code> clauses. Each clause may contain multiple commands.
The multi-line <code>if</code> syntax has a <code>then</code> clause, and can have optional <code>else if</code> and <code>else</code> clauses. Each clause may contain multiple commands.


<lang csh>if (4 >= 6) then
<syntaxhighlight lang="csh">if (4 >= 6) then
echo '4 is greater than or equal to 6'
echo '4 is greater than or equal to 6'
else if (4 < 6) then
else if (4 < 6) then
Line 7,297: Line 8,107:
else
else
echo '4 compares not to 6'
echo '4 compares not to 6'
endif</lang>
endif</syntaxhighlight>


=={{header|Unison}}==
=={{header|Unison}}==
<lang Unison>factorial : Nat -> Nat
<syntaxhighlight lang="unison">factorial : Nat -> Nat
factorial x =
factorial x =
if x == 0 then 1
if x == 0 then 1
else
else
x * fac (Nat.drop x 1)</lang>
x * fac (Nat.drop x 1)</syntaxhighlight>

=={{header|Ursalang}}==
===if…then…else===
Ursalang has a single conditional construct, the familiar `if…then…else`.<syntaxhighlight lang="ursalang">
if energyLevel > 9000 { "That's impossible!!!" } else { "Ok, I guess" }
</syntaxhighlight>As in most C-like languages, conditionals can be chained:<syntaxhighlight>
if color == "red" { "aaaaaah!" }
else if color == "blue" { "oooooh!" }
else { "eeeeeeee!" }
</syntaxhighlight>


=={{header|V}}==
=={{header|V}}==
===ifThenElse===
===ifThenElse===
<lang v>[true]
<syntaxhighlight lang="v">[true]
['is true' puts]
['is true' puts]
['is false' puts]
['is false' puts]
ifte
ifte


=is true</lang>
=is true</syntaxhighlight>


===ifThen===
===ifThen===
<lang v>[true]
<syntaxhighlight lang="v">[true]
['is true' puts]
['is true' puts]
if
if
=is true</lang>
=is true</syntaxhighlight>


===When===
===When===
<lang v>3 [
<syntaxhighlight lang="v">3 [
[1 =] [1 *]
[1 =] [1 *]
[2 =] [10 *]
[2 =] [10 *]
Line 7,329: Line 8,149:
] when
] when


=300</lang>
=300</syntaxhighlight>
===Choice===
===Choice===
<lang v>true
<syntaxhighlight lang="v">true
1 2
1 2
choice
choice
Line 7,341: Line 8,161:
choice
choice


=2</lang>
=2</syntaxhighlight>


=={{header|VBA}}==
=={{header|VBA}}==
===If Else End If===
===If Else End If===
<syntaxhighlight lang="vb">
<lang vb>
Sub C_S_If()
Sub C_S_If()
Dim A$, B$
Dim A$, B$
Line 7,370: Line 8,190:
If A = B Then Debug.Print A & " = " & B Else Debug.Print A & " and " & B & " are differents."
If A = B Then Debug.Print A & " = " & B Else Debug.Print A & " and " & B & " are differents."
If A = B Then Debug.Print A & " = " & B Else: Debug.Print A & " and " & B & " are differents."
If A = B Then Debug.Print A & " = " & B Else: Debug.Print A & " and " & B & " are differents."
End Sub</lang>
End Sub</syntaxhighlight>


===If ElseIf Else End If===
===If ElseIf Else End If===
<lang vb>Sub C_S_ElseIf()
<syntaxhighlight lang="vb">Sub C_S_ElseIf()
Dim A$, B$
Dim A$, B$


Line 7,388: Line 8,208:
Debug.Print A & " < " & B
Debug.Print A & " < " & B
End If
End If
End Sub</lang>
End Sub</syntaxhighlight>
===Select Case===
===Select Case===
<lang vb>Sub C_S_Select_Case()
<syntaxhighlight lang="vb">Sub C_S_Select_Case()
'With Strings
'With Strings
Dim A$, C&
Dim A$, C&
Line 7,441: Line 8,261:
Debug.Print "C >= 20"
Debug.Print "C >= 20"
End Select
End Select
End Sub</lang>
End Sub</syntaxhighlight>
===Inline IF===
===Inline IF===
<lang vb>Sub C_S_IIF()
<syntaxhighlight lang="vb">Sub C_S_IIF()
Dim myName
Dim myName
myName = 2
myName = 2
Line 7,449: Line 8,269:
'return : Justin
'return : Justin
End Sub
End Sub
</syntaxhighlight>
</lang>
===Switch===
===Switch===
<lang vb>Sub C_S_Switch()
<syntaxhighlight lang="vb">Sub C_S_Switch()
Dim myName
Dim myName
myName = 2
myName = 2
Line 7,457: Line 8,277:
'return : Justin
'return : Justin
End Sub
End Sub
</syntaxhighlight>
</lang>


=={{header|VBScript}}==
=={{header|VBScript}}==
===if-then-else===
===if-then-else===
Block form:
Block form:
<lang vb>If condition1 Then
<syntaxhighlight lang="vb">If condition1 Then
statement
statement
End If
End If
Line 7,476: Line 8,296:
statement
statement
End If
End If
</syntaxhighlight>
</lang>
Line form:
Line form:
<lang vb>If condition Then statement
<syntaxhighlight lang="vb">If condition Then statement


If condition Then statement Else statement</lang>
If condition Then statement Else statement</syntaxhighlight>
===select-case===
===select-case===
<lang vb>Select Case Expression
<syntaxhighlight lang="vb">Select Case Expression
Case Value1: statement
Case Value1: statement
Case Value2: statement
Case Value2: statement
Line 7,500: Line 8,320:
Case Else
Case Else
statements
statements
End Select</lang>
End Select</syntaxhighlight>


=={{header|Verbexx}}==
=={{header|Verbexx}}==
<lang verbexx>@VAR a b = 1 2;
<syntaxhighlight lang="verbexx">@VAR a b = 1 2;


// -------------------------------------------------------------------------------------
// -------------------------------------------------------------------------------------
Line 7,572: Line 8,392:
n = 0 @CASE results: n == 0(1)
n = 0 @CASE results: n == 0(1)
n = 1 @CASE results: n == 1(2c)
n = 1 @CASE results: n == 1(2c)
n = 2 @CASE results: else</lang>
n = 2 @CASE results: else</syntaxhighlight>




=={{header|Verilog}}==
=={{header|Verilog}}==
===if-else===
===if-else===
<syntaxhighlight lang="verilog">
<lang Verilog>
if( expr_booleana ) command1;
if( expr_booleana ) command1;
else command2;
else command2;
</syntaxhighlight>
</lang>


===case===
===case===
<syntaxhighlight lang="verilog">
<lang Verilog>
case( expr_booleana )
case( expr_booleana )
valor1: command1;
valor1: command1;
Line 7,590: Line 8,410:
default: commandN;
default: commandN;
endcase
endcase
</syntaxhighlight>
</lang>




Line 7,596: Line 8,416:
===if-then-else===
===if-then-else===
====Block form====
====Block form====
<lang vb>If condition Then
<syntaxhighlight lang="vb">If condition Then
statement
statement
End If
End If
Line 7,615: Line 8,435:
Else
Else
statement
statement
End If</lang>
End If</syntaxhighlight>


====Line form====
====Line form====
<lang vb>If condition Then statement
<syntaxhighlight lang="vb">If condition Then statement


If condition Then statement Else statement</lang>
If condition Then statement Else statement</syntaxhighlight>


===select-case===
===select-case===
<lang vb>Select Case Expression
<syntaxhighlight lang="vb">Select Case Expression
Case Value1: statement
Case Value1: statement
Case Value2: statement
Case Value2: statement
Line 7,642: Line 8,462:
statements
statements
End Select
End Select
</syntaxhighlight>
</lang>
===inline if-then-else===
===inline if-then-else===
<lang vb>IIf(expr, then-value, else-value)</lang>
<syntaxhighlight lang="vb">IIf(expr, then-value, else-value)</syntaxhighlight>
Example:
Example:
<lang vbnet> myName = 2
<syntaxhighlight lang="vbnet"> myName = 2
Debug.Print IIf(myName = 1, "John", "Jack")
Debug.Print IIf(myName = 1, "John", "Jack")
'return : "Jack")</lang>
'return : "Jack")</syntaxhighlight>


===inline switch===
===inline switch===
<lang vb>Switch(expr-1, value-1[, expr-2, value-2 … [, expr-n,value-n]])</lang>
<syntaxhighlight lang="vb">Switch(expr-1, value-1[, expr-2, value-2 … [, expr-n,value-n]])</syntaxhighlight>
Example:
Example:
<lang vb> myName = 2
<syntaxhighlight lang="vb"> myName = 2
Debug.Print Switch(myName = 1, "James", myName = 2, "Jacob", myName = 3, "Jeremy")
Debug.Print Switch(myName = 1, "James", myName = 2, "Jacob", myName = 3, "Jeremy")
'return : "Jacob"</lang>
'return : "Jacob"</syntaxhighlight>


=={{header|Visual Basic .NET}}==
=={{header|Visual Basic .NET}}==
Line 7,661: Line 8,481:
===if-then-else===
===if-then-else===
''Basic''
''Basic''
<lang vbnet>Dim result As String, a As String = "pants", b As String = "glasses"
<syntaxhighlight lang="vbnet">Dim result As String, a As String = "pants", b As String = "glasses"


If a = b Then
If a = b Then
Line 7,667: Line 8,487:
Else
Else
result = "failed"
result = "failed"
End If</lang>
End If</syntaxhighlight>


''Condensed''
''Condensed''
<lang vbnet>Dim result As String, a As String = "pants", b As String = "glasses"
<syntaxhighlight lang="vbnet">Dim result As String, a As String = "pants", b As String = "glasses"


If a = b Then result = "passed" Else result = "failed"
If a = b Then result = "passed" Else result = "failed"
Line 7,682: Line 8,502:
Else
Else
result = "failed"
result = "failed"
End If</lang>
End If</syntaxhighlight>


===if-then-elseif===
===if-then-elseif===
<lang vbnet>Dim result As String, a As String = "pants", b As String = "glasses"
<syntaxhighlight lang="vbnet">Dim result As String, a As String = "pants", b As String = "glasses"


If a = b Then
If a = b Then
Line 7,693: Line 8,513:
Else
Else
result = "impossible"
result = "impossible"
End If</lang>
End If</syntaxhighlight>


===select-case-else===
===select-case-else===
<lang vbnet>Dim result As String, a As String = "pants", b As String = "glasses"
<syntaxhighlight lang="vbnet">Dim result As String, a As String = "pants", b As String = "glasses"


Select Case a
Select Case a
Line 7,704: Line 8,524:
Case Else
Case Else
result = "impossible"
result = "impossible"
End Select</lang>
End Select</syntaxhighlight>


===inline-conditional===
===inline-conditional===
<lang vbnet>Imports Microsoft.VisualBasic
<syntaxhighlight lang="vbnet">Imports Microsoft.VisualBasic


...
...
Line 7,713: Line 8,533:
Dim result As String = CType(IIf("pants" = "glasses", "passed", "failed"), String) 'VB 1-8
Dim result As String = CType(IIf("pants" = "glasses", "passed", "failed"), String) 'VB 1-8


Dim result As String = If("pants" = "glasses", "passed", "failed") 'VB 9</lang>
Dim result As String = If("pants" = "glasses", "passed", "failed") 'VB 9</syntaxhighlight>


===generic-inline-conditional===
===generic-inline-conditional===
{{works with|Visual Basic .NET|8.0}}
{{works with|Visual Basic .NET|8.0}}
<lang vbnet>Imports Microsoft.VisualBasic
<syntaxhighlight lang="vbnet">Imports Microsoft.VisualBasic


...
...
Line 7,727: Line 8,547:
...
...


Dim result As String = IIf2("pants" = "glasses", "passed", "failed") ' type is inferred</lang>
Dim result As String = IIf2("pants" = "glasses", "passed", "failed") ' type is inferred</syntaxhighlight>


===generic-inline-conditional===
===generic-inline-conditional===
'''Language Version:''' 9.0+
'''Language Version:''' 9.0+


<lang vbnet>Dim result As String = If("pants" = "glasses", "passed", "failed") ' type is inferred</lang>
<syntaxhighlight lang="vbnet">Dim result As String = If("pants" = "glasses", "passed", "failed") ' type is inferred</syntaxhighlight>

=={{header|V (Vlang)}}==
If and match are the general purpose conditional structures in V (Vlang), although the language certainly contains other conditional elements.
===If===
Simplest usage is,
<syntaxhighlight lang="v (vlang)">if boolean_expression {
statements
}</syntaxhighlight>
The braces are required, even around a single statement.
<syntaxhighlight lang="v (vlang)">if boolean_expression {
statements
} else {
other
statements
}</syntaxhighlight>
Braces are required around else clauses, as above, unless the statement of the else clause is another if statement. In this case the statements are chained like this,
<syntaxhighlight lang="v (vlang)">if boolean_expression1 {
statements
} else if boolean_expression2 {
otherStatements
}
</syntaxhighlight>

===Match===
Simple usage is,
<syntaxhighlight lang="v (vlang)">match true {
boolean_expression1 {
statements
}
boolean_expression2 {
other
statements
}
else {
last
resort
statements
}
}</syntaxhighlight>
Because match can work with any number of arbitrary boolean expressions, it replaces if/elseif chains often found in other programming languages.

Match can also switch on the value of an expression, as in,
<syntaxhighlight lang="v (vlang)">switch expression_of_any_type {
value1 {
statements
}
value2, value3, value4 {
other
statements
}
else {}
}</syntaxhighlight>
As shown, multiple values can be listed for a single case clause.
Since vlang is statically typed, the types of value1, 2, 3, and 4 must match the type of the expression.


=={{header|Vorpal}}==
=={{header|Vorpal}}==


===if-then-else===
===if-then-else===
<lang vorpal>if(condition){
<syntaxhighlight lang="vorpal">if(condition){
result = 'met'
result = 'met'
}
}
else{
else{
result = 'not met'
result = 'not met'
}</lang>
}</syntaxhighlight>


=={{header|Woma}}==
=={{header|Woma}}==
Line 7,749: Line 8,623:
===break-if===
===break-if===
Valid inside of a <@> (loop) block.
Valid inside of a <@> (loop) block.
<lang woma><%>condition</lang>
<syntaxhighlight lang="woma"><%>condition</syntaxhighlight>


===continue-if===
===continue-if===
Valid inside of a <@> (loop) block.
Valid inside of a <@> (loop) block.
<lang woma><$>condition</lang>
<syntaxhighlight lang="woma"><$>condition</syntaxhighlight>


===if statement===
===if statement===
Valid inside of a function or a <@> (loop) block.
Valid inside of a function or a <@> (loop) block.
<lang woma>condition = True
<syntaxhighlight lang="woma">condition = True
condition<?>print(condition)</lang>
condition<?>print(condition)</syntaxhighlight>


=={{header|Wrapl}}==
=={{header|Wrapl}}==
Line 7,764: Line 8,638:
===simple conditional===
===simple conditional===
Conditionals in Wrapl are expressions. Either success or failure can be omitted from the expression.
Conditionals in Wrapl are expressions. Either success or failure can be omitted from the expression.
<lang wrapl>condition => success // failure
<syntaxhighlight lang="wrapl">condition => success // failure
condition => success
condition => success
condition // failure</lang>
condition // failure</syntaxhighlight>


===goal directed evaluation===
===goal directed evaluation===
Wrapl's goal directed evaluation can be used to control conditional execution.
Wrapl's goal directed evaluation can be used to control conditional execution.
The select-right operator <tt>&</tt> produces the values of the right operand for each value produced by the left operand. Thus if the left operand fails to produce any values, the right operand is never evaluated.
The select-right operator <tt>&</tt> produces the values of the right operand for each value produced by the left operand. Thus if the left operand fails to produce any values, the right operand is never evaluated.
<lang wrapl>condition & success</lang>
<syntaxhighlight lang="wrapl">condition & success</syntaxhighlight>
The sequence operator <tt>|</tt> produces the values of the left operand followed by the values of the right operand. Thus if the left operand produces enough values (for example in a context where only one value is required), the right operand is never evaluated.
The sequence operator <tt>|</tt> produces the values of the left operand followed by the values of the right operand. Thus if the left operand produces enough values (for example in a context where only one value is required), the right operand is never evaluated.
<lang wrapl>condition | failure</lang>
<syntaxhighlight lang="wrapl">condition | failure</syntaxhighlight>


=={{header|Wren}}==
=={{header|Wren}}==
The ''if/else'' statement and the ''ternary operator (?:)'' are Wren's basic conditional structures though it can be argued that the ''&&'' and ''||'' operators, which do short-circuit evaluation, should be included under this heading as well.
The ''if/else'' statement and the ''ternary operator (?:)'' are Wren's basic conditional structures though it can be argued that the ''&&'' and ''||'' operators, which do short-circuit evaluation, should be included under this heading as well.
<lang ecmascript>for (b in [true, false]) {
<syntaxhighlight lang="wren">for (b in [true, false]) {
if (b) {
if (b) {
System.print(true)
System.print(true)
Line 7,794: Line 8,668:


System.print()
System.print()
}</lang>
}</syntaxhighlight>


{{out}}
{{out}}
Line 7,813: Line 8,687:
===ifs/elseifs/elses===
===ifs/elseifs/elses===
Assembly doesn't work on if/else if/else statements(Unless you're using MASM or alike assemblers:)). Rather, it has conditional jumps which work off flags set by the comparison. Take this general statement from C.
Assembly doesn't work on if/else if/else statements(Unless you're using MASM or alike assemblers:)). Rather, it has conditional jumps which work off flags set by the comparison. Take this general statement from C.
<syntaxhighlight lang="c">
<lang c>
if(i>1)
if(i>1)
DoSomething
DoSomething


FailedSoContinueCodeExecution.
FailedSoContinueCodeExecution.
</syntaxhighlight>
</lang>
There are actually a number of ways to implement that in assembly. The most typical way would be something like..
There are actually a number of ways to implement that in assembly. The most typical way would be something like..
<lang asm>
<syntaxhighlight lang="asm">
cmp i, 1
cmp i, 1
jg _DoSomething
jg _DoSomething
FailedSoContinueCodeExecution
FailedSoContinueCodeExecution
</syntaxhighlight>
</lang>
Using the "jg" instruction,our code will jump to _DoSomething if the comparison(cmp i,1) made our ZF(ZeroFlag) flag well, zero. Which means only 1 thing. It is in fact greater than. In contrast, if i is in fact equal or less than 1, ZF is set to 1. The Zero Flag will remain set as long as we don't use any instructions that alter flags(comparisons for example). So, here's another C example
Using the "jg" instruction,our code will jump to _DoSomething if the comparison(cmp i,1) made our ZF(ZeroFlag) flag well, zero. Which means only 1 thing. It is in fact greater than. In contrast, if i is in fact equal or less than 1, ZF is set to 1. The Zero Flag will remain set as long as we don't use any instructions that alter flags(comparisons for example). So, here's another C example
<syntaxhighlight lang="c">
<lang c>
if(i>1)
if(i>1)
DoSomething
DoSomething
Line 7,832: Line 8,706:
DoSomethingElse
DoSomethingElse
FailedSoContinueCodeExecution
FailedSoContinueCodeExecution
</syntaxhighlight>
</lang>
In this case, we can use our previous example as a skeleton.
In this case, we can use our previous example as a skeleton.
<lang asm>
<syntaxhighlight lang="asm">
cmp i, 1
cmp i, 1
jg _DoSomething
jg _DoSomething
jle _DoSomethingElse
jle _DoSomethingElse
FailedSoContinueCodeExecution
FailedSoContinueCodeExecution
</syntaxhighlight>
</lang>
This does another state check on the Zero flag(actually jg/jle also check another flag, but that's not overly important) using jle. JumpifLessthanorEqual. Essentially, jle jumps if ZG is set to 1. So, it's jump condition is the opposite to jg.<br>
This does another state check on the Zero flag(actually jg/jle also check another flag, but that's not overly important) using jle. JumpifLessthanorEqual. Essentially, jle jumps if ZG is set to 1. So, it's jump condition is the opposite to jg.<br>
<br>
<br>
One last commonly used condition.
One last commonly used condition.
<syntaxhighlight lang="c">
<lang c>
if(i==1)
if(i==1)
DoSomething
DoSomething
Line 7,849: Line 8,723:
DoSomethingElse
DoSomethingElse
FailedSoContinueExecution
FailedSoContinueExecution
</syntaxhighlight>
</lang>


In this case, we'd do this.
In this case, we'd do this.
<lang asm>
<syntaxhighlight lang="asm">
cmp i, 1
cmp i, 1
je _DoSomething
je _DoSomething
jne _DoSomethingElse
jne _DoSomethingElse
FailedSoContinueExecution
FailedSoContinueExecution
</syntaxhighlight>
</lang>
The je/jne jump instructions are again like jg/jle opposites of each other and again like je/jne rely on how the zero flag is set in the previous comparison. <br>
The je/jne jump instructions are again like jg/jle opposites of each other and again like je/jne rely on how the zero flag is set in the previous comparison. <br>
There are many different conditional jumps in assembly and many ways to set them, test, and, or to name a few. The ones covered are just some commonly used ones in order to show how assembly deals with conditional statements.
There are many different conditional jumps in assembly and many ways to set them, test, and, or to name a few. The ones covered are just some commonly used ones in order to show how assembly deals with conditional statements.
Line 7,864: Line 8,738:
===If===
===If===
An <code>IF</code> expression has the form <code>(IF <condition> <then-clause> <opt-else-clause>)</code>, for example:
An <code>IF</code> expression has the form <code>(IF <condition> <then-clause> <opt-else-clause>)</code>, for example:
<lang lisp>(if (eq s "Rosetta Code")
<syntaxhighlight lang="lisp">(if (eq s "Rosetta Code")
"The well-known programming chrestomathy site"
"The well-known programming chrestomathy site"
"Some other website, maybe, I dunno" )</lang>
"Some other website, maybe, I dunno" )</syntaxhighlight>
If the condition evaluates to anything except <code>NIL</code> or the empty list (which are equivalent), it is counted as true and the whole expression evaluates to the value of the <i>then</i> clause; otherwise it evaluates to the value of the optional <i>else</i> clause, if one is provided, or else to the empty list.
If the condition evaluates to anything except <code>NIL</code> or the empty list (which are equivalent), it is counted as true and the whole expression evaluates to the value of the <i>then</i> clause; otherwise it evaluates to the value of the optional <i>else</i> clause, if one is provided, or else to the empty list.


===Case===
===Case===
<code>CASE</code> expressions resemble the multi-way branching constructs found in most programming languages: an expression is evaluated, and the value of the whole expression is provided by the first clause that evaluates to a true value. Optionally, an <code>ELSE</code> expression can be provided, in case none of the clauses fits.
<code>CASE</code> expressions resemble the multi-way branching constructs found in most programming languages: an expression is evaluated, and the value of the whole expression is provided by the first clause that evaluates to a true value. Optionally, an <code>ELSE</code> expression can be provided, in case none of the clauses fits.
<lang lisp>(case s
<syntaxhighlight lang="lisp">(case s
("Rosetta Code" "Ah yes, the chrestomathy site")
("Rosetta Code" "Ah yes, the chrestomathy site")
("Stack Overflow" "Oh dear me, having problems are you?")
("Stack Overflow" "Oh dear me, having problems are you?")
("Github" "Say no more")
("Github" "Say no more")
(else "Sorry, never heard of it") )</lang>
(else "Sorry, never heard of it") )</syntaxhighlight>


===Cond===
===Cond===
<code>COND</code> is a more general conditional than <code>IF</code> or <code>CASE</code>: it resembles a <code>CASE</code> statement, but with the option of using a different conditional expression in each clause. A default value can be provided using <code>ELSE</code>, as with <code>CASE</code>, or any expression that is guaranteed to return a value other than <code>NIL</code> or the empty list.
<code>COND</code> is a more general conditional than <code>IF</code> or <code>CASE</code>: it resembles a <code>CASE</code> statement, but with the option of using a different conditional expression in each clause. A default value can be provided using <code>ELSE</code>, as with <code>CASE</code>, or any expression that is guaranteed to return a value other than <code>NIL</code> or the empty list.
<lang lisp>(cond
<syntaxhighlight lang="lisp">(cond
((eq s "Rosetta Code") "Chrestomathy site")
((eq s "Rosetta Code") "Chrestomathy site")
((> n 37) "Some other appropriate value, presumably")
((> n 37) "Some other appropriate value, presumably")
(t "If you're seeing me, s wasn't equal to Rosetta Code and n must have been 37 or below") )</lang>
(t "If you're seeing me, s wasn't equal to Rosetta Code and n must have been 37 or below") )</syntaxhighlight>


=={{header|XPL0}}==
=={{header|XPL0}}==
Line 7,903: Line 8,777:
=={{header|XSLT}}==
=={{header|XSLT}}==
The <xsl:if> element allows simple conditional processing.
The <xsl:if> element allows simple conditional processing.
<lang xml><xsl:if test="condition">
<syntaxhighlight lang="xml"><xsl:if test="condition">
<!-- executed if XPath expression evaluates to true -->
<!-- executed if XPath expression evaluates to true -->
</xsl:if></lang>
</xsl:if></syntaxhighlight>
The <xsl:choose>, <xsl:when>, and <xsl:otherwise> elements allow more general conditional processing.
The <xsl:choose>, <xsl:when>, and <xsl:otherwise> elements allow more general conditional processing.
<lang xml><xsl:choose>
<syntaxhighlight lang="xml"><xsl:choose>
<xsl:when test="condition1">
<xsl:when test="condition1">
<!-- included if condition1 evaluates to true (like C `if`) -->
<!-- included if condition1 evaluates to true (like C `if`) -->
Line 7,923: Line 8,797:
<!-- (The `otherwise` element is optional) -->
<!-- (The `otherwise` element is optional) -->
</xsl:otherwise>
</xsl:otherwise>
</xsl:choose></lang>
</xsl:choose></syntaxhighlight>


The XPath expressions in the <code>test</code> attribute are evaluated in boolean context (converted as if by [http://www.w3.org/TR/xpath/#function-boolean the boolean function] if necessary).
The XPath expressions in the <code>test</code> attribute are evaluated in boolean context (converted as if by [http://www.w3.org/TR/xpath/#function-boolean the boolean function] if necessary).


<lang xml><xsl:if test="@attrib = 'foo'">...</xsl:if>
<syntaxhighlight lang="xml"><xsl:if test="@attrib = 'foo'">...</xsl:if>
<xsl:if test="position() != last()">...</xsl:if>
<xsl:if test="position() != last()">...</xsl:if>
<xsl:if test="not(false())">...</xsl:if>
<xsl:if test="not(false())">...</xsl:if>
Line 7,937: Line 8,811:
implicitly converted to boolean. -->
implicitly converted to boolean. -->
<xsl:if test="boolean($expr)">...</xsl:if>
<xsl:if test="boolean($expr)">...</xsl:if>
<xsl:if test="$expr">...</xsl:if></lang>
<xsl:if test="$expr">...</xsl:if></syntaxhighlight>




=={{header|Yabasic}}==
=={{header|Yabasic}}==
<syntaxhighlight lang="yabasic">
<lang Yabasic>
// if-then-endif, switch / end switch
// if-then-endif, switch / end switch
// on gosub, on goto
// on gosub, on goto
Line 8,007: Line 8,881:
sentencia(s)
sentencia(s)
end while
end while
</syntaxhighlight>
</lang>




Line 8,018: Line 8,892:
We'll look at this example in C and in Z80 Assembly:
We'll look at this example in C and in Z80 Assembly:


<syntaxhighlight lang="c">
<lang C>
char x;
char x;
if (x == 20)
if (x == 20)
Line 8,027: Line 8,901:
{
{
doThat();
doThat();
}</lang>
}</syntaxhighlight>


<lang z80>cp 20
<syntaxhighlight lang="z80">cp 20
jr nz,Else
jr nz,Else
call doThis
call doThis
Line 8,036: Line 8,910:
Else:
Else:
call doThat
call doThat
done</lang>
done</syntaxhighlight>


While the Z80 does support conditional calls and returns, in this example they weren't a good choice, since there's no guarantee that the function <code>doThis</code> won't alter the flags, and you can't back up/restore the flags on the stack without backing up/restoring the accumulator at the same time, which isn't always what you want.
While the Z80 does support conditional calls and returns, in this example they weren't a good choice, since there's no guarantee that the function <code>doThis</code> won't alter the flags, and you can't back up/restore the flags on the stack without backing up/restoring the accumulator at the same time, which isn't always what you want.
Line 8,043: Line 8,917:


C code:
C code:
<lang C>if (x == 20)
<syntaxhighlight lang="c">if (x == 20)
{
{
DoSomething();
DoSomething();
}
}
// rest of program</lang>
// rest of program</syntaxhighlight>


Z80 Assembly code:
Z80 Assembly code:
<lang z80>
<syntaxhighlight lang="z80">
cp 20
cp 20
call z,DoSomething
call z,DoSomething
;rest of program</lang>
;rest of program</syntaxhighlight>


If the accumulator didn't equal 20, no <code>CALL</code> will actually take place.
If the accumulator didn't equal 20, no <code>CALL</code> will actually take place.
Line 8,059: Line 8,933:
===Switch===
===Switch===
Switch cases can be implemented in a few ways. The simplest way is by checking each value individually.
Switch cases can be implemented in a few ways. The simplest way is by checking each value individually.
<lang Z80>ld a,(HL) ;switch (HL)
<syntaxhighlight lang="z80">ld a,(HL) ;switch (HL)
cp 1 ;case (1)
cp 1 ;case (1)
jr nz,+ ;branch to next colon (note: not all assemblers support this syntax)
jr nz,+ ;branch to next colon (note: not all assemblers support this syntax)
Line 8,072: Line 8,946:
call HL_EQUALS_50
call HL_EQUALS_50
:
:
;rest of program</lang>
;rest of program</syntaxhighlight>


The above example continues to check the other cases even after a match is found. If you don't want that to happen, do this:
The above example continues to check the other cases even after a match is found. If you don't want that to happen, do this:
<lang z80>ld a,(HL) ;switch (HL)
<syntaxhighlight lang="z80">ld a,(HL) ;switch (HL)
cp 1 ;case (1)
cp 1 ;case (1)
jr nz,+ ;branch to next lone colon
jr nz,+ ;branch to next lone colon
Line 8,091: Line 8,965:
:
:
done:
done:
;rest of program</lang>
;rest of program</syntaxhighlight>


Another way to implement switch cases is with a lookup table of functions. This uses a command called <code>JP (HL)</code>. Despite the parentheses around <code>(HL)</code>, no dereferencing takes place - the program counter is simply set to the value in <code>HL</code>. This method is a little more complicated but allows you to create an indexed array of functions and choose one to execute. This method doesn't allow for fallthrough. You have to create a dispatcher that you can CALL, and pre-load the accumulator with the desired index and HL with the pointer to the 0th function in the table. Wherever you go needs to end in a <code>RET</code> instruction, so that you'll end up just after you <code>CALL</code>ed the dispatcher.
Another way to implement switch cases is with a lookup table of functions. This uses a command called <code>JP (HL)</code>. Despite the parentheses around <code>(HL)</code>, no dereferencing takes place - the program counter is simply set to the value in <code>HL</code>. This method is a little more complicated but allows you to create an indexed array of functions and choose one to execute. This method doesn't allow for fallthrough. You have to create a dispatcher that you can CALL, and pre-load the accumulator with the desired index and HL with the pointer to the 0th function in the table. Wherever you go needs to end in a <code>RET</code> instruction, so that you'll end up just after you <code>CALL</code>ed the dispatcher.


<lang z80>Dispatch: ;remember, you need to CALL this address for it to work properly. Otherwise your program will most likely crash.
<syntaxhighlight lang="z80">Dispatch: ;remember, you need to CALL this address for it to work properly. Otherwise your program will most likely crash.
add a ;this is a table of 16-bit values, so multiply the index by 2.
add a ;this is a table of 16-bit values, so multiply the index by 2.
ld a,(hl) ;get the low byte of the function addr. you wish to call
ld a,(hl) ;get the low byte of the function addr. you wish to call
Line 8,104: Line 8,978:
pop af
pop af
ld L,a ;store the low byte in L
ld L,a ;store the low byte in L
jp (HL) ;now you've jumped to the desired function. Its RET will return execution to the instruction just after "CALL Dispatch"</lang>
jp (HL) ;now you've jumped to the desired function. Its RET will return execution to the instruction just after "CALL Dispatch"</syntaxhighlight>


The disadvantage to this method is that it relies on the case values being consecutive. If they're not, you're better off using the other method, but you can still implement this if you pad the lookup table with pointers to a <code>RET</code>, which will make you return immediately back to after the dispatch call, without having done anything.
The disadvantage to this method is that it relies on the case values being consecutive. If they're not, you're better off using the other method, but you can still implement this if you pad the lookup table with pointers to a <code>RET</code>, which will make you return immediately back to after the dispatch call, without having done anything.


=={{header|zkl}}==
=={{header|zkl}}==
<lang zkl>if (x) y else z;
<syntaxhighlight lang="zkl">if (x) y else z;
if(a)b else if (c) else d; etc
if(a)b else if (c) else d; etc
x:=(if (a) b else c);
x:=(if (a) b else c);
Line 8,121: Line 8,995:
case(b){...}
case(b){...}
else {...} // case a C's default, has to be at the end
else {...} // case a C's default, has to be at the end
}</lang>
}</syntaxhighlight>

=={{header|Zig}}==
<syntaxhighlight lang="zig">const std = @import("std");
const builtin = @import("builtin");

fn printOpenSource(comptime is_open_source: bool) !void {
if (is_open_source) {
try std.io.getStdOut().writer().writeAll("Open source.\n");
} else {
try std.io.getStdOut().writer().writeAll("No open source.\n");
}
}
fn printYesOpenSource() !void {
try std.io.getStdOut().writer().writeAll("Open source.\n");
}
fn printNoOpenSource() !void {
try std.io.getStdOut().writer().writeAll("No open source.\n");
}
const fnProto = switch (builtin.zig_backend) {
.stage1 => fn () anyerror!void,
else => *const fn () anyerror!void,
};
const Vtable = struct {
fnptrs: [2]fnProto,
};

// dynamic dispatch: logic(this function) + vtable + data
fn printBySelectedType(data: bool, vtable: Vtable) !void {
if (data) {
try @call(.{}, vtable.fnptrs[0], .{});
} else {
try @call(.{}, vtable.fnptrs[1], .{});
}
}

pub fn main() !void {
// if-else
if (true) {
std.debug.assert(true);
} else {
std.debug.assert(false);
}
// comptime switch
const open_source = comptime switch (builtin.os.tag) {
.freestanding => true,
.linux => true,
.macos => false,
.windows => false,
else => unreachable,
};
// conditional compilation
std.debug.assert(builtin.zig_backend != .stage2_llvm);
// static dispatch (more complex examples work typically via comptime enums)
try printOpenSource(open_source);
// dynamic dispatch (runtime attach function pointer)
var vtable = Vtable{
.fnptrs = undefined,
};
// runtime-attach function pointers (dynamic dispatch)
vtable.fnptrs[0] = printYesOpenSource;
vtable.fnptrs[1] = printNoOpenSource;
try printBySelectedType(open_source, vtable);

// TODO Arithmetic if once https://github.com/ziglang/zig/issues/8220 is finished
}</syntaxhighlight>


{{omit from|GUISS}}
{{omit from|GUISS}}

Latest revision as of 21:42, 19 April 2024

Task
Conditional structures
You are encouraged to solve this task according to the task description, using any language you may know.
Control Structures

These are examples of control structures. You may also be interested in:

Task

List the conditional structures offered by a programming language. See Wikipedia: conditionals for descriptions.

Common conditional structures include if-then-else and switch.

Less common are arithmetic if, ternary operator and Hash-based conditionals.

Arithmetic if allows tight control over computed gotos, which optimizers have a hard time to figure out.


11l

if-else

I x == 0
   foo()
E I x == 1
   bar()
E
   baz()

switch

S x
   0
      foo()
   1
      bar()
   E
      baz()

360 Assembly

Here are the branch mnemonic opcodes:

* Unconditional Branch or No Branch:
        B      label       Unconditional
        BR     Rx          "
        NOP    label       No Operation
        NOPR   Rx          "
* After Compare Instructions
        BH     label       Branch on High
        BHR    Rx          "
        BL     label       Branch on Low
        BLR    Rx          "
        BE     label       Branch on Equal
        BER    Rx          "
        BNH    label       Branch on Not High
        BNHR   Rx          "
        BNL    label       Branch on Not Low
        BNLR   Rx          "
        BNE    label       Branch on Not Equal
        BNER   Rx          "
* After Arithmetic Instructions:
        BP     label       Branch on Plus
        BPR    Rx          "
        BM     label       Branch on Minus
        BMR    Rx          "
        BZ     label       Branch on Zero
        BZR    Rx          "
        BO     label       Branch on Overflow
        BOR    Rx          "
        BNP    label       Branch on Not Plus
        BNPR   Rx          "
        BNM    label       Branch on Not Minus
        BNMR   Rx          "
        BNZ    label       Branch on Not Zero
        BNZR   Rx          "
        BNO    label       Branch on No Overflow
        BNOR   Rx          "
* After Test Under Mask Instructions:
        BO     label       Branch if Ones
        BOR    Rx          "
        BM     label       Branch if Mixed
        BMR    Rx          "
        BZ     label       Branch if Zero
        BZR    Rx          "
        BNO    label       Branch if Not Ones
        BNOR   Rx          "
        BNM    label       Branch if Not Mixed
        BNMR   Rx          "
        BNZ    label       Branch if Not Zero
        BNZR   Rx          "

The ASM (Assembler Structured Macros) toolkit brings structures to IBM assembler 360.

      expression:
         opcode,op1,rel,op2    
         opcode,op1,rel,op2,OR,opcode,op1,rel,op2  
         opcode,op1,rel,op2,AND,opcode,op1,rel,op2 
           opcode::=C,CH,CR,CLC,CLI,CLCL, LTR, CP,CE,CD,...
           rel::=EQ,NE,LT,LE,GT,GE,  (fortran style)
                 E,L,H,NE,NL,NH      (assembler style)
                 P (plus), M (minus) ,Z (zero) ,O (overflow)
           opcode::=CLM,TM
           rel::=O (ones),M (mixed) ,Z (zeros)
           
* IF 
         IF     expression [THEN]
           ...
         ELSEIF expression [THEN]
           ...
         ELSE
           ...
         ENDIF

         IF     C,R4,EQ,=F'10' THEN     if     r4=10 then
           MVI  PG,C'A'                   pg='A'
         ELSEIF C,R4,EQ,=F'11' THEN     elseif r4=11 then
           MVI  PG,C'B'                   pg='B'
         ELSEIF C,R4,EQ,=F'12' THEN     elseif r4=12 then
           MVI  PG,C'C'                   pg='C'
         ELSE                           else
           MV   PG,C'?'                   pg='?'
         ENDIF                          end if

* SELECT 
         SELECT expressionpart1
           WHEN expressionpart2a
             ...
           WHEN expressionpart2b
             ...
          OTHRWISE
             ...
         ENDSEL
		 
* example SELECT type 1 
         SELECT CLI,HEXAFLAG,EQ         select hexaflag=
           WHEN X'20'                     when x'20'
             MVI  PG,C'<'                   pg='<'
           WHEN X'21'                     when x'21'
             MVI  PG,C'!'                   pg='!'
           WHEN X'22'                     when x'21'
             MVI  PG,C'>'                   pg='>'
           OTHRWISE                       otherwise
             MVI  PG,C'?'                   pg='?'
         ENDSEL                         end select

* example SELECT type 2
         SELECT                         select
           WHEN C,DELTA,LT,0              when delta<0
             MVC  PG,=C'0 SOL'              pg='0 SOL'
           WHEN C,DELTA,EQ,0              when delta=0
             MVC  PG,=C'1 SOL''              pg='0 SOL'
           WHEN C,DELTA,GT,0              when delta>0
             MVC  PG,=C'2 SOL''              pg='0 SOL'
         ENDSEL                         end select

* CASE
         CASENTRY R4                    select case r4
           CASE 1                         case 1                      
             LA     R5,1                    r5=1
           CASE 3                         case 3     
             LA     R5,2                    r5=2
           CASE 5                         case 5     
             LA     R5,3                    r5=1
           CASE 7                         case 7     
             LA     R5,4                    r5=4
         ENDCASE                        end select

6502 Assembly

Branching

6502 Assembly has 8 conditional branch instructions; each instruction will test the appropriate flag and condition and jump between -128 and 127 bytes. To understand these conditional instructions, it is helpful to remember that the comparison instructions (CMP, CPX, CPY) set the flags as if a subtraction had occurred:

		LDA #10
		CMP #11

Following these instructions, the accumulator will still hold 10 but the flags are set as if you had instructed the processor to perform 10 - 11. The result is -1, so the sign flag will be set, the zero flag will be cleared, the overflow flag will be cleared, and the carry flag will be set.

		BNE 		;Branch on Not Equal - branch when the zero flag is set
		BEQ 		;Branch on EQual - branch when the zero flag is set.
				;The zero flag is set when the result of an operation is zero

		BMI 		;Branch on MInus
		BPL 		;Branch on PLus - branch when the sign flag is cleared/set.
				;The sign flag is set when the result of an instruction is a negative number
				;and cleared when the result is a positive number

		BVS 		;Branch on oVerflow Set
		BVC 		;Branch on oVerflow Cleared - branch when the overflow flag is cleared/set.
				;The overflow flag is set when the result of an addition/subtraction would
				;result in a number larger than 127 or smaller than -128

		BCS		;Branch on Carry Set
		BCC		;Branch on Carry Clear - branch when the carry flag is cleared/set.
				;The carry flag is set when an addition produced a carry and when
				;a subtraction produced a borrow and cleared if an addition/subtraction
				;does not produce a carry/borrow.  The carry flag also holds bits
				;after shifts and rotates.

In the following example, the branch will be taken if memory location Variable holds 200:

		LDA #200
		CMP Variable
		BEQ #3			;if equal, skip ahead 3 bytes...
		CLC			;if unequal, continue executing instructions
		ADC #1
		STA OtherVariable	;				...to here.

Because you don't have to perform a comparison to set the flags, you can perform very fast checks in iterative loops:

		LDX #100
Loop:		...do something
		DEX
		BNE Loop

This code will loop until X is zero. Most assemblers will figure out the correct offset for you if you use a label in place of the offset after a branch instruction, as in the above example.

Jump Table

A jump table is a list of subroutine addresses, which can be indexed like any other array. The 6502 has no indirect call command, but it can be created in software using an indexed jump table. One method of doing this is spoofing a return address and using the return from subroutine command to "return" to the desired subroutine.

ReturnTable:
dw foo-1            ;each is a label to a section of code that ends in an RTS
dw bar-1
dw baz-1

ReturnSpoof:        ;assume execution arrived here via a JSR command.
lda indexVariable   ;contains the desired index into ReturnTable. 0 = foo, 1 = bar, 2 = baz.
asl                 ;the data is word length so the index must be multiplied by 2.
tax              

lda ReturnTable+1,x ;get the high byte of the return address.
pha                 
lda ReturnTable,x   ;get the low byte
pha

; Now, the desired subroutine's address minus 1 is on top of the stack. 
; The RTS command will take this address and jump there. That routine's RTS command will act as the RTS from "ReturnSpoof", 
; bringing execution to the point just after ReturnSpoof was called.
; If done properly, return spoofing will not corrupt the stack.

RTS                 ;this "RTS" acts as a JMP to the address we just put on the stack.

68000 Assembly

Like 6502 Assembly, 68000 Assembly has several different condition states the CPU can use to branch. As is typical with assembly languages, branching code is less straightforward than on high-level languages. There is no "if" statement per se; the correct branch to use depends more so on the expression being evaluated.

In assembly, if a branch statement doesn't result in a branch taken, execution moves to whatever instruction is underneath the branch. If a branch is taken, execution jumps to the label specified by the branch instruction. A chart below will explain the different ways branches can occur. In addition to those, there are unconditional branches BRA and JMP which are the equivalent of GOTO in BASIC and C.

CMP

The most commonly used comparator is CMP. It can operate at byte, word, or long length. Anything outside of the "range" of its size parameter is ignored.

MOVE.L #$FFFFFF00,D0
CMP.B #0,D0   ;equals zero, so zero flag is set.
CMP.W #0,D0   ;doesn't equals zero, so zero flag is clear.

Other than its size parameter, CMP works very similar to 6502 Assembly. It returns both a test for equality and a size comparison (i.e. which number is greater than the other.) This chart from 68000 Tricks and Traps sums it up nicely. If you use CMP D0,D1 at any data size, this is what you get:

 Relationship    Signed     Unsigned
 -------------------------------------------------------
 D1 <  D0        BLT        BCS (branch on Carry Set)
 D1 <= D0        BLE        BLS
 D1 =  D0        BEQ        BEQ
 D1 <> D0        BNE        BNE
 D1 >  D0        BGT        BHI
 D1 >= D0        BGE        BCC (branch on Carry Clear)

Bit Testing

Individual bits can be tested with BTST, BSET, BCLR, and BCHG. The BTST command takes a bit as its left operand and the value being tested in the right (either a data register, address register with or without parentheses, or memory address).

BTST #7,D0  ;test bit 7 of D0, i.e. the leftmost bit in the rightmost byte.
BNE goHere  ;if that bit is 1, branch to "goHere"
BEQ goThere ;if that bit is 0, branch to "goThere"

BSET, BCLR, and BCHG are similar, in that they also allow you to branch based on the value of the bit being tested. However, they also alter the bit in the destination that was tested, AFTER the test. The new state of that bit is not reflected in the test results. Branching occurs as if you used BTST instead. BSET makes the bit in the destination 1, BCLRmakes it zero, and BCHG flips it.

In addition to bit testing, TST will set the processor flags as if the value in a register or memory was just loaded there, even if it had been there for a while. This does not change the value in any register or memory; it just updates the flags, so it is very handy for introspection into the CPU's internal memory without altering it in any way.

If/Then/Else

These concepts can be emulated in assembly but it's a bit tricky for beginners to understand. The branch condition isn't always what you would expect. Sometimes it is reversed depending on what is easier to check. This is a common way to have an IF condition==true THEN do something ELSE do nothing style of statement. The code checks if D0 == 3 and if it does, adds 7. If D0 != 3, execution just continues as normal.

CMP.L #3,D0   ;this works with any size operands, not just L.
BNE doNothing 
ADD.L #7,D0
doNothing:
;rest of program

Rather than branch to a different section of code if D0 == 3, the program branched if it DIDN'T equal 3, skipping the add 7.

Switch

Switch and cases are easy to implement with a return spoof. If the cases are not a consecutive numeric sequence like in the example below, you can use a lookup table to match the selector variable's values with an index into the table of case routine addresses.

There is no built-in way to "default" if none of the expected cases match. A bounds check will have to be programmed in manually. Most of the time when writing a return spoof the programmer already knows what the maximum possible cases will be.

SwitchCase:
DC.L foo,bar,baz,default ;case 0, case 1, case 2, case 3. (Case 0,1,2 are the "valid" cases.)
; D0 is the case selector variable (byte-sized)
doSwitchCase:       ;this is a subroutine that gets called elsewhere.
LEA SwitchCase,A0

;this is our bounds check
CMP.B #3,D0         ;is D0 > 3?         
BLS InBounds        ;if not, keep going
MOVE.B #3,D0        ;if it is, set it to 3.


InBounds:
LSL.W #2,D0         ;multiply by 4 to index into a table of longs
MOVE.L (A0,D0),A0   ;deref the pointer and store the desired routine in A0
MOVE.L A0,-(SP)     ;push it onto the stack
RTS                 ;"return" to the selected routine. If it ends in an RTS, 
                    ;  that RTS will return to just after "JSR doSwitchCase"


foo:
   ;your code for this case goes here.
   rts

bar:
   ;your code for this case goes here.
   rts

baz:
   ;your code for this case goes here.
   rts

default:
   rts

AArch64 Assembly

Works with: as version Raspberry Pi 3B version Buster 64 bits
/* ARM assembly AARCH64 Raspberry PI 3B */
/*  program condstr64.s   */

/*******************************************/
/* Constantes file                         */
/*******************************************/
/* for this file see task include a file in language AArch64 assembly*/
.include "../includeConstantesARM64.inc"
/*******************************************/
/* Initialized data                        */
/*******************************************/
.data
szMessTest1:   .asciz "The test 1 is equal.\n"
szMessTest1N:  .asciz "The test 1 is not equal.\n"
szMessTest1A:  .asciz "The test 1A is equal.\n"
szMessTest1AN: .asciz "The test 1A is not equal.\n"
szMessTest2:   .asciz "The test 2 is equal.\n"
szMessTest2N:  .asciz "The test 2 is not equal.\n"
szMessTest3:   .asciz "The test 3 is <.\n"
szMessTest3N:  .asciz "The test 3 is >.\n"
szMessTest4:   .asciz "The test 4 is <=.\n"
szMessTest4N:  .asciz "The test 4 is >.\n"
szMessTest5:   .asciz "The test 5 is negative.\n"
szMessTest5N:  .asciz "The test 5 is positive ou equal 0.\n"
szMessTest6:   .asciz "Test 6 : carry is off.\n"
szMessTest6N:  .asciz "Test 6 : carry is set.\n"
szMessTest7:   .asciz "Test 7 : no overflow.\n"
szMessTest7N:  .asciz "Test 7 : overflow.\n"
szMessTest8:   .asciz "Test 8 : then.\n"
szMessTest8N:  .asciz "Test 8 : else.\n"
szMessResult:  .asciz "Test result = @ \n" 
/*******************************************/
/* UnInitialized data                      */
/*******************************************/
.bss 
sZoneConv:               .skip 30
/*******************************************/
/*  code section                           */
/*******************************************/
.text
.global main 
main:                           // entry of program
 
                                // classic test equal zero, not equal zero 
  //mov x1,0                    // comments
    mov x1,1                    //  or uncomments
    cmp x1,0                    // structure if else
    bne 1f
    ldr x0,qAdrszMessTest1      // if equal
    b 2f
1:
    ldr x0,qAdrszMessTest1N     // else
2:
    bl affichageMess

    mov x1,0                    //  comments
    //mov x1,1                  //  or uncomments
    cbnz x1,3f                  // other test and branch if not zero
    ldr x0,qAdrszMessTest1A
    b 4f
3:
    ldr x0,qAdrszMessTest1AN
4:
    bl affichageMess
                                // test equal 5, not equal 5 
    //mov x1,#5
    mov x1,10
    cmp x1,5
    bne 5f
    ldr x0,qAdrszMessTest2
    b 6f
5:
    ldr x0,qAdrszMessTest2N
6:
    bl affichageMess
 
                                // test < 5,  > 5  SIGNED
    mov x1,#-10
    //mov x1,#10
    cmp x1,#5
    bgt 7f
    ldr x0,qAdrszMessTest3
    b 8f
7:
    ldr x0,qAdrszMessTest3N
8:
    bl affichageMess
 
                                // test < 5,  > 5  UNSIGNED
    //mov x1,#-10
    mov x1,#2
    cmp x1,#5
    bhi 9f
    ldr x0,qAdrszMessTest4
    b 10f
9:
    ldr x0,qAdrszMessTest4N
10:
    bl affichageMess
 
                               // test < 0,  > 0 
    mov x1,2
    subs x1,x1,5               // s --> flags
    bpl 11f
    ldr x0,qAdrszMessTest5
    b 12f
11:
    ldr x0,qAdrszMessTest5N
12:
    bl affichageMess
 
    // carry off carry on
    //mov x1,#-10             // for carry set
    //mov x1,#10              // for carry off
    mov x1,(2<<62) - 1        // for carry off
    adds x1,x1,20             // s --> flags
    bcs 13f
    ldr x0,qAdrszMessTest6    // carry clear
    b 14f
13:
    ldr x0,qAdrszMessTest6N   // carry set
14:
    bl affichageMess
 
                              // overflow off overflow on
    //mov x1,#-10             // for not overflow 
    //mov x1,#10              // for not overflow
    mov x1,(2<<62) - 1        // for overflow 
    adds x1,x1,20             // s --> flags
    bvs 15f
    ldr x0,qAdrszMessTest7    // overflow off
    b 16f
15:
    ldr x0,qAdrszMessTest7N   // overflow on
16:
    bl affichageMess
 
    // other conditionnel test csel
    mov x2,-20
    mov x3,25
    mov x1,10                   // for equal
    //mov x1,#20                // for else
    cmp x1,10   
    csel x0,x2,x3,eq            // if x1=10 x0 = x2 else x0 = x3
    ldr x1,qAdrsZoneConv
    bl conversion10S
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv
    bl strInsertAtCharInc       // insert result at @ character
    bl affichageMess

                                // other conditionnel test cset
    //mov x1,10                 // for equal
    mov x1,20                   // for else
    cmp x1,10   
    cset x0,eq                  // if x1=10 x0 = 1 else x0 = 0
    ldr x1,qAdrsZoneConv
    bl conversion10S
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv
    bl strInsertAtCharInc       // insert result at @ character
    bl affichageMess

                                // other conditionnel test cinc
    mov x0,3
    mov x1,10                   // for equal
    //mov x1,20                 // for else
    cmp x1,10   
    cinc x0,x0,eq               // if x1=10 x0 = x0+1 else x0 = x0
    ldr x1,qAdrsZoneConv
    bl conversion10S
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv
    bl strInsertAtCharInc      // insert result at @ character
    bl affichageMess

                               // other conditionnel test csinc
    mov x0,3
    mov x2,6
    mov x3,11
    mov x1,10                  // for equal
    //mov x1,20                // for else
    cmp x1,10   
    csinc x0,x2,x3,ne          // if x1<>10 x0 = x2  else x0 = x3 + 1
    ldr x1,qAdrsZoneConv
    bl conversion10S
    ldr x0,qAdrszMessResult
    ldr x1,qAdrsZoneConv
    bl strInsertAtCharInc      // insert result at @ character
    bl affichageMess
100:                           // standard end of the program
    mov x0,0                   // return code
    mov x8,EXIT                // request to exit program
    svc 0                      // perform the system call
qAdrszMessTest1:         .quad szMessTest1
qAdrszMessTest1N:        .quad szMessTest1N
qAdrszMessTest1A:        .quad szMessTest1A
qAdrszMessTest1AN:       .quad szMessTest1AN
qAdrszMessTest2:         .quad szMessTest2
qAdrszMessTest2N:        .quad szMessTest2N
qAdrszMessTest3:         .quad szMessTest3
qAdrszMessTest3N:        .quad szMessTest3N
qAdrszMessTest4:         .quad szMessTest4
qAdrszMessTest4N:        .quad szMessTest4N
qAdrszMessTest5:         .quad szMessTest5
qAdrszMessTest5N:        .quad szMessTest5N
qAdrszMessTest6:         .quad szMessTest6
qAdrszMessTest6N:        .quad szMessTest6N
qAdrszMessTest7:         .quad szMessTest7
qAdrszMessTest7N:        .quad szMessTest7N
qAdrszMessTest8:         .quad szMessTest8
qAdrszMessTest8N:        .quad szMessTest8N
qAdrszMessResult:        .quad szMessResult
qAdrsZoneConv:           .quad sZoneConv
/********************************************************/
/*        File Include fonctions                        */
/********************************************************/
/* for this file see task include a file in language AArch64 assembly */
.include "../includeARM64.inc"

Action!

PROC Main()
  INT i

  FOR i=-1 TO 1
  DO
    IF i<0 THEN
      PrintF("%I is less than zero%E",i)
    ELSEIF i>0 THEN
      PrintF("%I is greater than zero%E",i)
    ELSE
      PrintF("%I is zero%E",i)
    FI
  OD
RETURN
Output:

Screenshot from Atari 8-bit computer

-1 is less than zero
0 is zero
1 is greater than zero

ActionScript

See JavaScript

Ada

if-then-else

type Restricted is range 1..10;
My_Var : Restricted;

if My_Var = 5 then
  -- do something
elsif My_Var > 5 then
  -- do something
else
  -- do something
end if;

conditional expressions

Ada 2012 introduces conditional expressions, which are allowed anywhere an expression is allowed (e.g.: in a numeric literal, aggregate, etc.). A conditional expression can either be an if expression or case expression. Conditional expressions must be surrounded by parentheses.

if expression

type Operation is (Add, Subtract, Multiply, Divide);
Op : Operation;
Result : Integer;
-- we assume that A and B are inputs.
Result := (if Op = Add then
  A + B
elsif Op = Subtract then
  A - B
elsif Op = Multiply then
  A * B
elsif Op = Divide then
  A / B
);

case expressions

Using the same example above, we assume that the Operation, Op, and Result variables are declared. A case expression over the enumeration of operations might look like:

Result := (case Op is
  Add => A + B,
  Subtract => A - B,
  Multiply => A * B,
  Divide => A / B
);

Note: some websites (particularly this one) contain a different variant of a case expression (

case Op of...

). The Ada Reference Manual indicates this is incorrect, and we use the formal version here.

case with a default alternative

type Days is (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday);
Today : Days;

case Today is
  when Saturday | Sunday =>
     null;
  when Monday =>
     Compute_Starting_Balance;
  when Friday =>
     Compute_Ending_Balance;
  when others =>
     Accumulate_Sales;
end case;

case without a default

When there is no when others clause, the compiler will complain about any uncovered alternative. This defends against a common reason for bugs in other languages. I.e., the following code is incorrect:

case Today is
  when Monday =>
     Compute_Starting_Balance;
  when Friday =>
     Compute_Ending_Balance;
  when Tuesday .. Thursday =>
     Accumulate_Sales;
  -- ignore Saturday and Sunday
end case;

The correct version:

case Today is
  when Saturday | Sunday =>
     null; -- don't do anything, if Today is Saturday or Sunday
  when Monday =>
     Compute_Starting_Balance;
  when Friday =>
     Compute_Ending_Balance;
  when Tuesday .. Thursday =>
     Accumulate_Sales;
end case;

select

Select provides conditional acceptance of entry calls. Select can also be used to conditionally call an entry

Conditional Accept

select
   accept first_entry;
   -- do something
   or accept second_entry;
   -- do something
   or terminate;
end select;

Conditional entry call

A selective entry call provides a way to time-out an entry call. Without the time-out the calling task will suspend until the entry call is accepted.

select
  My_Task.Start;
or
  delay Timeout_Period;
end select;

The entry Start on the task My_Task will be called. If My_Task accepts the entry call before the timer expires the timer is canceled. If the timeout expires before the entry call is accepted the entry call is canceled.

Aikido

Conditional Expressions

var x = loggedin ? sessionid : -1

if..elif..else

if (value > 40) {
    println ("OK")
} elif (value < 20) {
    println ("FAILED")
} else {
    println ("RETRY")
}

switch

switch (arg) {
case "-d":
case "--debug":
    debug = true
    break
case "-f":
    force = true
    break
default:
    throw "Unknown option " + arg
}

switch (value) {
case > 40:
    println ("OK")
    break
case < 20:
    println ("FAILED")
    break
case in 50..59:
   println ("WIERD")
   // fall through
default:
    println ("RETRY")
}

Aime

If-elif-else

if (c1) {
  // first condition is true...
} elif (c2) {
  // second condition is true...
} elif (c3) {
  // third condition is true...
} else {
  // none was true...
}

ALGOL 60

Algol 60 has invented the famous if then else block structure. Algol 60 has conditional expressions of the form:

 expression::=  if conditional_expression then expression else expression 
   K:=if X=Y then I else J

Algol 60 has conditional statements of the form:

 statement::=  if conditional_expression then statement else statement 
   if X=Y then K:=I else K:=J
 statement::=  if conditional_expression then statement
   if X=Y then K:=I

An example:

    'IF' I=1 'THEN' OUTINTEGER(1,I);

    'IF' I<J 'THEN' OUTSTRING(1,'(' : I<J')')
             'ELSE' OUTSTRING(1,'(' : I>=J')');

    'IF' I>=J 'THEN' 'BEGIN'
        OUTSTRING(1,'(' I=')');
        OUTINTEGER(1,I)
    'END'
    'ELSE' 'BEGIN'
        OUTSTRING(1,'(' J=')');
        OUTINTEGER(1,J)
    'END'

Algol 60 has also a switch structure:

 declaration::=  switch switch:=list_of labels
   statement::=  goto switch[expression]

An example:

  'SWITCH' TARGET:=L1,L2,L3;
  ...
  'GOTO' TARGET(/J/);
  L1: OUTSTRING(1,'('AA')');
  L2: OUTSTRING(1,'('BB')');
  L3: OUTSTRING(1,'('CC')');

ALGOL 68

See Conditional Structures/ALGOL 68

ALGOL W

begin
    integer a, b, c;

    a := 1; b := 2; c := 3;

    % algol W has the traditional Algol if-the-else statement                %
    % there is no "elseif" contraction                                       %
    if a = b
    then write( "a = b" )
    else if a = c
         then write( "a = c" )
         else write( "a is ", a );

    % if-then-else can also be used in an expression                         %
    write( if a < 4 then "lt 4" else "ge 4" );

    % algol W also has a "case" statement, an integer expression is used to  %
    % select the statement to execute. If the expression evaluates to 1,    %
    % the first statement is executed, if 2, the second is executed etc.     %
    % If the expression is less than 1 or greater than the number of         %
    % statements, a run time error occurs                                    %
    case a + b of
    begin write( "a + b is one"   )
        ; write( "a + b is two"   )
        ; write( "a + b is three" )
        ; write( "a + b is four"  )
    end;

    % there is also an expression form of the case:                          %
    write( case c - a of ( "one", "two", "three", "four" ) )

end.
Output:
a is              1  
lt 4
a + b is three
two

Amazing Hopper

Las estructuras condicionales en Hopper son inexistentes. Pero se pueden definir estructuras de alto nivel, todas las que su imaginación le dicte... Bueno, todas las que Hopper le permita hacer con sus instrucciones. Existen instrucciones que permiten evaluar el contenido de la memoria, como "eq?", que evalúa si dos valores son iguales, o "zero?", que evalúa si el valor es cero. También cuenta con saltos condicionales que evalúan el contenido de la memoria, como "jle( etiqueta )", que saltará a etiqueta si el primer valor en memoria es menor o igual al segundo valor en memoria. Hasta ahora se han definido cuatro "sabores" para Hopper. Aquí repasaremos las estructuras condicionales del sabor "Jambo".

OBSERVACION: todas estas estructuras condicionales permiten anidamiento.

La más clásica:

   
   If ( expresion )
      ...
   Else If ( expresion )
      ...
   Else
      ...
   End If

La definición de las macros para "IF/ELSE" es la siguiente (jambo.h):

  #defn    ElseIf(__X__)        jmp(%%CODEIF), %ENDIF:, #OPTIMLOG, #ATOM#CMPLX ,#OPTIMLOG, jnt(#ENDIF),
  #defn    If(__X__)            ##CODEIF, #OPTIMLOG, #ATOM#CMPLX ,#OPTIMLOG, jnt(#ENDIF),
  #defn    Else                 jmp(%%CODEIF), %ENDIF:, true,jnt(#ENDIF),
  #defn    EndIf                %CODEIF:, %ENDIF:,

La macro "MOVE IF", mueve un valor desde la memoria hasta una variable, según si se cumple una expresión lógica. El valor es quitado de la memoria. En el ejemplo, moverá "15" a la variable "x":

   sw=1
   Add(10,5)
   Move if( sw, x, y)

La definición de la macro en "jambo.h" es la siguiente:

  #defn    Moveif(_X_,_Y_,_Z_)     #ATOM#CMPLX;jnt(#ENDIIF);mov(_Y_);jmp(#ENDIF);%ENDIIF:;mov(_Z_);%ENDIF:

La macro "COPY IF" es semejante a "MOVE IF", pero deja el valor en la memoria:

   sw=1
   Add(10,5)
   Copy if( sw, x, y)  --> x guarda "15"
   Prnl                --> imprime "15"

La macro "MOVE ON" mueve un valor desde la memoria hasta una variable, si se cumple una condición lógica; si no se cumple, el valor se retira de la memoria. Ejemplo:

   sw=0
   Add(10,5)
   Move on( sw, x)

La macro "COPY ON" es semejante a "MOVE ON", pero deja el valor en la memoria, haya o no haya sido guardado en la variable. Ejemplo:

   sw=0
   Add(10,5)
   Copy on( sw, x)
   Prnl

La macro "SET ON" deja un valor o resultado de una expresión en memoria, si se cumple la condición:

   Set '100, 10, 0.05, 1.5E-5'
   sw=1
   Set on( sw, Add(10,5) )
   Apnd Lst 'lista'

La macro "SET IF" deja en memoria el resultado de una expresión o un valor en memoria, dependiendo de una expresión lógica. En el ejemplo, dejará el resultado de la suma:

   sw=1
   Set if ( sw, Add(10,5), Sub( 10, Mul(i,2) ) )
   Move to 'res'

La macro "GET IF" obtiene un valor o resultado de una expresión, según una expresión lógica. Es idéntica a "SET IF", pero puede ser usada con la macro "LET":

   sw=1
   Let ' res := Get if ( sw, Add(10,5), Sub( 10, Mul(i,2) ) ) '

La macro "SWITCH" es una macro de selección múltiple, pero puede ser evaluada una expresión o valor de cualquier tipo:

   Switch ( expresion|valor )
      Case 'valor'     { ... [Exit] }  --> coincide con el valor
      Btwn 'v1, v2'    { ... [Exit] }  --> si está entre los valores "v1" y "v2"
      Exact occurs 's' { ... [Exit] }  --> si está contenido exactamente en el string "s"
      Occurs 's'       { ... [Exit] }  --> si está contenido en el string "s"
      On list 'l'      { ... [Exit] }  --> si está en el array-lista "l"
      Default          { ... [Exit] }  --> si nada tiene sentido.
   End switch

Se pueden usar otras macros como evaluadores "CASE", como son las siguientes:

   Case not negative   { ... [Exit] }
   Case not zero       { ... [Exit] }
   Case not positive   { ... [Exit] }
   Case not numeric    { ... [Exit] }
   Case not string     { ... [Exit] }
   Case not array      { ... [Exit] }
   Case not null       { ... [Exit] }
   Case negative       { ... [Exit] }
   Case zero           { ... [Exit] }
   Case positive       { ... [Exit] }
   Case numeric        { ... [Exit] }
   Case string         { ... [Exit] }
   Case array          { ... [Exit] }
   Case null           { ... [Exit] }

EL "ODIADO" GOTO (pero yo lo amo):

La estructura "ON GOTO" se usa para saltar a una etiqueta de acuerdo a lo que encuentre en la memoria. Evalúa valores desde 1 en adelante. NOTA: si el valor de la memoria no coindice con la evaluación de "ON GOTO", queda en la memoria.

  EQ3:
     instrucciones
     Goto 'Elección de saltos'

  ...
  Elección de saltos:
   Ceil(Rand '3'), On goto( EQ1, EQ2, EQ3 )
   Kill    --> retira el valor de la memoria, si no fue consumido por "ON GOTO"
   ...
  EQ1:
     instrucciones
     
  EQ2:
     instrucciones
     

La estructura "ON GOSUB" es idéntica a "ON GOTO", pero el control del programa retorna luego de ejecutado el bloque:

   Ceil(Rand '3'), On gosub( EQ1, EQ2, EQ3 )
   Kill    --> retira el valor de la memoria, si no fue consumido por "ON GOSUB"
   ...
  EQ1:
     instrucciones
     back
     
  EQ2:
     instrucciones
     back
     
  EQ3:
     instrucciones
     back   

La estructura "ON OPTION" realiza una acción según el valor encontrado en memoria, que debe iniciar desde 1 en adelante. Si el valor memorizado no es consumido por "ON OPTION", queda en memoria y puede ser eliminado o usado por el programa:

   x=10
   Set '3'
   On option (x+=0.5, x-=0.5, x*=0.5; l=x)   --> ejecuta "x*=0.5" y "l=x"
   Printnl ("Resultado X= ", x)

La estructura "LINK GOSUB" invoca subrutinas en secuencia. En el ejemplo, se memoriza "100", luego, se invoca a "proc1" que obtiene 200, luego invoca a "proc2" que obtiene "1000", y finalmente invoca a "proc3" que obtiene "500":

   Main
      Set(100), Link gosub(proc1, proc2, proc3)
      Prnl    --> imprime el valor "500".
   End

   Subrutines 

   Define( proc1, dato )
      Return ' Add(dato,100) '

   Define ( proc2, dato )
      Return ' Mul(dato,5) '

   Define( proc3, dato )
      var(dato) Div into(2)
   Return

AmbientTalk

If-then-else

In AmbientTalk, if:then:else: is a keyworded message (as in Smalltalk). The first argument should be a boolean expression. The second and third arguments should be blocks (aka anonymous functions or thunks).

if: condition then: {
  // condition is true...
} else: {
  // condition is false...
}

IfTrue/IfFalse

One can also send a message to the boolean objects true and false:

condition.ifTrue: { /* condition is true... */ } ifFalse: { /* condition is false... */ }

AmigaE

IF-THEN-ELSE

IF condition
  -> if condition is true...
ELSEIF condition2
  -> else if condition2 is true...
ELSE
  -> if all other conditions are not true...
ENDIF

or on one single line:

IF condition THEN statement

Ternary IF THEN ELSE

The IF-THEN-ELSE can be used like ternary operator (?: in C)

DEF c
c := IF condition THEN 78 ELSE 19

SELECT-CASE

SELECT var
  CASE n1
    -> code
  CASE n2
    -> code
  DEFAULT
    -> no one of the previous case...
ENDSELECT

Another version allows for ranges:

SELECT max_possible_value OF var
  CASE n1
    -> code
  CASE n2 TO n3, n4
    -> more
  CASE n5 TO n6, n7 TO n8
    -> more...
  DEFAULT
    -> none of previous ones
ENDSELECT

The biggest among n1, n2 and so on, must be not bigger than max_possible_value.

Apex

if-then-else

if (s == 'Hello World') {
    foo();
} else if (s == 'Bye World') {
    bar();
} else {
    deusEx();
}

Java also supports short-circuit evaluation. So in a conditional like this:

if(obj != null && obj.foo()){
   aMethod();
}

obj.foo() will not be executed if obj != null returns false. It is possible to have conditionals without short circuit evaluation using the & and | operators (from Bitwise operations). So in this conditional:

if(obj != null & obj.foo()){
   aMethod();
}

You will get a null pointer exception if obj is null.

ternary

s == 'Hello World' ? foo() : bar();

switch

Apex does not support switch / case statements.

AppleScript

if-then-else

if myVar is "ok" then return true

set i to 0
if i is 0 then
       return "zero"
else if i mod 2 is 0 then
       return "even"
else
       return "odd"
end if

ARM Assembly

Works with: as version Raspberry Pi
/* ARM assembly Raspberry PI  */
/*  program condstr.s   */

/* Constantes    */
.equ STDOUT, 1     @ Linux output console
.equ EXIT,   1     @ Linux syscall
.equ WRITE,  4     @ Linux syscall
/* Initialized data */
.data
szMessTest1: .asciz "The test 1 is equal.\n"
szMessTest1N: .asciz "The test 1 is not equal.\n"
szMessTest2: .asciz "The test 2 is equal.\n"
szMessTest2N: .asciz "The test 2 is not equal.\n"
szMessTest3: .asciz "The test 3 is <.\n"
szMessTest3N: .asciz "The test 3 is >.\n"
szMessTest4: .asciz "The test 4 is <=.\n"
szMessTest4N: .asciz "The test 4 is >.\n"
szMessTest5: .asciz "The test 5 is negative.\n"
szMessTest5N: .asciz "The test 5 is positive ou equal 0.\n"
szMessTest6: .asciz "Test 6 : carry is off.\n"
szMessTest6N: .asciz "Test 6 : carry is set.\n"
szMessTest7: .asciz "Test 7 : no overflow.\n"
szMessTest7N: .asciz "Test 7 : overflow.\n"
szMessTest8: .asciz "Test 8 : then.\n"
szMessTest8N: .asciz "Test 8 : else.\n"

/* UnInitialized data */
.bss 

/*  code section */
.text
.global main 
main:                /* entry of program  */
    push {fp,lr}    /* saves 2 registers */

    @ test equal zero, not equal zero 
    @movs r1,#0      @ comments
    movs r1,#1          @  @ s --> flags   and uncomments
    ldreq r0,iAdrszMessTest1
    ldrne r0,iAdrszMessTest1N
    bl affichageMess
	
    @ test equal 5, not equal 5 
    @mov r1,#5
    mov r1,#10
    cmp r1,#5
    ldreq r0,iAdrszMessTest2
    ldrne r0,iAdrszMessTest2N
    bl affichageMess
	
    @ test < 5,  > 5  SIGNED
    mov r1,#-10
    @mov r1,#10
    cmp r1,#5
    ldrlt r0,iAdrszMessTest3
    ldrgt r0,iAdrszMessTest3N
    bl affichageMess
	
    @ test < 5,  > 5  UNSIGNED
    @mov r1,#-10
    mov r1,#2
    cmp r1,#5
    ldrls r0,iAdrszMessTest4
    ldrhi r0,iAdrszMessTest4N
    bl affichageMess
	
    @ test < 0,  > 0 
    @movs r1,#-10
    movs r1,#2     @ s --> flags
    ldrmi r0,iAdrszMessTest5
    ldrpl r0,iAdrszMessTest5N
    bl affichageMess
	
    @ carry off carry on
    @mov r1,#-10     @ for carry set
    @mov r1,#10  @ for carry off
    mov r1,#(2<<30) - 1   @ for carry off
    adds r1,#20    @ s --> flags
    ldrcc r0,iAdrszMessTest6    @ carry clear
    ldrcs r0,iAdrszMessTest6N   @ carry set
    bl affichageMess

    @ overflow off overflow on
    @mov r1,#-10     @ for not overflow 
    @mov r1,#10  @ for not overflow
    mov r1,#(2<<30) - 1  @ for overflow 
    adds r1,#20    @ s --> flags
    ldrvc r0,iAdrszMessTest7    @ overflow off
    ldrvs r0,iAdrszMessTest7N   @ overflow on
    bl affichageMess

    @ other if then else
    mov r1,#5  @ for then
    @mov r1,#20  @ for else
    cmp r1,#10   
    ble 1f         @ less or equal 
    @bge 1f      @ greather or equal
    @else
    ldr r0,iAdrszMessTest8N    @ overflow off
    bl affichageMess
    b 2f
1:   @ then
   ldr r0,iAdrszMessTest8    @ overflow off
    bl affichageMess
2:
 
100:   /* standard end of the program */
    mov r0, #0                  @ return code
    pop {fp,lr}                 @restaur 2 registers
    mov r7, #EXIT              @ request to exit program
    swi 0                       @ perform the system call
iAdrszMessTest1:		.int szMessTest1
iAdrszMessTest1N:		.int szMessTest1N
iAdrszMessTest2:		.int szMessTest2
iAdrszMessTest2N:		.int szMessTest2N
iAdrszMessTest3:		.int szMessTest3
iAdrszMessTest3N:		.int szMessTest3N
iAdrszMessTest4:		.int szMessTest4
iAdrszMessTest4N:		.int szMessTest4N
iAdrszMessTest5:		.int szMessTest5
iAdrszMessTest5N:		.int szMessTest5N
iAdrszMessTest6:		.int szMessTest6
iAdrszMessTest6N:		.int szMessTest6N
iAdrszMessTest7:		.int szMessTest7
iAdrszMessTest7N:		.int szMessTest7N
iAdrszMessTest8:		.int szMessTest8
iAdrszMessTest8N:		.int szMessTest8N
/******************************************************************/
/*     display text with size calculation                         */ 
/******************************************************************/
/* r0 contains the address of the message */
affichageMess:
    push {fp,lr}    			/* save  registres */ 
    push {r0,r1,r2,r7}    		/* save others registers */
    mov r2,#0   				/* counter length */
1:      	/* loop length calculation */
    ldrb r1,[r0,r2]  			/* read octet start position + index */
    cmp r1,#0       			/* if 0 its over */
    addne r2,r2,#1   			/* else add 1 in the length */
    bne 1b          			/* and loop */
                                /* so here r2 contains the length of the message */
    mov r1,r0        			/* address message in r1 */
    mov r0,#STDOUT      		/* code to write to the standard output Linux */
    mov r7, #WRITE             /* code call system "write" */
    swi #0                      /* call systeme */
    pop {r0,r1,r2,r7}     		/* restaur others registers */
    pop {fp,lr}    				/* restaur des  2 registres */ 
    bx lr	        			/* return  */

Arturo

if?-else

num: 2

if? num=2 [
	print "yep, num is 2"
]
else [
	print "something went wrong..."
]
Output:
yep, num is 2

case-when?

loop 1..5 'num [
    case [num]
        when? [<2] -> print [num ": it's less than 2"]
        when? [=2] -> print [num ": it's 2!"]
        when? [=3] -> print [num ": it's 3!"]
        else       -> print [num ": the number is too big"]
]
Output:
1 : it's less than 2 
2 : it's 2! 
3 : it's 3! 
4 : the number is too big 
5 : the number is too big 

Astro

if x == 0:
    foo()
elif x == 1:
    bar()
elif x == 2:
    baz()
else:
    qux()

match x:
    0 => foo()
    1 => bar()
    2 => baz()
    _ => qux()

(a) ? b : c

AutoHotkey

if, else if, else

x = 1
If x
  MsgBox, x is %x%
Else If x > 1
  MsgBox, x is %x%
Else
  MsgBox, x is %x%

ternary if

x = 2
y = 1
var := x > y ? 2 : 3
MsgBox, % var

while (looping if)

While (A_Index < 3) {
  MsgBox, %A_Index% is less than 3
}

AutoIt

If, ElseIf, Else

If <expression> Then
    statements
    ...
[ElseIf expression-n Then
    [elseif statements ... ]]
    ...
[Else
    [else statements]
    ...
EndIf

Select Case

Select
    Case <expression>
        statement1
        ...
    [Case 
        statement2
        ...]
    [Case Else
        statementN
        ...]
EndSelect

Switch Case

Switch <expression>
    Case <value> [To <value>] [,<value> [To <value>] ...]
        statement1
        ...
    [Case <value> [To <value>] [,<value> [To <value>] ...]
        statement2
        ...]
    [Case Else
        statementN
        ...]
EndSwitch

--BugFix (talk) 15:39, 13 November 2013 (UTC)

Avail

If-Then-Else

If year = 1999 then [Print: "Party!";];

If someNumber > 5 then [Print: "Too high!";] else [Print: "Adequate amount.";];

If breed = "Abyssinian" then [score := 150;]
else if breed = "Birman" then [score := 70;]
else [score := 45;];

Unless char = ¢X then [Print: "character was not an x";];

Ternary

The basic control structures in Avail can be used as expressions by using blocks with a return value. By tradition this distinction is noted by using a lowercase first character.

Print: if result = 13 then ["unlucky"] else ["safe"];

AWK

Conditionals in awk are modelled after C:

if(i<0) i=0; else i=42

For a branch with more than a single statement, this needs braces:

if(i<0) {
    i=0; j=1
  } else {
    i=42; j=2
  }

There is also the ternary conditional:

i=(i<0? 0: 42)

Axe

Expressions that evaluate to zero are considered false. Expressions that evaluate to nonzero are considered true.

Simple

If 1
 YEP()
End

Inverse If

!If 1
 NOPE()
End

If-Else

If 1
 YEP()
Else
 NOPE()
End

Axe has no support for switch-like statements. If-ElseIf-Else structures are required to achieve the same goal.

If-ElseIf-Else

If 1=0
 NOPE()
ElseIf 1=1
 YEP()
Else
 NOPE()
End

If-InverseElseIf-Else

If 1=0
 NOPE()
Else!If 1=2
 YEP()
Else
 NOPE()
End

Babel

Simple select

"foo" "bar" 3 4 > sel <<

Prints "foo" since '3 4 >' evaluates to false, which causes sel to remove "bar" from the stack.

If-Then-Else

    {3 4 >}
        {"foo"}
        {"bar"}
    ifte
    <<

Prints "bar" because the first line is the "if", the second line is the "then" and the last line is the "else", and '3 4 >' evaluates to false.

Conditional

    ({3 4 >} {"Three is greater than four" }
    {3 3 >}  {"Three is greater than three"}
    {3 2 >}  {"Three is greater than two"  }
    {3 1 >}  {"Three is greater than one"  })
    cond
    <<

Prints "Three is greater than two", as expected.

BASIC

if-then-else

BASIC can use the if statement to perform conditional operations:

10 LET A%=1: REM A HAS A VALUE OF TRUE
20 IF A% THEN PRINT "A IS TRUE"
30 WE CAN OF COURSE USE EXPRESSIONS
40 IF A%<>0 THEN PRINT "A IS TRUE"
50 IF NOT(A%) THEN PRINT "A IS FALSE"
60 REM SOME VERSIONS OF BASIC PROVIDE AN ELSE KEYWORD
70 IF A% THEN PRINT "A IS TRUE" ELSE PRINT "A IS FALSE"

Here are code snippets from a more modern variant that does not need line numbers:

Works with: QuickBasic version 4.5
Works with: FreeBASIC version 0.20.0

Single line IF does not require END IF

IF x = 0 THEN doSomething
IF x < 0 THEN doSomething ELSE doOtherThing

Multi-line IF:

IF x > 0 AND x < 10 THEN
   'do stuff
ELSE IF x = 0 THEN
   'do other stuff
ELSE
   'do more stuff
END IF

Like in C, any non-zero value is interpreted as True:

IF aNumber THEN
   'the number is not 0
ELSE
   'the number is 0
END IF

select case

Works with: QuickBasic version 4.5
Works with: FreeBASIC version 0.20.0

The condition in each case branch can be one or more constants or variables, a range or an expression.

SELECT CASE expression
CASE 1
   'do stuff
CASE 2, 3
   'do other stuff
CASE 3.1 TO 9.9
   'do this
CASE IS >= 10
   'do that
CASE ELSE
   'default case
END SELECT

Computed ON-GOTO

Older line-numbered BASICs had a mechanism for vectoring execution based on the contents of a numeric variable (a low-budget case statement).

ON V GOTO 120,150,150,170

or:

10 INPUT "Enter 1,2 or 3: ";v
20 GOTO v * 100
99 STOP
100 PRINT "Apple"
110 STOP
200 PRINT "Banana"
210 STOP
300 PRINT "Cherry"
310 STOP

Conditional loops

Some variants of basic support conditional loops:

10 REM while loop
20 L=0
30 WHILE L<5
40 PRINT L
50 L=L+1
60 WEND
70 REM repeat loop
80 L=1
90 REPEAT
100 PRINT L
110 L=L+1
120 UNTIL L>5

Applesoft BASIC

Applesoft BASIC does not have ELSE, only the IF-THEN structure and computed ON-GOSUB and ON-GOTO

 10  LET X = 1
 20  IF X THEN  PRINT "X IS TRUE"
 30  IF  NOT X THEN  PRINT "X IS FALSE"
 40  ON X GOSUB 100,200,300
 50  ON X GOTO 300,200,100
 100  PRINT "APPLE": RETURN 
 200  PRINT "BANANA": RETURN 
 300  PRINT "CHERRY"

BASIC256

Of these, we'll need to see how nested if statements parse.

# Begin Case / Case / End Case, Do / Until, If Then, While / End While 


begin case
   case boolean_expr
      statement(s)
   case boolean_expr
      statement(s)
   else
      statement(s)
end case 



do
   statement(s)
until boolean_expr



if booleanexpr then
   statement(s)
end if 

if booleanexpr then
   statement(s)
else
   statement(s)
end if 



while boolean_expr
   statement(s)
end while 

I think this test shows that nested if statements parse as they do in c.

for i = 0 to 1
  for j = 0 to 1
    print i
    print j
    if (i) then
      if (j) then
        print "i is true j is true"
      else
        print "i is true j is false"
      end if
    else
      if (j) then 
        print "i is false j is true"
      else
        print "i is false j is false"
      end if
    end if
  next j
next i

Batch File

IF syntax:

IF [NOT] ERRORLEVEL number          command
IF [NOT] string1==string2           command
IF [NOT] EXIST filename             command
IF CMDEXTVERSION number             command
IF DEFINED variable                 command
IF [/I] string1 compare-op string2  command
   where compare-op is:
   EQU - equal 
   NEQ - not equal 
   LSS - less than 
   LEQ - less than or equal 
   GTR - greater than 
   GEQ - greater than or equal 
   /I    case insensitive string compares

The ELSE clause must be on the same line as the command after the IF. For example:

IF EXIST %filename% (
  del %filename%
) ELSE (
  echo %filename% not found 
)

BBC BASIC

      REM Single-line IF ... THEN ... ELSE (ELSE clause is optional):
      IF condition% THEN statements ELSE statements

      REM Multi-line IF ... ENDIF (ELSE clause is optional):
      IF condition% THEN
        statements
      ELSE
        statements
      ENDIF

      REM CASE ... ENDCASE (OTHERWISE clause is optional):
      CASE expression OF
        WHEN value1: statements
        WHEN value2: statements
          ...
        OTHERWISE: statements
      ENDCASE

      REM ON ... GOTO (ELSE clause is optional):
      ON expression% GOTO dest1, dest2 ... ELSE statements

      REM ON ...GOSUB (ELSE clause is optional):
      ON expression% GOSUB dest1, dest2 ... ELSE statements

      REM ON ... PROC (ELSE clause is optional):
      ON expression% PROCone, PROCtwo ... ELSE statements

beeswax

beeswax has 4 conditional operators that act like the ternary ?: operator in C or Julia. Due to the 2-dimensional nature of beeswax it is possible to realize complex branching structures this way.

The 4 conditional operators are:

'      lstack top value == 0 ? skip next instruction : don’t skip next instruction.
"      lstack top value  > 0 ? skip next instruction : don’t skip next instruction.
K      lstack top value == 2nd value ? skip next instruction : don’t skip next instruction.
L      lstack top value  > 2nd value ? skip next instruction : don’t skip next instruction.

Example:

_`Enter integer n:`T'p`n = 0`>N`Enter integer m:`T'p`m = 0`>` and `Kp`m = n`;
                     >`n > 0`d                     >`m > 0`d        >Lp`m > n`;
                                                                      >`m < n`;

Example output:

Enter integer n:
i3
n > 0
Enter integer m:
i0
m = 0 and m < n

Befunge

Befunge only has one conditional structure, which comes in two flavors: vertical IF ( | ) and horizontal IF ( _ ). Befunge only has two boolean commands, greater-than ( ` ) and not ( ! ). These snippets input a number and use the conditional operators to print a "0" if it is zero and an "X" otherwise.

v   > "X",@ non-zero
> & |
    > "0",@ zero

# is the skip command. It unconditionally skips one character, allowing a little flexibility in flow control.

& #v_ "0",@ zero
   >  "X",@ non-zero

Binary Lambda Calculus

Lambda calculus has no conditional structures built in, but the standard representations of booleans can be seen to implement if-then-else: true = \then. \else. then, false = \then. \else. else, which correspond to BLC programs 00 00 110 and 00 00 10.

blz

if-else

if i % 2 == 0
    print("even")
else
    print("odd")
end

Bori

if-elif-else

if (i == 0)
    return "zero";
elif (i % 2)
    return "odd";
else
    return "even";

BQN

The basic method of control flow in BQN is implemented using first-class functions and Choose (). Using Choose, we can implement some basic control structures:

If       {𝕏𝕎@}´                 # Also Repeat
IfElse   {cTF: cFT@}
While    {𝕩{𝔽𝔾𝔽_𝕣_𝔾𝔽𝔾𝕩}𝕨@}´  # While 1‿{... to run forever
DoWhile  {𝕏@  While 𝕨𝕩}´
For      {ICPA: I@  WhileC,PA}

# Switch/case statements have many variations; these are a few
Match    {𝕏𝕨}´
Select   {(𝕩)(1𝕩)@}
Switch   {c𝕩  ma<˘21𝕩  (a⊐C)m@}
Test     {fn{CA𝕊e:CAE}´𝕩Fn@}

The other method of branching is using function predicates, which can be used in any blocks for an if-else like conditional:

{
  a<b ? a+1 ; # If
  a<c ? c-1 ; # Else If
        a-2   # Else
}

However, they act like any other block header, so the variables defined in each predicate segment do not exist in their else and else if condition. Block Headers in general provide a rudimentary form of control flow (checking for exact matches and wildcards), but these are much more constrained than a general conditional.

Source: Control Flow in BQN

Bracmat

"if .. then .. else .." type of branching

Bracmat uses & and | for branching. These binary operators are like && and || in C-like languages. Bracmat does not have the notion of Boolean variables, but marks all evaluated expressions as either succeeded or failed. If the left hand side of the & operator has succeeded, Bracmat goes on evaluating the right hand side. Only if both of left and right hand sides succeed, the expression tree headed by the & operator as a whole succeeds. Likewise, only if both of left and right hand sides of an expression tree headed by | fail, the expression tree as a whole fails. Evaluated expressions are just that: expressions. The following expression writes "That's what I thought." to your screen and evaluates to the expression "Right".

    2+2:5
  & put$"Strange, must check that Bracmat interpreter."
  & 0
|   put$"That's what I thought."
  & Right

switch-like branching

Use a patterns with alternations. Note that the match-expression (the tree headed by the : operator) evaluates to the left hand side of the : operator. In the following example, the resulting expression is a single node containing "4".

  2+2
: (   (<3|>5)
    & put$"Not quite, must check that Bracmat interpreter."
  |   (3|5)
    & put$"Not far off, but must check that Bracmat interpreter some day."
  |   ?
    & put$"That's what I thought."
  )

Brainf***

Brainf*** has two conditional jump instructions, [ and ]. the [ instruction jumps forward to the corresponding ] instruction if the value at the current memory cell is zero, while the ] instruction jumps back if the current memory cell is nonzero. Thus in the following sequence:

[.]

The . instruction will be skipped, while the following sequence

+[.]

will result in an infinite loop. Finally, in the following sequence

+[.-]

The . instruction will be executed once.

Burlesque

Using the Choose command:

blsq ) 9 2.%{"Odd""Even"}ch
"Odd"

Using the If command (produce next even number if odd):

blsq ) 9^^2.%{+.}if
10
blsq ) 10^^2.%{+.}if
10

Using the IfThenElse command (produce next odd number if even or previous even number if odd):

blsq ) 10^^2.%{-.}\/{+.}\/ie
11
blsq ) 9^^2.%{-.}\/{+.}\/ie
8

Emulating Switch-Case behaviour:

blsq ) {"Hate tomatos" "Like Bananas" "Hate Apples"}{"Tomato" "Banana" "Apple"}"Banana"Fi!!
"Like Bananas"
blsq ) {"Hate tomatos" "Like Bananas" "Hate Apples"}{"Tomato" "Banana" "Apple"}"Apple"Fi!!
"Hate Apples"

C

See Conditional Structures/C

C#

if-elseif-else

if (condition)
{
   // Some Task
}

if (condition)
{
  // Some Task
}
else if (condition2)
{
  // Some Task
}
else
{
  // Some Task
}

Ternary

// if condition is true var will be set to 1, else 2.
int var = condition ? 1 : 2;

switch

switch (value)
{
   case 1:
          // Some task
          break;  // Breaks are required in C#.
   case 2:
   case 3:
         // Some task
         break;
   default: // If no other case is matched.
         // Some task
         break;
}

If fall through algorithms are required use the goto keyword.

switch (value)
{
   case 1:
          // Some task
          goto case 2; // will cause the code indicated in case 2 to be executed.
   case 2:
          // Some task
          break;
   case 3:
         // Some task
         break;
   default: // If no other case is matched.
         // Some task
         break;
}

C++

Run-Time Control Structures

See C

Compile-Time Control Structures

Preprocessor Techniques

See C

Template metaprogramming

Selecting a type depending on a compile time condition

template<bool Condition, typename ThenType, typename Elsetype> struct ifthenelse;

template<typename ThenType, typename ElseType> struct ifthenelse<true, ThenType, ElseType>
{
  typedef ThenType type;
};

template<typename ThenType, typename ElseType> struct ifthenelse<false, ThenType, ElseType>
{
  typedef ElseType type;
};

// example usage: select type based on size
ifthenelse<INT_MAX == 32767, // 16 bit int?
           long int,         // in that case, we'll need a long int
           int>              // otherwise an int will do
  ::type myvar;              // define variable myvar with that type

Clean

if

There are no then or else keyword in Clean. The second argument of if is the then-part, the third argument is the else-part.

bool2int b = if b 1 0

case-of

case 6 * 7 of
    42 -> "Correct"
    _  -> "Wrong" // default, matches anything

function alternatives

answer 42 = True
answer _ = False

guards

answer x
    | x == 42   = True
    | otherwise = False

case 6 * 7 of
    n | n < 0 -> "Not even close"
    42        -> "Correct"
    // no default, could result in a run-time error

Clipper

if-elseif-else-endif

IF x == 1
   SomeFunc1()
ELSEIF x == 2
   SomeFunc2()
ELSE
   SomeFunc()
ENDIF

do case

DO CASE
CASE x == 1
   SomeFunc1()
CASE x == 2
   SomeFunc2()
OTHERWISE
   SomeFunc()
ENDCASE

Clojure

if-then-else

(if (= 1 1) :yes :no) ; returns :yes

(if (= 1 2) :yes :no) ; returns :no

(if (= 1 2) :yes) ; returns nil

when

Similar to if, but body in an implicit do block allowing multiple statements. No facility for providing an else. when is defined as a macro.

(when x
  (print "hello")
  (println " world")
  5) ; when x is logical true, prints "hello world" and returns 5; otherwise does nothing, returns nil

cond

The cond macro takes a series of test/result pairs, evaluating each test until one resolves to logical true, then evaluates its result. Returns nil if none of the tests yield true.

(cond
  (= 1 2) :no) ; returns nil

(cond
  (= 1 2) :no
  (= 1 1) :yes) ; returns :yes

Since non-nil objects are logical true, by convention the keyword :else is used to yield a default result.

(cond
  (= 1 2) :no
  :else :yes) ; returns :yes

condp

Similar to cond, but useful when each test differs by only one variant.

(condp < 3
  4 :a  ; cond equivalent would be (< 4 3) :a
  3 :b
  2 :c
  1 :d) ; returns :c

Optionally takes a final arg to be used as the default result if none of the tests match.

(condp < 3
  4 :a
  3 :b
  :no-match) ; returns :no-match

case

Works with: Clojure version 1.2
(case 2
  0 (println "0")
  1 (println "1")
  2 (println "2")) ; prints 2.

CMake

set(num 5)

if(num GREATER 100)
  message("${num} is very large!")
elseif(num GREATER 10)
  message("${num} is large.")
else()
  message("${num} is small.")
  message("We might want a bigger number.")
endif()

The if() and elseif() commands evaluate boolean expressions like num GREATER 100; refer to cmake --help-command if. The elseif() and else() sections are optional.

COBOL

if-then-else

if condition-1
    imperative-statement-1
else
    imperative-statement-2
end-if

if condition-1
    if condition-a
        imperative-statement-1a
    else
        imperative-statement-1
    end-if
else
    if condition-a
        imperative-statement-2a
    else
        imperative-statement-2
    end-if
end-if

evaluate

evaluate identifier-1
when 'good'
    good-imperative-statement
when 'bad'
    bad-imperative-statement
when 'ugly'
when 'awful'
    ugly-or-awful-imperative-statement
when other
    default-imperative-statement
end-evaluate

evaluate true
when condition-1
    condition-1-imperative-statement
when condition-2
    condition-2-imperative-statement
when condition-3
    condition-3-imperative-statement
when other
    default-condition-imperative-statement
end-evaluate

evaluate identifier-1 also identifier-2
when 10 also 20
   one-is-10-and-two-is-20-imperative-statement
when 11 also 30
   one-is-11-and-two-is-30-imperative-statement
when 20 also any
   one-is-20-and-two-is-anything-imperative-statement
when other
   default-imperative-statement
end-evaluate

CoffeeScript

if-then-else

if n == 1
  console.log "one"
else if n == 2
  console.log "two"
else
  console.log "other"

switch

n = 1

switch n
  when 1
    console.log "one"
  when 2, 3
    console.log "two or three"
  else
    console.log "other"

ternary expressions

CoffeeScript is very expression-oriented, so you can assign the "result" of an if-then to a variable.

s = if condition then "yup" else "nope"

# alternate form
s = \
  if condition
  then "yup"
  else "nope"

ColdFusion

if-elseif-else

Compiler: ColdFusion any version

<cfif x eq 3>
 do something
<cfelseif x eq 4>
 do something else
<cfelse>
 do something else
</cfif>

switch

Compiler: ColdFusion any version

<cfswitch expression="#x#">
 <cfcase value="1">
  do something
 </cfcase>
 <cfcase value="2">
  do something
 </cfcase>
 <cfdefaultcase>
  do something
 </cfdefaultcase>
</cfswitch>

Comal

IF/THEN

IF condition THEN PRINT "True"

IF/THEN/ELSE

IF condition THEN
   PRINT "True"
ELSE
   PRINT "False"
ENDIF

IF/THEN/ELIF/ELSE

IF choice=1 THEN
   PRINT "One"
ELIF choice=2 THEN
   PRINT "Two"
ELSE
   Print "None of the above"

CASE/WHEN

CASE choice OF
WHEN 1
   PRINT "One"
WHEN 2
   PRINT "Two"
OTHERWISE
   PRINT "Some other choice"
ENDCASE

Common Lisp

There are 2 main conditional operators in common lisp, (if ...) and (cond ...).

(if cond then [else])

The (if ...) construct takes a predicate as its first argument and evaluates it. Should the result be non-nil, it goes on to evaluate and returnm the results of the 'then' part, otherwise, when present, it evaluates and returns the result of the 'else' part. Should there be no 'else' part, it returns nil.

(if (= val 42)
    "That is the answer to life, the universe and everything"
    "Try again") ; the else clause here is optional

when and unless

Common Lisp also includes (when condition form*) and (unless condition form*) which are equivalent, respectively, to (if condition (progn form*)) and (if (not condition) (progn form*)).

It is unidiomatic to use if without an else branch for side effects; when should be used instead.

(cond (pred1 form1) [... (predN formN)])

The (cond ...) construct acts as both an if..elseif...elseif...else operator and a switch, returning the result of the form associated with the first non-nil predicate.

(cond ((= val 1)                 (print "no"))
      ((and (> val 3) (< val 6)) (print "yes"))
      ((> val 99)                (print "too far"))
      (T                         (print "no way, man!")))

Computer/zero Assembly

The only conditional operation provided is BRZ (branch on accumulator negative). For an example illustrating how this instruction can be used to code "equal to", "greater than", and "less than", see Integer comparison#Computer/zero Assembly.

Crack

if-elseif-else

if (condition)
{
   // Some Task
}

if (condition)
{
  // Some Task
}
else if (condition2)
{
  // Some Task
}
else
{
  // Some Task
}

Ternary

// if condition is true var will be set to 1, else false.
int var = condition ? 1 : 2;

Curto

si-sino

( condición ) si ( sentencias si verdadero ) entonces
( condición ) si ( sentencias si verdadero ) sino ( sentencias si falso ) entonces

ejemplo:

: menor-que-diez ( n -- )
  10 < si 
    ." Menor que 10" 
  sino 
    ." Mayor o igual a 10" 
  entonces ;

D

See C, sans the preprocessor.
void main() {
    enum int i = 5;

    // "static if" for various static checks:
    static if (i == 7) {
        // ...
    } else {
        //...
    }

    // is(T == U) checks if type T is U.
    static if (is(typeof(i) == int)) {
        // ...
    } else {
        // ...
    }

    // D switch is improved over C switch:
    switch (i) {
        case 0:
            break; // Silent fallthrough is forbidden.
        case 1:
            goto case; // Explicit fallthrough.
        case 2:
            // Empty cases don't require an explicit fallthrough.
        case 3:
            return;
        case 4, 5, 7: // Multiple cases.
            break;
        case 8: .. case 15: // Inclusive interval.
            goto case 3;
        default: // Default case is required.
            break;
    }

    enum Colors { yellow, blue, brown, green }
    immutable c = Colors.blue;

    // "final switch" is safer, for enums (and in future other values,
    // like Algebraic), because all cases must be present.
    // with() is handy to avoid repeating "Colors." for each case.
    final switch (c) with (Colors) {
        case yellow:        break;
        case blue:          break;
        case brown, green:  break;
        // case yellow: .. case brown: // Forbidden in final switches.
        // default: // Forbidden in final switches.
    }
}

Dao

If Elif Else

a = 3
if( a == 1 ){
    io.writeln( 'a == 1' )
}else if( a== 3 ){
    io.writeln( 'a == 3' )
}else{
    io.writeln( 'a is neither 1 nor 3' )
}

Switch Case

a = 3
switch( a ){
case 0: io.writeln( 'case 0' )
case 1, 2: io.writeln( 'case 1,2' )
case 3, 4, 5: io.writeln( 'case 3,4,5' )
default: io.writeln( 'default' )
}

Delphi

See Pascal

Deluge

if (input.Field == "Hello World") {
    sVar = "good";
} else if (input.Field == "Bye World") {
    sVar = "bad";
} else {
    sVar = "neutral";
}

DM

if-elseif-else

if (condition)
    // Do thing, DM uses indentation for control flow.

if (condition)
    // Do thing

else if (condition)
    // Do thing

else
    // Do thing

Ternary

// x will be 1 if condition is a true value, 2 otherwise.
var/x = condition ? 1 : 2

Switch

switch (value)
    if (0)
        // Do thing if zero
        // DM does not have fall through of switch cases, so explicit break is not required.
    if (1, 2, 3)
        // Multiple values can be allowed by using commas

    if (10 to 20)
        // Ranges are also allowed.
        // Ranges include the bounds (10 and 20 here),
        // and are checked in order if there is potential for overlap.

    else
        // Fallback if nothing was matched.

Dragon

if-then-else

if(a == b)
{
    add()
}
else if(a == c)
    less() //{}'s optional for one-liners
else
{
    both()
}

DWScript

See Pascal

Déjà Vu

if a:
    pass
elseif b:
    pass
else: # c, maybe?
    pass

E

if-then-else

if (okay) {
    println("okay")
} else if (!okay) {
    println("not okay")
} else {
    println("not my day")
}

The pick/2 message of booleans provides a value-based conditional:

println(okay.pick("okay", "not okay"))

It can therefore be used to construct a Smalltalk-style conditional:

okay.pick(fn {
    println("okay")
}, fn {
    println("not okay")
})()

All of the above conditionals are expressions and have a usable return value.

switch

E's "switch" allows pattern matching.

def expression := ["+", [1, 2]]

def value := switch (expression) {
    match [`+`, [a, b]] { a + b }
    match [`*`, [a, b]] { a * b }
    match [op, _] { throw(`unknown operator: $op`) }
}

EasyLang

i = randint 10
if i mod 2 = 0
   print i & " is divisible by 2"
elif i mod 3 = 0
   print i & " is divisible by 3"
else
   print i & " is not divisible by 2 or 3"
.

Efene

The expressions can contain parenthesis or not, here both options are shown. Since if and case do pattern matching, if an if or case expression don't match some of the patterns, the program will crash

show_if_with_parenthesis = fn (Num) {
    if (Num == 1) {
        io.format("is one~n")
    }
    else if (Num === 2) {
        io.format("is two~n")
    }
    else {
        io.format("not one not two~n")
    }
}

show_if_without_parenthesis = fn (Num) {
    if Num == 1 {
        io.format("is one~n")
    }
    else if Num === 2 {
        io.format("is two~n")
    }
    else {
        io.format("not one not two~n")
    }
}

show_switch_with_parenthesis = fn (Num) {
    switch (Num) {
        case (1) {
            io.format("one!~n")
        }
        case (2) {
            io.format("two!~n")
        }
        else {
            io.format("else~n")
        }
    }
}

show_switch_without_parenthesis = fn (Num) {
    switch (Num) {
        case 1 {
            io.format("one!~n")
        }
        case 2 {
            io.format("two!~n")
        }
        else {
            io.format("else~n")
        }
    }
}

@public
run = fn () {
    show_if_with_parenthesis(random.uniform(3))
    show_if_without_parenthesis(random.uniform(3))

    show_switch_with_parenthesis(random.uniform(3))
    show_switch_without_parenthesis(random.uniform(3))
}

Ela

if-then-else

if x < 0 then 0 else x

Guards

getX x | x < 0 = 0
       | else  = x

Pattern matching

force (x::xs) = x :: force xs
force [] = []

match expression

force lst = match lst with
                  x::xs = x :: force xs
                  [] = []


EMal

int i = 19
^|if–then–else|^
if i > 18
  writeLine("greater than 18")
else
  writeLine("less or equal to 18")
end
^|else if|^
if i == 18 do writeLine("equal to 18")
else if i < 18 do writeLine("less than 18")
else do writeLine("greater than 18") 
end
^|when expression: just like iif in Visual Basic|^
writeLine(when(i > 18, "greater than 18", "less or equal to 18"))
^|hash-based conditionals|^
Map dispatch = int%fun[ 
  18 => <|writeLine("equal to 18"), 
  19 => <|writeLine("yeah, it's 19")]
if dispatch.has(i) do dispatch[i]() end
Output:
greater than 18
greater than 18
greater than 18
yeah, it's 19

Erlang

Erlang's conditionals are based on pattern matching and guards. There are several mechanisms for this: case-of, if, function clauses. Pattern matching allows destructuring a term and matches a clause based on the structure. In the case example the term is X and the pattern is {N,M} or _. _ will match anything, while {N,M} will only match tuples of two terms. Though N and M could be any other type (in this case an error will occur if they're non-numeric). Guards allow more specification on the terms from the matched pattern. In the case example comparing N and M are guards.

case

case expressions take an expression and match it to a pattern with optional guards.

case X of
  {N,M} when N > M -> M;
  {N,M} when N < M -> N;
  _ -> equal
end.

if

if expressions match against guards only, without pattern matching. Guards must evaluate to true or false so true is the catch-all clause.

{N,M} = X,
if
  N > M -> M;
  N < M -> N;
  true -> equal
end.

Function Clauses

Functions can have multiple clauses tested in order.

test({N,M}) when N > M -> M;
test({N,M}) when N < M -> N;
test(_) -> equal.

F#

printfn "%s" (if 3<2 then "3 is less than 2" else "3 is not less than 2")
Output:
3 is not less than 2

Factor

There are many conditional structures in Factor. Here I'll demonstrate the most common ones. A few of these have other variations that abstract common stack shuffle patterns. I will not be demonstrating them.

?

? is for when you don't need branching, but only need to select between two different values.

t 1 2 ? ! returns 1

if

t [ 1 ] [ 2 ] if ! returns 1

cond

{ { [ t ] [ 1 ] } { [ f ] [ 2 ] } } cond ! returns 1

case

t { { t [ 1 ] } { f [ 2 ] } } case ! returns 1

when

t [ "1" print ] when ! prints 1

unless

f [ "1" print ] unless ! prints 1

FALSE

condition[body]?

Because there is no "else", you need to stash the condition if you want the same effect:

$[\true\]?~[false]?

or

$[%true0~]?~[false]?

Fancy

Fancy has no built-in conditional structures. It uses a combination of polymorphism and blockliterals (closures) to achieve the same thing (like Smalltalk).

if:then:

if: (x < y) then: {
  "x < y!" println # will only execute this block if x < y
}

if:then:else::

if: (x < y) then: {
  "x < y!" println # will only execute this block if x < y
} else: {
  "x not < y!" println
}


if_true:

x < y if_true: {
  "x < y!" println # will only execute this block if x < y
}

if_false: / if_nil:

x < y if_false: {
  "x not < y!" println # will only execute this block if x >= y
}

if_true:else:

x < y if_true: {
  "x < y!" println
} else: {
  "x >= y!" println
}

if_false:else:

x < y if_false: {
  "x >= y!"
} else: {
  "x < y!" println
}

if:

{ "x < y!" println } if: (x < y)   # analog, but postfix


unless:

{ "x not < y!" } unless: (x < y)   # same here

Forth

IF-ELSE

( condition ) IF ( true statements ) THEN
( condition ) IF ( true statements ) ELSE ( false statements ) THEN

example:

10 < IF ." Less than 10" ELSE ." Greater than or equal to 10" THEN

CASE-OF

( n -- ) CASE
( integer ) OF ( statements ) ENDOF
( integer ) OF ( statements ) ENDOF
( default instructions )
ENDCASE

example: a simple CASE selection

: test-case ( n -- )
   CASE
     0 OF ." Zero!" ENDOF
     1 OF ." One!"  ENDOF
     ." Some other number!"
   ENDCASE ;

Execution vector

To obtain the efficiency of a C switch statement for enumerations, one needs to construct one's own execution vector.

: switch
  CREATE ( default-xt [count-xts] count -- ) DUP , 0 DO , LOOP ,
  DOES> ( u -- ) TUCK @ MIN 1+ CELLS + @ EXECUTE ;

  :NONAME ." Out of range!" ;
  :NONAME ." nine" ;
  :NONAME ." eight" ;
  :NONAME ." seven" ;
  :NONAME ." six" ;
  :NONAME ." five" ;
  :NONAME ." four" ;
  :NONAME ." three" ;
  :NONAME ." two" ;
  :NONAME ." one" ;
  :NONAME ." zero" ;
10 switch digit

 8 digit   \ eight
34 digit   \ Out of range!

Execution Vector 2

This method was used by the late Jim Kalihan and Dr. Julian Nobel

: CASE:  ( <name>)   CREATE   ;

\ lookup execution token and compile 
: |      ( <name> )  '  compile,  ; 

: ;CASE   ( n -- )  DOES>  OVER + + @ EXECUTE ;

 : FOO   ." FOO" ;
 : BAR   ." BAR" ;
 : FIZZ  ." FIZZ" ;
 : BUZZ  ." BUZZ" ;

CASE: SELECT ( n -- ) | FOO  | BAR | FIZZ | BUZZ  ;CASE

\ Usage:  3 SELECT

Fortran

In ISO Fortran 90 and later, there are three conditional structures. There are also a number of other *unstructured* conditional statements, all of which are old and many of which are marked as "deprecated" in modern Fortran standards. These examples will, as requested, only cover conditional *structures*:

IF-THEN-ELSE

ANSI FORTRAN 77 or later has an IF-THEN-ELSE structure:

if ( a .gt. 20.0 ) then
   q = q + a**2
else if ( a .ge. 0.0 ) then
   q = q + 2*a**3
else
   q = q - a
end if

SELECT-CASE

ISO Fortran 90 or later has a SELECT-CASE structure:

select case (i)
   case (21:)      ! matches all integers greater than 20
      q = q + i**2
   case (0:20)     ! matches all integers between 0 and 20 (inclusive)
      q = q + 2*i**3
   case default    ! matches all other integers (negative in this particular case)
      q = q - I
end select

WHERE-ELSEWHERE

ISO Fortran 90 and later has a concurrent, array-expression-based WHERE-ELSEWHERE structure. The logical expressions in WHERE and ELSEWHERE clauses must be array-values. All statements inside the structure blocks must be array-valued. Furthermore, all array-valued expressions and statements must have the same "shape". That is, they must have the same number of dimensions, and each expression/statement must have the same sizes in corresponding dimensions as each other expression/statement. For each block, wherever the logical expression is true, the corresponding elements of the array expressions/statements are evaluated/executed.

! diffusion grid time step
where     (edge_type(1:n,1:m) == center)
   anew(1:n,1:m) = (a(1:n,1:m) + a(0:n-1,1:m) + a(2:n+1,1:m) + a(1:n,0:m-1) + a(1:n,2:m+1)) / 5

elsewhere (edge_type(1:n,1:m) == left)
   anew(1:n,1:m) = (a(1:n,1:m) + 2*a(2:n+1,1:m) + a(1:n,0:m-1) + a(1:n,2:m+1)) / 5

elsewhere (edge_type(1:n,1:m) == right)
   anew(1:n,1:m) = (a(1:n,1:m) + 2*a(0:n-1,1:m) + a(1:n,0:m-1) + a(1:n,2:m+1)) / 5

elsewhere (edge_type(1:n,1:m) == top)
   anew(1:n,1:m) = (a(1:n,1:m) + a(0:n-1,1:m) + a(2:n+1,1:m) + 2*a(1:n,2:m+1)) / 5

elsewhere (edge_type(1:n,1:m) == bottom)
   anew(1:n,1:m) = (a(1:n,1:m) + a(0:n-1,1:m) + a(2:n+1,1:m) + 2*a(1:n,0:m-1)) / 5

elsewhere (edge_type(1:n,1:m) == left_top)
   anew(1:n,1:m) = (a(1:n,1:m) + 2*a(2:n+1,1:m) + 2*a(1:n,2:m+1)) / 5

elsewhere (edge_type(1:n,1:m) == right_top)
   anew(1:n,1:m) = (a(1:n,1:m) + 2*a(0:n-1,1:m) + 2*a(1:n,2:m+1)) / 5

elsewhere (edge_type(1:n,1:m) == left_bottom)
   anew(1:n,1:m) = (a(1:n,1:m) + 2*a(2:n+1,1:m) + 2*a(1:n,0:m-1)) / 5

elsewhere (edge_type(1:n,1:m) == right_bottom)
   anew(1:n,1:m) = (a(1:n,1:m) + 2*a(0:n-1,1:m) + 2*a(1:n,0:m-1)) / 5

elsewhere      ! sink/source, does not change
   anew(1:n,1:m) = a(1:n,1:m)
end where

FreeBASIC

IF-ELSEIF-ELSE-END IF

Dim a As Integer = 1
If a = 1 Then
  sub1
ElseIf a = 2 Then
  sub2
Else
  sub3
End If

SELECT-CASE

Dim a As Integer = 1
Select Case a
  Case 1
    sub1
  Case 2
    sub2
  Case Else
    sub3
End Select

IFF

Dim b As Boolean = True
Dim i As Integer = IIf(b, 1, 2)

ON-GOTO

Dim a As Integer = 1
On a Goto label1, label2

IF-GOTO (deprecated)

Dim b As Boolean = True
If b Goto label

ON-GOSUB (legacy dialects only)

Dim a As Integer = 1
On a Gosub label1, label2

#IF-#ELSEIF-#ELSE-#ENDIF (preprocessor)

#DEFINE WORDSIZE 16
#IF (WORDSIZE = 16)
  ' Do some some 16 bit stuff
#ELSEIF (WORDSIZE = 32)
  ' Do some some 32 bit stuff
#ELSE
  #ERROR WORDSIZE must be set to 16 or 32
#ENDIF

#IFDEF (preprocessor)

#DEFINE _DEBUG
#IFDEF _DEBUG
  ' Special statements for debugging
#ENDIF

#IFNDEF (preprocessor)

#IFNDEF _DEBUG
  #DEFINE _DEBUG 
#ENDIF

friendly interactive shell

if-then-else

set var 'Hello World'
if test $var = 'Hello World'
    echo 'Welcome.'
else if test $var = 'Bye World'
    echo 'Bye.'
else
    echo 'Huh?'
end

switch

case statements take wildcards as arguments, but because of syntax quirk, they have to be quoted (just like in Powershell), otherwise they would match files in current directory. Unlike switch statements in C, they don't fall through. To match something that would be matched if nothing was matches use wildcard that matches everything, the language doesn't have default statement.

switch actually
    case az
        echo The word is "az".
    case 'a*z'
        echo Begins with a and ends with z.
    case 'a*'
        echo Begins with a.
    case 'z*'
        echo Ends with z.
    case '*'
        echo Neither begins with a or ends with z.
end

Futhark

if-then-else

Futhark supports branching with a syntax common to most functional languages.

if <condition> then <truebranch> else <falsebranch>


FutureBasic

FB supports conditionals similar to those in C and many other languages.

local fn DoIt
  long A = 7
  if A > 0 then print "A is a positive number" else print "A is a negative number"
  
  long B = -10
  if B > 0
    print "B is a positive number"
  else
    print "B is a negative number"
  end if
  
  long C = 99
  select (C)
    case C < 0
      print "C is a negative number"
    case C = 0
      print "C is zero"
    case C > 0
      print "C is a positive number"
    case else
      print "C is unknown"
  end select
  
  CFStringRef suitName, suitSymbol
  suitSymbol = @"S"
  select (suitSymbol)
    case @"C": suitName = @"Clubs"
    case @"D": suitName = @"Diamonds"
    case @"H": suitName = @"Hearts"
    case @"S": suitName = @"Spades"
    case else : suitName = @"Unknown"
  end select
  print suitName
end fn

fn Doit

HandleEvents

GAP

if-then-else

if <condition> then
    <statements>
elif <condition> then
    <statements>
else
    <statements>
fi;


Go

If and switch are the general purpose conditional structures in Go, although the language certainly contains other conditional elements.

If

Simplest usage is,

if booleanExpression {
    statements
}

The braces are required, even around a single statement.

if booleanExpression {
    statements
} else {
    other
    statements
}

Braces are required around else clauses, as above, unless the statement of the else clause is another if statement. In this case the statements are chained like this,

if booleanExpression1 {
    statements
} else if booleanExpression2 {
    otherStatements
}

If allows a statement to be included ahead of the condition. This is commonly a short variable declaration, as in,

if x := fetchSomething(); x > 0 {
    DoPos(x)
} else {
    DoNeg(x)
}

In this case the scope of x is limited to if statement.

Switch

Simple usage is,

switch {
case booleanExpression1:
    statements
case booleanExpression2:
    other
    statements
default:
    last
    resort
    statements
}

Because switch can work with any number of arbitrary boolean expressions, it replaces if/elseif chains often found in other programming languages.

Switch can also switch on the value of an expression, as in,

switch expressionOfAnyType {
case value1:
    statements
case value2, value3, value4:
    other
    statements
}

As shown, multiple values can be listed for a single case clause. Since go is statically typed, the types of value1, 2, 3, and 4 must match the type of the expression.

As with if, a local statement such as a short variable declaration can precede the expression. If there is no expression, the statement is still marked by a semicolon:

switch x := fetch(); {
case x == "cheese":
    statements
case otherBooleanExpression:
    other
    statements
}

Also, as with if, the scope of x is limited to the switch statement.

Execution does not normally fall through from one case clause to the next, but this behavior can be forced with a fallthrough statement.

An interesting example:

switch {
case booleanExpression1:
default:
    statements
    preliminaryToOtherStatements
    fallthrough
case booleanExpression2:
    other
    statements
}

Case expressions are evaluated in order, then if none are true, the default clause is executed.

Another statement that interacts with switch is break. It breaks from the switch statement and so will not break from a surrounding for statement. The following example prints "I want out!" endlessly.

for {
    switch {
    case true:
        break
    }
    fmt.Println("I want out!")
}

Labels provide the desired capability. The following prints "I'm off!"

treadmill: for {
    switch {
    case true:
        break treadmill
    }
}
fmt.Println("I'm off!")

Grain

If statements

In Grain, if statements are expressions, meaning they can be used for variable assignments. If they are used as an expression, the return value must be of the same type, meaning an else clause is always required. If an if statement has nothing returned as the body (the body is of the Void type), the else clause can be omitted.

let x = if (1 < 2) {
    ":)"
} else { // The else clause is required here as x is a string
    ":("
}

if (2 > 3) {
    print("This should never execute.")
} // We can omit the else clause here

// We use else if for chaining
if (1 > 2) {
    print("1 is less than 2")
} else if (2 == 3) {
    print("2 is 3")
} else {
    print("This should always execute.")
}

Pattern matching

Pattern matching in Grain is like a switch-statement with superpowers. Each case of a match defines the pattern that the data could fall into.

// A match statement more like the traditional switch statement
// often seen in other languages.
enum PizzaTopping { Cheese, Pepperoni, Peppers, Pineapple }

let topping = Peppers

match (topping) {
  Cheese => print("Would it really be pizza without it?"),
  Pepperoni => print("An instant classic."),
  Peppers => {
    // We can use a block for more expressions.
    print("For those who like to spice things up.")
  },
  Pineapple => print("You do you.")
}

As well as a traditional switch statement, we can match on the shape of the data. If we keep with the pizza theme, this looks a bit like this.

enum Topping { Cheese, Pepperoni, Peppers, Pineapple }
enum Menu { Pizza(Topping), Calzone(Topping) }

let item = Calzone(Peppers)

match (item) {
  Calzone(topping) => {
    if (checkSpecials(topping)) {
      print("These are half off this week.")
    } else {
      print("No current specials.")
    }
  },
  _ => print("No current specials.")
}

Harbour

if-elseif-else-endif

IF x == 1
   SomeFunc1()
ELSEIF x == 2
   SomeFunc2()
ELSE
   SomeFunc()
ENDIF

do case

DO CASE
CASE x == 1
   SomeFunc1()
CASE x == 2
   SomeFunc2()
OTHERWISE
   SomeFunc()
ENDCASE

switch While if-elseif-else-endif and do case constructions allows using of any expressions as conditions, the switch allows literals only in conditional case statements. The advantage of the switch command is that it is much faster.

SWITCH x
CASE 1
   SomeFunc1()
   EXIT
CASE 2
   SomeFunc2()
   EXIT
OTHERWISE
   SomeFunc()
ENDSWITCH

Haskell

if-then-else

fac x = if x==0 then
           1
           else x * fac (x - 1)

Guards

fac x | x==0 = 1
      | x>0 = x * fac (x-1)

Pattern matching

fac 0 = 1
fac x = x * fac (x-1)

case statement

fac x = case x of 0 -> 1
                  _ -> x * fac (x-1)

HicEst

IF( a > 5 ) WRITE(Messagebox) a ! single line IF

IF( a >= b ) THEN
    WRITE(Text=some_string) a, b
  ELSEIF(some_string > "?") THEN
    WRITE(ClipBoard) some_string
  ELSEIF( nonzero ) THEN
    WRITE(WINdowhandle=nnn) some_string
  ELSE
    WRITE(StatusBar) a, b, some_string
ENDIF

HPPPL

IF

Note that X has to be a number; else a runtime error occurs.

IF X THEN
	// do if X is not 0
ELSE
	// do if X is 0
END;

CASE

CASE
	IF X == 1 THEN
		// do stuff if X equals 1
	END
	IF X == 2 THEN
		// do stuff if X equals 1
	END
	IF X == 3 THEN
		// do stuff if X equals 3
	END
	DEFAULT
		// do other stuff
END;

i

//'i' supports if, else, and else if
software {
	a = 3
 
	if a = 3
		print("a = three")
	else if a = 2
		print("a = two")
	else
		print("a = ", a)
	end
}

Icon and Unicon

All Icon and Unicon expressions, including control structures, yield results or signal failure.

if-then-else

The control structure evaluates expr1 if expr0 succeeds and expr2 if it fails.

if expr0 then
   expr1
else
   expr2

case-of

The first successful selection expression will select and evaluate the specific case.

case expr0 of {
   expr1 : expr2
   expr3 : expr4
   default: expr5
   }

Note that expr1 and expr3 are expressions and not constants and it is possible to write expressions such as:

case x of {
   f(x) | g(x) : expr2
   s(x) & t(x) : expr4
   default: expr5
   }

Compound expressions (blocks)

In the examples below, multiple expressions can be grouped as in:

{
   expr1
   expr2
   expr3
}

Which is equivalent to this:

{expr1; expr2; expr3}

For example the following, which will write 4, looks strange but is valid:

write({1;2;3;4})

The value of a compound expression is the value of the last expression in the block.

Alternation

Alternation of expressions yields a value for the first succeeding expression.

   expr1 | expr2 | expr3

Conjunction

Conjunctions yeild the value of the final expression provided all the previous expressions succeed.

   expr1 & expr2 & expr3

Alternately, conjunction can be written thus:

   (expr1, expr2, expr3)

Conjunction, yielding a different result

The alternate form of conjunction can be modified to produce a different result (other than the last)

   expr0(expr1, expr2, expr3)

For example:

   2(expr1, expr2, expr3)

Yields the value of expr2 if all of the expressions succeed.
A more complicated example showing non-constant expressions:

   f(expr1)(g(expr2)(expr3,expr4,expr5))

Note: if expr0 yields a value of type 'procedure' or 'string' the appropriate procedure (or operator) is invoked.

IDL

if-else

Basic if/then:

if a eq 5 then print, "a equals five" [else print, "a is something else"]

Any one statement (like these print statements) can always be expanded into a {begin ... end} pair with any amount of code in between. Thus the above will expand like this:

if a eq 5 then begin
  ... some code here ...
endif [else begin
  ... some other code here ...
endelse]

case

case <expression> of
  (choice-1): <command-1>
  [(choice-2): <command-2> [...]]
  [else: <command-else>]
endcase

(Or replace any of the commands with {begin..end} pairs)

switch

switch <expression> of
  (choice-1): <command-1>
  [(choice-2): <command-2> [...]]
  [else: <command-else>]
endswitch

The switch will execute all commands starting with the matching result, while the case will only execute the matching one.

on_error

on_error label

Will resume execution at label when an error is encountered. on_ioerror is similar but for IO errors.

Inform 7

if-then-else

[short form]
if N is 1, say "one.";
otherwise say "not one.";

[block form]
if N is 1:
	say "one.";
otherwise if N is 2:
	say "two.";
otherwise:
	say "not one or two.";

[short and long forms can be negated with "unless"]
unless N is 1, say "not one."

switch

if N is:
	-- 1: say "one.";
	-- 2: say "two.";
	-- otherwise: say "not one or two.";

if-then-else in text

say "[if N is 1]one[otherwise if N is 2]two[otherwise]three[end if].";
say "[unless N is odd]even.[end if]";

other branching text substitutions

Text that may be printed multiple times can also use sequential and random branching:

[a different color every time]
say "[one of]red[or]blue[or]green[at random].";

["one" the first time it's printed, "two" the second time, then "three or more" subsequently]
say "[one of]one[or]two[or]three or more[stopping]";

[only appears once]
say "[first time]Hello world![only]";

rulebook approach

Conditional logic may also be expressed in the form of a rulebook, with conditions on each rule:

Number Factory is a room.

Number handling is a number based rulebook with default success.

Number handling for 1: say "one."
Number handling for 2: say "two."
Number handling for an even number (called N): say "[N in words] (which is even)."
Last number handling rule: say "other."

When play begins:
	follow the number handling rules for 2;
	follow the number handling rules for 4;
	follow the number handling rules for 5.

Isabelle

theory Scratch
  imports Main
begin

text‹if-then-else›
lemma "(if True then 42 else 0) = 42" by simp

text‹case statement with pattern matching, which evaluates to the True-case›
lemma "case [42] of
         Nil  ⇒ False
       | [x]  ⇒ True
       | x#xs ⇒ False" by simp

text‹Loops are implemented via recursive functions›
fun recurse :: "nat ⇒ nat" where
  "recurse 0 = 0"
| "recurse (Suc n) = recurse n"

text‹The function always returns zero.›
lemma "recurse n = 0" by(induction n) simp+

end

J

See Conditional Structures/J

Jakt

fn main() {
    let a = 5
    let b = 3

    // If/else/else-if
    if a > b {
        println("a > b")
    } else if a < b {
        println("a < b")
    } else {
        println("a = b")
    }

    // Match
    match a {
        (..5) => {
            println("a < 5")
        }
        5 => {
            println("a == 5")
        }
        else => {
            println("a > 5")
        }
    }

    // Or equivalently
    println(match a {
        (..5) => "a < 5"
        5 => "a == 5"
        else => "a > 5"
    })

    // Hash based
    let primality = [
        1: false
        2: false
        3: true
        4: false
        5: true
        6: false
    ]
    let a_is_prime = primality[a]
    println("a_is_prime = {}", a_is_prime)
}

Java

if-then-else

if (s.equals("Hello World")) {
    foo();
} else if (s.equals("Bye World"))
    bar(); // braces optional for one-liners
else {
    deusEx();
}

Java also supports short-circuit evaluation. So in a conditional like this:

if (obj != null && obj.foo()) {
   aMethod();
}

obj.foo() will not be executed if obj != null returns false. It is possible to have conditionals without short circuit evaluation using the & and | operators (from Bitwise operations). So in this conditional:

if (obj != null & obj.foo()) {
   aMethod();
}

You will get a null pointer exception if obj is null.

ternary

s.equals("Hello World") ? foo() : bar();

The ternary operator is an expression, and is most often used as such:

Object newValue = s.equals("Hello World") ? a : b;

switch

This structure will only work if the code being switched on evaluates to an integer or character. There is no switching on Objects (except for Java 17 and higher), longs, or floating-point types in Java (except for Strings and enum types in Java 7 and higher).

switch (c) {
    case 'a':
        foo();
        break;
    case 'b':
        bar();
    default:
        foobar();
}

This particular example can show the "fallthrough" behavior of a switch statement. If c is the character b, then bar() and foobar() will both be called. If c is the character a, only foo() will be called because of the break statement at the end of that case.

Also, the switch statement can be easily translated into an if-else statement. The example above is equivalent to:

if (c == 'a') {
   foo();
} else if (c == 'b') {
   bar();
   foobar();
} else {
   foobar();
}

Cases without breaks at the end require duplication of code for all cases underneath them until a break is found (like the else if block shown here).

switch expressions

Works with: Java version 14+

Switch statements can be expressions. They must be exhaustive, and return a value with the yield keyword.

int x = switch (c) {
    case 'a':
        foo();
        yield 1;
    case 'b':
        bar();
    default:
        foobar();
        yield 0;
}

There is also a new syntax, available for both statements and expressions, that does not use fallthrough:

int y = switch (c) {
    case '1', '2' -> 1 // multiple cases can be on one line
    default -> { // use a block for multiple statements
        foobar();
        yield 0;
    }
}

JavaScript

if-then-else

if( s == "Hello World" ) {
    foo();
} else if( s == "Bye World" ) {
    bar();
} else {
    deusEx();
}

switch

switch(object) {
    case 1:
        one();
        break;
    case 2:
    case 3:
    case 4:
        twoThreeOrFour();
        break;
    case 5:
        five();
        break;
    default:
        everythingElse();
}

conditional (ternary) operator (?:)

var num = window.obj ? obj.getNumber() : null;

The distinctive feature of the ternary operator (compared to JavaScript's other conditional structures) is that it evaluates as an expression rather than a statement, and can therefore be composed within larger expressions, making it a valuable resource of program structure in a functional idiom of JavaScript.

function takeWhile(lst, fnTest) {
    'use strict';
    var varHead = lst.length ? lst[0] : null;

    return varHead ? (
        fnTest(varHead) ? [varHead].concat(
            takeWhile(lst.slice(1), fnTest)
        ) : []
    ) : [];
}

JCL

At the origin, JCL has a tricky conditional statement: the COND parameter. It is an inverted condition of an execution bypass of a step.
Step return code values are traditionnaly ordered this way:

0  :  ok
4  :  warning
8  :  error
12 :  severe error
16 :  terminal error

The syntax of COND parameter of the EXEC statement is :

  COND=(rcval,relop,step) 
    relop is a relational opeator : EQ NE GT LT GE LE   (= ¬= < > <= >=)

It is a condition to bypass a job step, and it can be translateted into :

  if rcval relop step.rc then not execute the current step

Example:

//STEP6  EXEC PGM=MYPROG,COND=(0,NE,STEP3)
if 0 ne STEP3.rc  then skip    step STEP6 
if 0 ^= STEP3.rc  then skip    step STEP6 
if STEP3.rc ^= 0  then skip    step STEP6 
if STEP3.rc = 0   then execute step STEP6 

The conditions can be multiple :

  COND=((rcval1,relop1,step1),(rcval2,relop2,step2),...)

Means:

  if rcval1 relop1 step1.rc or rcval2 relop2 step2.rc or ... then not execute the current step

Example:

//STEP6  EXEC PGM=MYPROG,COND=((4,LE,STEP1),(8,LE,STEP3))
if  4 le STEP1.rc   or  8 le STEP3.rc  then skip step STEP6 
if  4 <= STEP1.rc   or  8 <= STEP3.rc  then skip step STEP6 
if  STEP1.rc >= 4   or  STEP3.rc >= 8  then skip step STEP6 
if  STEP1 is ok    and  STEP3 has only warnings then execute STEP6 

Jinja

if-then-else

print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
                        {{ loop.index }}) {{ lang }}{% if loop.last %}.{% else %},{% endif %}
                  {%- endfor %}""").render())

ternary expressions

print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
                        {{ loop.index }}) {{ lang }}{{ "." if loop.last else "," }}
                  {%- endfor %}""").render())

short-circuit evaluation

print(Template("""{% for lang in ["Jinja", "Python", "Swift", "Nim"] %}
                        {{ loop.index }}) {{ lang }}{{ loop.last and "." or "," }}
                  {%- endfor %}""").render())

jq

jq's main conditional construct is:

if cond then f else g end

where cond, f, and g, are filters, and where cond may evaluate to anything at all, it being understood that:

  1. all JSON values are truthy except for false and null;
  2. if cond evaluates to nothing (i.e., produces an empty stream), then the entire if-then-else-end expression also produces an empty stream.

The general pattern allows one or more "elif _ then _" clauses:

if cond then f elif cond1 then f1 .... else g end

For example:

if empty then 2 else 3 end          # produces no value
if 1 then 2 else 3 end              # produces 2
if [false, false] then 2 else 3 end # produces 2
if (true, true) then 2 else 3 end   # produces a stream: 2, 2

Notice that if cond produces a nonempty stream, then the entire expression will typically do the same. Since f and g also can produce streams, this lends itself to interesting Cartesian-product possibilities. There is no "case <exp>" construct, but the idiom illustrated by the following example can be used to avoid the need to create a temporary variable to hold the "case" expression:

exp
 | if   . == true then "true"
   elif . == false then "false"
   elif . == null  then "maybe"
   elif type == "string" then .
   else error("unexpected value: \(.)")
   end

Since jq's and and or are short-circuiting, they can also be used for branching, as can the binary disjunctive operator `//`.

Julia

Note: this documentation is mostly copied from the Julia 0.6.0 documentation at: https://docs.julialang.org/en/stable/manual/control-flow/#man-conditional-evaluation-1

Conditional Evaluation

function test(x, y)
    if x < y
        println("x is less than y")
    elseif x > y
        println("x is greater than y")
    else
        println("x is equal to y")
    end
end

julia> test(1, 2)
x is less than y

julia> test(2, 1)
x is greater than y

julia> test(1, 1)
x is equal to y

The elseif and else blocks are optional, and as many elseif blocks as desired can be used. The condition expressions in the if-elseif-else construct are evaluated until the first one evaluates to true, after which the associated block is evaluated, and no further condition expressions or blocks are evaluated.

The so-called "ternary operator", ?:, is closely related to the if-elseif-else syntax, but is used where a conditional choice between single expression values is required, as opposed to conditional execution of longer blocks of code. It gets its name from being the only operator in most languages taking three operands:

a ? b : c

The expression a, before the ?, is a condition expression, and the ternary operation evaluates the expression b, before the :, if the condition a is true or the expression c, after the :, if it is false. To facilitate chaining, the operator associates from right to left.

Short-Circuit Evaluation

Short-circuit evaluation is quite similar to conditional evaluation. The behavior is found in most imperative programming languages having the && and || boolean operators: in a series of boolean expressions connected by these operators, only the minimum number of expressions are evaluated as are necessary to determine the final boolean value of the entire chain. Explicitly, this means that:

In the expression a && b, the subexpression b is only evaluated if a evaluates to true.

In the expression a || b, the subexpression b is only evaluated if a evaluates to false.

Kabap

Kabap supports the if statement and a range of standard comparators. Truthiness is considered anything not "0" or 0.

if 1;
  $result = "Execute";

if 0;
  $result = "Ignored";

if 1; {
  $result = "Block";
  $result = "Execute";
}

if 0; {
  $result = "Block";
  $result = "Ignored";
}

if 1 == 1;
  $result = "Execute";

if 1 < 2;
  $result = "Execute";

if 1 <= 1;
  $result = "Execute";

if 2 > 1;
  $result = "Execute";

if 1 >= 1;
  $result = "Execute";

if 1 != 2;
  $result = "Execute";

$a = 1;
if $a == 1;
  $result = "Execute";

if $a == kabap.version;
  $result = "Execute";

if 1 == "1";
  $result = "Execute";

if 1 + 1 == 2;
  $result = "Execute";

if 1;
  if 1; {
    if 1;
      if 1; {
        $result = "Execute";
      }
  }

Keg

Keg supports if statements like this:

?A>[The letter is larger than a|The letter is smaller than a]

Usually the ending proprotions may be omitted:

?![You did enter something]

Also Keg supports (though not intentionally) a form of short-circuit evaluation:

2?1>*# Returns 2 if the input is larger than 1

Kotlin

// version 1.0.6

fun main(args: Array<String>) {
    // conventional 'if/else if/else' statement
    if (args.isEmpty()) println("No arguments were supplied")
    else if (args.size == 1) println("One argument was supplied")
    else println("${args.size} arguments were supplied")

    print("Enter an integer : ")
    val i = readLine()!!.toInt()

    // 'when' statement (similar to 'switch' in C family languages)
    when (i) {
        0, 1      -> println("0 or 1")
        in 2 .. 9 -> println("Between 2 and 9")
        else      -> println("Out of range")
    }

    // both of these can be used as expressions as well as statements
    val s = if (i < 0) "negative" else "non-negative"
    println("$i is $s")
    val t = when {
        i > 0  -> "positive"
        i == 0 -> "zero"
        else   -> "negative"
    }
    println("$i is $t")
}

Sample input/output (program invoked without arguments):

Output:
No arguments were supplied
Enter an integer : 3
Between 2 and 9
3 is non-negative
3 is positive

LabVIEW

Case Structure

This image is a VI Snippet, an executable image of LabVIEW code. The LabVIEW version is shown on the top-right hand corner. You can download it, then drag-and-drop it onto the LabVIEW block diagram from a file browser, and it will appear as runnable, editable code.

Select

Select is similar to the Ternary operator in text-based languages.

Lambdatalk

{if true then yes else no}
-> yes

{def switch
 {lambda {:n}
  {if {< :n 0}
   then :n is negative
   else {if {> :n 0}
   then :n is positive
   else :n is zero}}}}  

{switch -12}
-> -12 is negative
{switch 12}
-> 12 is positive
{switch 0}
-> 0 is zero

langur

If and switch expressions always produce a value, even if it's nothing (null).

In the shortened forms, you dispense with the keywords (except the first one).

if expressions

If expressions are scoped per section.

if .x == 0 {
    ...
} else if .x > 0 {
    val .y = 100
    ...
} else {
    val .y = 70
    ...
}

shortened form if expression

The shortened form expects a single action expression per test expression.

This is more flexible than a ternary operator, as it allows more than one test. An else section is optional (null by default).

if(.x > .y: ...; .x < .y: ...; /* else */ ...)

simple if

Simple if expressions use a colon after the test condition. This is convenient for simple branching or assignments, without having to use curly braces, but does not allow for else if or else sections.

if .x > .y: break

switch expressions

Switch expressions are highly flexible, and it is not all covered here. See langurlang.org for details.

Switch defaults to testing that any condition is true (as familiar to many programmers), but this can be changed by specifying an infix operator within square brackets, such as switch[and].

switch .x, .y, .z {
    case true: ...
        # any are true
    case false, _: ...                  
        # .x == false
    case _, null, true: ...
        # .y == null or .z == true
    case xor _, true, true: ...
        # .y == true xor .z == true
}

switch 0 {
    case .x, .y: ...
        # .x or .y equals 0
    ...
}

switch[and] .x, .y, .z {
    case true: ...
        # all are true
    case false, _: ...                  
        # .x == false
    case _, null, true: ...
        # .y == null and .z == true
}

Complex test expressions are evaluated once, then compared against conditions.

implicit fallthrough

If a block of a switch has any statements, there is no implicit fallthrough. A case with an empty block after it creates an implicit fallthrough.

switch .x {
    case true:     
        # implicit fallthrough
    case null: 0
        # no fallthrough
    default: 1
}

explicit fallthrough from anywhere

A fallthrough statement is allowed anywhere within a switch block, not just at the end. (It's typical in programming languages to only allow fallthrough at the end of the block.)

switch .x {
    case true:
        if .y > 100 {
            fallthrough
        } else {
            120
        }
    case false: ...
}

shortened form switch

A shortened form expects a single action expression per test and is more limited in other ways, as well (no explicit fallthrough, no alternate test expressions, no alternate logical operators). A default section is optional (null by default).

switch(.x, .y, .z;
    true: ... ;     # any are equal to true
    _, >= .z: ...;  # .y >= .z
    ... )           # default

LC3 Assembly

The LC3 sets condition codes (N[egative], Z[ero], and/or P[ositive]) based on the results of instructions that write values into the general purpose registers. The BR instruction utilizes these condition codes are to branch conditionally. If the BR instruction specifies one or more condition codes and at least one specified code is set, then the PC will be updated to the branch address. If none of the specified condition codes is set, then the next sequential instruction will execute. If the BR instruction does not specify any condition codes, then it is an unconditional branch, so the branch will be taken.

BR or BRnzp    ; unconditional branch, i.e.
               ; branch if (result < 0 || result == 0 || result > 0)
               ; ^ this is always true

BRn            ; branch if (result < 0)
BRz            ; branch if (result == 0)
BRp            ; branch if (result > 0)

               ; or any combination of these condition codes, e.g.
BRnz           ; branch if (result <= 0)

The effect of if (x == y) { go to LABEL } is achieved by adding x to -y (the two's complements of y) and branching if the result is zero. The following example prints "Branch Taken!" because the values of x and y are both 1.

.orig x3000
LD R1, x        ; get x
LD R2, y        ; get y
NOT R0, R2      ; R0 = ~y
ADD R0, R0, 1	; R0 = -y
ADD R0, R0, R1	; R0 = x - y
BRZ BRANCH      ; if (x == y) { go to BRANCH }
LEA R0, nottaken
PUTS            ; else print "Branch Not Taken!"
BR END
BRANCH
LEA R0, taken
PUTS            ; print "Branch Taken!"
END HALT
x .fill 1
y .fill 1
taken .stringz "Branch Taken!"
nottaken .stringz "Branch Not Taken!"
.end

LIL

LIL sports if with an optional code block for else conditions.

if {$a > 10} {print "code evaluated on true"}
if {$a > 10} {print "again"} {print "code evaluated on false"}

These can of course be nested in clear or nasty forms. if blocks can contain if blocks with as many optional else clauses as a programmer sees fit to intermingle.

It might be argued that out of band catcher code blocks could be seen as conditional valid command branching? It would be a feature and definition fairly unique to LIL and the Tcl likes.

Lisaac

Works with: Lisaac version 0.13.1

if-then-else

+ n : INTEGER;

n := 3;

(n = 2).if {
  IO.put_string "n is 2\n";
}.elseif {n = 3} then {
  IO.put_string "n is 3\n";
}.elseif {n = 4} then {
  IO.put_string "n is 4\n";
} else {
  IO.put_string "n is none of the above\n";
};
(n = 2).if_true { "n is 2\n".print; };
(n = 2).if_false { "n is not 2\n".print; };

when

+ n : INTEGER;

n := 3;
n
.when 2 then {
  "n is 2\n".print;
}
.when 3 then {
  "n is 3\n".print;
}
.when 4 then {
  "n is 4\n".print;
};

There is no "else" or "otherwise" method. If the values of the when-methods are overlapped, the related blocks will be evaluated ... they are not mutually exclusive.

Little

int a = 3;

// if-then-else
if (a == 2) {
    puts ("a is 2"); 
} else if (a == 3) {
    puts ("a is 3");
} else {
    puts("a is 4");
}

// unless
unless (a == 2) { // equivalent to if (a != 2) 
    puts ("a is 2");  // It will print this line
} else if (a == 3) {
    puts ("a is 3");
} else {
    puts("a is 4");
}   

// switch
switch (a) {
    case 2:
        puts ("a is 2"); 
        break;
    case 3:
        puts ("a is 3");
        break;
    case 4:
        puts ("a is 4");
        break;
    default: 
        puts("is neither");
}

if :x < 0 [make "x 0 - :x]

ifelse emptyp :list [print [empty]] [print :list]

UCB Logo and its descendants have also case:

to vowel? :letter
output case :letter [ [[a e i o u] "true] [else "false] ]
end
show vowel? "e
show vowel? "x
Output:
true
false

Logo also provides TEST which is local to a procedure:

to mytest :arg1 :arg2
test :arg1 = :arg2
iftrue [print [Arguments are equal]]
iffalse [print [Arguments are not equal]]
end

LSE

SI..ALORS..SINON..FIN SI

SI A ET B ALORS
    AFFICHER [4X, 'A ET B = .VRAI.',/]
SINON
    AFFICHER [4X, 'A ET B = .FAUX.',/]
FIN SI
SI A ET QUE B ALORS
    AFFICHER [4X, 'A ET QUE B = .VRAI.',/]
SINON
    AFFICHER [4X, 'A ET QUE B = .FAUX.',/]
FIN SI

EVALUER

EVALUER X
    QUAND 0
        AFFICHER [4X,'QUAND X=0',/]
    QUAND 1
        AFFICHER [4X,'QUAND x=1',/]
    QUAND 1+1
        AFFICHER [4X,'QUAND X=2',/]
    QUAND AUTRE
        AFFICHER [4X,'QUAND X est autre, X=',U,/] X
FIN EVALUER

SELON..ALLER EN..

0    AFFICHER [U,/] 'Faites votre choix:'
1    AFFICHER [8X,U,X,/] '0 VACHES'
2    AFFICHER [8X,U,/] '1 MOUTONS'
5    LIRE X
9    SELON X ALLER EN 10,20 SINON EN 0
10   AFFICHER [U,/] 'Vous avez choisi VACHES!'
15   TERMINER
20   AFFICHER [U,/] 'Vous avez choisi MOUTONS!'

SI..ALORS..SINON..IS

ENTIER U <- SI A ALORS 65535 SINON 1 IS

SELON..DANS..SINON..FIN

ENTIER U <- SELON A DANS 0, 255 SINON 1 FIN

LSE64

The simple conditionals take single words rather than blocks of statements, as in most other languages.

t : " true"  ,t
f : " false" ,t
true  if t
false ifnot f
true  ifelse t f

Cascading conditionals are constructed using duplicate definitions and "then", yielding a syntax reminiscent of functional language Pattern Matching.

onetwo : drop " Neither one nor two" ,t    # default declared first
onetwo : dup 2 = then " Two" ,t
onetwo : dup 1 = then " One" ,t

Short-circuit operators "&&" and "||" are used for complex conditionals.

dup 0 = || ,t    # avoid printing a null string

Lua

--if-then-elseif-then-else
if a then
  b()
elseif c then
  d()
else
  e()
end

for var = start, _end, step do --note: end is a reserved word
  something()
end

for var, var2, etc in iteratorfunction do
  something()
end

while somethingistrue() do
  something()
end

repeat
  something()
until somethingistrue()

cases = {
key1 = dothis,
key2 = dothat,
key3 = dotheother
}

cases[key]() --equivalent to dothis(), dothat(), or dotheother() respectively

Luna

if-then-else

if char == "<" then Prepend "<" acc else acc

(see: github/luna #125)

case-of

class JSON:
    ...
    def asText: case self of:
        JSONString t: t
        other: throw "JSON.asText: not a text"

(see: Std.JSON)

M2000 Interpreter

If Then Else.if Else

Module CheckIt {
      Read a
      If a>1 then {
            Print "Top"
      } else.if a>=-4 then {
            Print "Middle"
      } else {
            Print "Bottom"
      }
}
CheckIt 100
CheckIt 0
CheckIt -100

Module CheckIt {
      Read a
      \\ using end if without blocks
      If a>1 then
            Print "Top"
      else.if a>=-4 then
            Print "Middle"
      else
            Print "Bottom"
      End If
}
CheckIt 100
CheckIt 0
CheckIt -100

Module CheckIt {
      Read a
      \\ without use of END IF in one line
      If a>1 then Print "Top" else.if a>=-4 then Print "Middle" else Print "Bottom"
}
CheckIt 100
CheckIt 0
CheckIt -100

IF() and IF$() - Ternary

One expression evaluated only. We can use If$() to use string expressions

Module Checkit {
      Read x
      Print If(x>100-> 100, x)
}
Checkit 30
Checkit 300

\\ we can use more than two expressions, if i is not in range then 0 returned
Module Checkit {
      Read i,x
      Print If(i-> x*5, x*40, x*500)
}
Checkit 1, 20
Checkit 2, 20
Checkit 3, 20

Ternary can used as Elvis operator (a function here), when a false (or a Nothing, for some kind of objects) evaluated then return something after ->, else return true or the object so if A is object then If(A->,B) return A.


Module Checkit {
      def a
      Print type$(a)="Double"
      b=(1,2,3,4)
      for i=1 to 3
            a=if(a->, b)  ' this happen only one time, where a is a double, second time a is an object
            Print a  ' print 3 values
            a++ ' add 1 to each value
            Print type$(a)="mArray"
      Next  i
}
Checkit

Select Case

We can use string, and three types of cases (all of them in one case), >1000, 10 to 40, 400

Module CheckIt {
      Read a
      Select Case a
      Case >1
            {
                  Print "Top"
                  \\ need block if we have more than one line of code
            }
      Case >=-4
            Print "Middle"
      Else
            Print "Bottom"
      End Select
}
CheckIt 100
CheckIt 0
CheckIt -100

Module CheckIt {
      Read a
      if a>-500 then
            Select Case a
            Case >1
                  {
                        Print "Top"
                        \\ need block if we have more than one line of code
                  }
            Case >=-4
                  Print "Middle"
            Else  Case    \\ need ELSE CASE if Select Case is inside a IF END IF (WITHOUT BLOCK)
                  Print "Bottom"
            End Select
      Else 
            Print "Out of range"      
    End if  
}
CheckIt 100
CheckIt 0
CheckIt -100
CheckIt -500

Conditional loops

x=10
While x>0 {
      Print x
      x--
}
Do {  ' se can use Repeat in place of Do
      x++
      Print x
} Until x=10

\\ without curly braces:
x=10
While x>0
      Print x
      x--
End While
Do
      x++
      Print x
Until x=10

On Goto, On Gosub

Module CheckIt {
      For i=1 to 10 {
            x=Random(1,2)
            {
                  On x Goto alfa, beta
                  alfa:
                        Print "ok1"
                        Exit
                  beta:
                        Print "ok2"
                        Exit
            }
            Print "End One"
            
            x=Random(1,2)
            {
                  On x Gosub alfa1, beta1
                  Exit
                  alfa1:
                        Print "ok1"
                        Return
                  beta1:
                        Print "ok2"
                        Return
            }
            Print "End"
      }     
}
CheckIt

If Then line No /label

Line numbers are optional and can be in any order, but from start in current block, and if not found then replaced with exit, until search can't continue (at modules/function bounds, we can't jump out of a module or function).

a$="123"
if a$ ~ "12*" then 1000
alfa: ' only remarks here
Print "print here, spaghetti code, marvelous"
Exit
1000 Print "ok final"
Goto alfa

We can jump out of a sub, but we have to use Return to adjust the return stack.Wehn found Sub interpreter execute Exit statement so no need for End or Exit before sub beta()

We can call beta() using Gosub beta() (not Call, call is for modules and functions). If we have an array beta() then we must use Gosub beta() because interpreter prefer arrays, and raise error "missing ="

Module Checkit {
      Rem : Dim beta(10)  ' remove Rem to get error when call beta() without Gosub
      Rem : Gosub beta() ' remove again Rem  and erase next line to use beta() correct
      'beta()
      sub beta()
            local i
            for i=1 to 10 
                  alfa(i)
            next i
      end sub
      sub alfa(x)
      goto 100
      Print "no print"
      End Sub
      
      100 Print "ok this printed", x
              Return
}
Checkit

Make

An if condition using pure make (no gmake extensions)

# make -f do.mk C=mycond if
C=0

if:
   -@expr $(C) >/dev/null && make -f do.mk true; exit 0
   -@expr $(C) >/dev/null || make -f do.mk false; exit 0

true:
   @echo "was true."

false:
   @echo "was false."

Using it

make -f do.mk if C=0
> was false.

make -f do.mk if C=1
> was true.

With out using recursion but letting make continue with non-failed targets even when some of the targets failed (-k)

C=0

if: true false

true:
   @expr $(C) >/dev/null && exit 0 || exit 1
   @echo "was true."

false:
   @expr $(C) >/dev/null && exit 1 || exit 0
   @echo "was false."

Invoking it. Note the use of -k which allows make to evaluate subsequent targets even when a previous non-related target failed.

|make -f do.mk -s -k C=1
was true.
*** Error code 1
|make -f do.mk -s -k C=0
*** Error code 1
was false.

Using gmake

A=
B=

ifeq "$(A)" "1"
       B=true
else
       B=false
endif

do:
       @echo $(A) ..  $(B)

Using it

|gmake -f if.mk A=1
1 .. true
|gmake -f if.mk A=0
0 .. false

Maple

Maple offers both conditional statements and conditional functions.

Conditional statements

Example syntax for conditional statements:

if x > 0 then
   res := x;
else
   res := -x;
end if;

Example syntax for conditional statements with else-if:

if x = 0 then
   res := y;
elif y = 0 then
   res := x;
else
   res := sqrt(x^2+y^2);
end if;

Conditional functions

The Maple function `if`(cond,a,b) (note the backtick ` delimiters) returns a when cond is true and b otherwise.

res := `if`(n::even, n/2, 3*n+1);

The piecewise command can be used for functional evaluation in which there is more than one branch. The following is equivalent to the if/then construct from the previous section.

res := piecewise(x=0, y, y=0, x, sqrt(x^2+y^2));

Mathematica/Wolfram Language

Usual If[condition,True,False]

Make a definition with the condition that x should be positive: f[x_] := ppp[x] /; x > 0

f[5] gives ppp[5]

f[-6] gives f[-6]

MATLAB

If statements

Example:

if x == 1
    disp 'x==1';
elseif x > 1
    disp 'x>1';
else
    disp 'x<1';
end

Switch statements

Example:

switch x
    case 1
        disp 'Hello';
    case 2
        disp 'World';
    otherwise
        disp 'Skynet Active';
end

Maxima

if test1 then (...) elseif test2 then (...) else (...);

MAXScript

if

if x == 1 then
(
     print "one"
)
else if x == 2 then
(
    print "two"
)
else
(
    print "Neither one or two"
)

case

Form one

case x of
(
    1:       (print "one")
    2:       (print "two")
    default: (print "Neither one or two")
)

Form two

case of
(
    (x == 1): (print "one")
    (x == 2): (print "two")
    default:  (print "Neither one or two")
)

MBS

INT x;
x:=0;
IF x = 1 THEN
  ! Do something
ELSE
  ! Do something else
ENDIF;

MDL

COND

This is the main conditional structure in MDL, equivalent to cond in other Lisp variants. COND may contain any number of clauses. The first element of each clause is evaluated, and if it's true, each following element in the clause is evaluated; otherwise control proceeds to the next clause, and so on. In any case, the return value is the result of the last evaluation performed.

An "else" part is traditionally implemented as a final clause whose first element is an atom, like T, since atoms always evaluate to themselves and are always true.

<COND (<==? .X 1> <PRINC "one">)
      (<==? .X 2> <PRINC "two">)
      (T <PRINC "something else">)>

AND and OR

These short-circuiting boolean functions can also be used as simple conditionals.

;"Negate X if its value is less than 0"
<AND <L? .X 0> <SET X <- .X>>>

;"Print a message unless the quiet flag is set"
<OR .QUIET? <PRINC "Finished">>

Metafont

if conditionA:
  % do something
elseif conditionB:
  % do something
% more elseif, if needed...
else:
  % do this
fi;

The particularity of if construct in Metafont is that it can be part of an expression, and the "do something" does not need to fit into the syntactic structure. E.g. we can write something like

b := if a > 5: 3 + else: 2 - fi c;

Alone, the code 3 + does not mean anything; but once the condition is evaluated, the whole expression must become "correct"; e.g. if a > 5, the expression will be b := 3 + c;.

There are no other kind of conditional structures, but the great flexibility of Metafont allows for sure to create "new syntaxes" similar to switches or whatever needed.

min

Works with: min version 0.19.6
(true) ("I'm true") ("I'm false") if  ; If first quotation evaluates to true,
                                      ; evaluate second quotation.
                                      ; Otherwise, evaluate the third.

(true) ("I'm true") when              ; If without the false quotation.
(true) ("I'm false") unless           ; If without the true quotation.

2 (                                   ; For each quotation inside the case
   ((3 >) ("Greater than 3" puts!))   ; quotation, evaluate the second
   ((3 <) ("Smaller than 3" puts!))   ; quotation if the first quotation
   ((true) ("Exactly 3" puts!))       ; evaluates to true. Otherwise, move
) case                                ; on to the next one.

MiniScript

MiniScript supports if/else-if/else, with arbitrary number of else-if sections when in block form:

x = 42
if x < 10 then
    print "small"
else if x < 20 then
    print "small-ish"
else if x > 100 then
    print "large"
else
    print "just right"
end if

It also supports single-line if or if/else statements (though no else-if sections are permitted in this case):

x = 42
if x < 50 then print "small" else print "big"

Finally, like many other languages, MiniScript uses short-circuit evaluation, a form of implicit branching where the rest of a boolean expression is not evaluated at all if the truth value can already be determined.

isSmall = function(x)
    print "checking smallness"
    return x < 40
end function

isBig = function(x)
    print "checking bigness"
    return x > 60
end function

isSmall(10) or isBig(100)
Output:
checking smallness

MIPS Assembly

MIPS is a bit unusual in that it doesn't have "flags" per se. Every branch instruction takes one or more registers as an operand and does the comparison there.

If/Else

BEQ $t0,$t1,Label  ;branch to label if $t0 = $t1. If not, fallthrough to the instruction after the delay slot.
nop                ;branch delay slot

The nice thing about this is, unlike most CISC architectures, you can make some important calculation that you'll use as a condition to branch, and before actually branching, do some other unrelated stuff without the CPU forgetting the correct way to branch. The following (rather contrived) example displays this idea in action:

addu $t0,$t1 ;I'm going to branch based off this addition, but there's other things I want to do first.
lw $t3,($t4)
nop          ;load delay slot
BEQ $t0,$t1,Label
nop          ;branch delay slot

If you're wondering how a branch delay slot impacts the comparison, it doesn't. The delay slot instruction executes after the comparison has been made and CPU has decided whether to branch. (See MIPS Assembly for more info on what delay slots are.) As a result, code like this can introduce subtle off-by-one errors:

BNEZ $t0,loop ;branch if $t0 is nonzero.
subiu $t0,1 ;this finishes at the same time the jumpback occurs.

MIPS also comes with greater than/less than constructs built-in.

  • BLT <
  • BLE <=
  • BGT >
  • BGE >=

Adding a U to the end of any of the above makes the comparison unsigned. Remember, in assembly there are no signed/unsigned numbers, only signed/unsigned comparisons!

BGEU $t0,$t1,label ;branch if $t0 >= $t1, treating both as unsigned.
NOP
BLT $t7,$t3,label ;branch if $t7 < $t3, treating both as signed
NOP

Like most assembly languages, the label operand of a branch instruction is a hardware abstraction that allows you to more easily tell the assembler where you want the branch to go without having to figure it out yourself. In reality, the actual operand that the label represents is not an absolute address, but a calculated signed offset that is added to the program counter. Therefore there is a limit on how far away you can branch. Given that MIPS is a 32-bit CPU at a minimum, the maximum distance is very generous and you're extremely unlikely to ever need to branch further than it allows.

Switch

As usual, the easiest way to implement switch is with a lookup table, be it a table of function pointers or just a simple array. The example below is a bit abstract but you should get the idea.

switchExample:
;this implementation assumes that all destinations end in jr ra, so you'll need to arrive here with JAL switchExample.
;$t0 = index (must be a multiple of 4 or the program counter will jump to a location that's not guaranteed to properly return.)
la cases,$t1
addiu $t1,$t0 ;MIPS can't do variable indexed offsetting so we have to add the offset ourselves.
lw $t8,($t1)  ;dereference the pointer, $t8 contains the address we wish to "call"
nop
jr $t8       ;jump to the selected destination. 
nop

cases:
.word foo
.word bar
.word baz

foo:
;code goes here
jr ra

bar:
;code goes here
jr ra

baz:
;code goes here
jr ra

If you're going to do this for real, you'll want some sort of bounds check on the index. That way, if the cases are out of bounds you can conditionally change the index to the address of your default case.

МК-61/52

Conditional jumps are done by four instructions, comparing the register X with zero:

x=0	XX
x#0	XX
x>=0	XX
x<0	XX

XX here is the address to which to make the jump in the event of failure of this condition (for this reason, these instructions are also called checks).

Modula-2

if-then-else

IF i = 1 THEN
  InOut.WriteString('One')
ELSIF i = 2 THEN
  InOut.WriteString('Two')
ELSIF i = 3 THEN
  InOut.WriteString('Three')
ELSE
  InOut.WriteString('Other')
END;

Case

CASE i OF
  1 : InOut.WriteString('One')
| 2 : InOut.WriteString('Two')
| 3 : InOut.WriteString('Three')
ELSE
  InOut.WriteString('Other')
END

Modula-3

if-then-else

IF Foo = TRUE THEN
  Bar();
ELSE
  Baz();
END;
IF Foo = "foo" THEN
  Bar();
ELSIF Foo = "bar" THEN
  Baz();
ELSIF Foo = "foobar" THEN
  Quux();
ELSE
  Zeepf();
END;

Case

CASE Foo OF
| 1 => IO.Put("One\n");
| 2 => IO.Put("Two\n");
| 3 => IO.Put("Three\n");
ELSE
  IO.Put("Something\n");
END;

Type-case

TYPECASE is used on reference types to perform different operations, depending on what it is a reference to.

TYPECASE ref OF
| NULL => IO.Put("Null\n");
| CHAR => IO.Put("Char\n");
| INTEGER => IO.Put("Integer\n");
ELSE
  IO.Put("Something\n");
END;

Monicelli

Monicelli has a single conditional structure that covers both if/then/else and switch/case

che cosè var?    # switch var
   minore di 0:  # case var < 0
     ...
   maggiore di 0: # case var > 0
     ...
   o tarapia tapioco: # else (none of the previous cases)
     ...
e velocità di esecuzione

Morfa

if-then-else

if(s == "Hello World")
{
    foo();
}
else if(s == "Bye World")
    bar();
else
{
    baz();
}

Morfa supports short-circuit evaluation, so obj.foo() won't be executed if obj is null:

if(obj isnt null and obj.foo())
   doSomething();

ternary

var t = if(s == "Hello World") foo() else bar();

switch

There is no fallthrough, break statement does not have any special meaning inside a switch. If the break is in a loop then break exits that loop, otherwise it is invalid.

switch (num)
    {
        case (0) 
            { /* empty case requires braces */ }
        case (1) 
            { var one = "one"; result = one; }
        case (2,3) // case may contain a nonempty list of values
            result = "a few"; 
        default  
            result = "a lot";
    }

MUMPS

If / I and ELSE / E

 IF A list-of-MUMPS-commands

All standard versions of MUMPS allow a ELSE command, which can be abbreviated to E. Instead of depending on the previous IF command, the ELSE command depends on the value of the system variable $TEST. $TEST is set whenever an IF command is executed, and whenever a timeout is specified. Since $TEST could be changed and not noticed by an unwary programmer it is important to remember when writing code. For example with the code:

 IF T DO SUBROUTINE
 ELSE DO SOMETHING

It isn't clear whether $TEST is changed or not, because the function SUBROUTINE might change the value of $TEST by using a timeout or an IF command.

It is better to explicitly set the $TEST special variable using IF 1 for example:

 IF T DO SUBROUTINE IF 1
 ELSE DO SOMETHING

Another common practice is to use the argumentless DO, as it pushes the $TEST variable onto a stack and replaces it after the "dot block" is complete. An example of this code is:

 IF T DO
 . DO SUBROUTINE
 ELSE DO SOMETHING


$Select / $S

 WRITE $SELECT(1=2:"Unequal",1=3:"More unequal",1:"Who cares?")

The $Select statement contains couplets separated by commas, which each consist of a conditional test, followed by a colon, and what to return if that condition is true. The first part of the couplet must be a truth value. Since only zero is interpreted a truth value of false, any nonzero numbers when interpreted as a truth value will be considered to be true. Typically the number 1 is used as an explicitly true condition and is placed in the final couplet. If no conditions are true, the program's error processing is invoked. The very first condition that is true is the result of the expression. In the example, the value will always be "Unequal" as it is always true, and the rest of the $SELECT will never be used.

(command postconditional i.e. colon/:

 SET:(1=1) SKY="Blue"
 GOTO:ReallyGo LABEL
 QUIT:LoopDone
 WRITE:NotLastInSet ","

Most commands can take a "postconditional", which is a colon and some conditional statement immediately after the command followed by the command separator (space) and the usual arguments of the command. The command is executed only if the conditional statement evaluates to true.

The exceptions are FOR, IF, and ELSE. There are several commands that also allow for post-conditionals in their arguments. The GOTO, and DO commands must have a label but it optionally have a colon followed by a truth value. When the truth value is interpreted as false, the flow of control does NOT move to the label indicated. If it is true, then flow of control does move to the label. Similarly, the XECUTE command may have a colon and postcondition on its argument, which is a expression that is interpreted as a line of MUMPS code. That code is executed when the postcondition is true, and not executed when it is false. Some people consider timeouts to be a form of conditional. For example in the READ command, a number (or numeric expression) after a colon is the number of seconds to wait for a user to make an entry. If the user doesn't make an entry before the timeout, the special variable $TEST is set to 0 (zero), indicating a timeout has occurred. Likewise in the JOB command, a number (or numeric expression) after a colon is the number of seconds to wait for the system to start a new job running in "parallel" to the current job. If the system does not create a new job before the timeout, the special variable $TEST is set to 0 (zero), indicating a timeout has occurred.

Nanoquery

if-then-else

if x = 0
    foo()
else if x = 1
    bar()
else if x = 2
    baz()
else
    boz()
end

Nemerle

if-else

if (cond) <then> else <this>; is an expression in Nemerle, requiring both keywords (if and else) to be valid. when and unless are macros for which <this> = null. cond must be an expression that evaluates to a bool (true|false), other types aren't automatically assigned truth or falsehood as in some languages.

if (the_answer == 42) FindQuestion() else Foo();
when (stock.price < buy_order) stock.Buy();
unless (text < "") Write(text);

match

Much cleaner than stacked if-else's, similar in some ways to switch-case (but more flexible). See here, here, or, for extra detail, the reference.

match(x)
{
    |1 => "x is one"
    |x when (x < 5) => "x is less than five"
    |_ => "x is at least five"
}

NetRexx

IF-THEN-ELSE

-- simple construct
if logicalCondition then conditionWasTrue()
                    else conditionWasFalse()

-- multi-line is ok too
if logicalCondition
then
  conditionWasTrue()
else
  conditionWasFalse()

-- using block stuctures
if logicalCondition then do
  conditionWasTrue()
  ...
  end
else do
  conditionWasFalse()
  ...
  end

-- if/else if...
if logicalCondition1 then do
  condition1WasTrue()
  ...
  end
else if logicalCondition2 then do
  condition2WasTrue()
  ...
  end
else do
  conditionsWereFalse()
  ...
  end

SELECT

Notes: SELECT can be thought of as a better IF-THEN-ELSE construct.

Block structures (DO-END) can be used here too (see IF-THEN-ELSE).

OTHERWISE is optional but may result in run-time errors (netrexx.lang.NoOtherwiseException) if it isn't provided.

-- simple construct
select
  when logicalCondition1 then condition1()
  when logicalCondition2 then condition2()
  otherwise                   conditionDefault()
  end

-- set up a catch block to intercept missing OTHERWISE clause
do
  select
    when logicalCondition1 then condition1()
    when logicalCondition2 then condition2()
    end
catch ex1 = NoOtherwiseException
  ex1.printStackTrace()
end

SELECT-CASE

-- simple construct
select case cc
  when 'A' then say 'the case is A'
  when 'B' then say 'the case is B'
  otherwise     say 'selection not recognized'
  end

Note: This is functionally equivalent to:

select
  when cc == 'A' then ...
  when cc == 'B' then ...
  ...

SELECT Optional Features

SELECT has optional features (CATCH & FINALLY) and options (LABEL, PROTECT & CASE)

CATCH and FINALLY are used for handling exceptions thrown from inside the select group.

CASE see SELECT-CASE above.

LABEL provides a target for any LEAVE instructions and can aid in code self-documentation.

PROTECT is used for program concurrency & synchonization in multi-threaded programs.

select label sl protect cc case cc
  when 'A' then do
    say 'the case is A'
    if logicalCondition then leave sl -- just to use the lable
    say '...'
    end
  when 'B' then do
    say 'the case is B'
    say '...'
    end
  otherwise
    say 'selection not recognized'
    say '...'
  catch exs = RuntimeException
    say 'Gronk!'
    exs.printStackTrace()
  finally
    say 'selection done'
    say 'TTFN'
  end sl

newLISP

if

Interpreter: newLISP v.9.0

(set 'x 1)
(if (= x 1) (println "is 1"))

A third expression can be used as an else.

(set 'x 0)
(if (= x 1) (println "is 1") (println "not 1"))

Nim

if-then-else

if x == 0:
  foo()
elif x == 1:
  bar()
elif x == 2:
  baz()
else:
  boz()

case-of

case x
of 0:
  foo()
of 2,5,9:
  baz()
of 10..20, 40..50:
  baz()
else: # All cases must be covered
  boz()

Objeck

if-else

a := GetValue();
if(a < 5) {
  "less than 5"->PrintLine();
}
else if(a > 5) {
  "greater than 5"->PrintLine();
}
else {
  "equal to 5"->PrintLine();
};

select

a := GetValue();
select(a) {
  label 5: {
    "equal to 5"->PrintLine();
  }

  label 7: {
    "equal to 7"->PrintLine();
  }

  other: {
    "another value"->PrintLine();
  }
};

Object Pascal

See Pascal

Objective-C

See also C

One difference: the preprocessor has been extended with an #import directive which does the same thing as #include with "include guards".

OCaml

if-then-else

let condition = true

if condition then
  1 (* evaluate something *)
else
  2 (* evaluate something *)

If-then-else has higher precedence than ; (the semicolon), so if you want to have multiple statements with side effects inside an "if", you have to enclose it with begin...end or with parentheses:

if condition then begin
  (); (* evaluate things for side effects *)
  5
end
else begin
  (); (* evaluate things for side effects *)
  42
end

match-with

match expression with
| 0 -> () (* evaluate something *)
| 1 -> () (* evaluate something *)
| n when n mod 2 = 0 -> () (* evaluate something *)
| _ -> () (* evaluate something *)

The first | is optional, and usually omitted.

Match is especially useful for Pattern Matching on various types of data structures.

Nested match's need to be surrounded by begin-end or parentheses, or else it won't know where it ends.

Octave

if-then-elseif-else

if (condition)
  % body
endif

if (condition)
  % body
else
  % otherwise body
endif

if (condition1)
  % body
elseif (condition2)
  % body 2
else
  % otherwise body
endif

switch

switch( expression )
  case label1
     % code for label1
  case label2
     % code for label2
  otherwise
     % none of the previous
endswitch

Labels can be numeric or string, or cells to group several possibilities:

switch ( x )
  case 1
    disp("it is 1");
  case { 5,6,7 }
    disp("it is 5, or 6 or 7");
  otherwise
    disp("unknown!");
endswitch

Oforth

Conditional structures are :

aBoolean ifTrue: [ ...]
aBoolean ifFalse: [ ... ]
aObject  ifNull: [ ... ]
aObject  ifNotNull: [ ... ]
aObject  ifZero: [ ... ]

Each conditional structure consume the object on the top of the stack.

Each conditional structure can be followed by a else block

else: [ ... ]

Example :

Number virtual: sgn
    self isPositive
       ifTrue: [ self ==0 ifTrue: [ 0 ] else: [ 1 ] ]
       else: [ -1 ] ;

Ol

if-then, the simplest conditional `if` primitive.

(if (= (* 2 2) 4)
   (print "if-then: equal"))
(if (= (* 2 2) 6)
   (print "if-then: should not be printed"))
; ==> if-then: equal

if-then-else, the full conditional `if` primitive.

(if (= (* 2 2) 4)
   (print "if-then-else: equal")
   (print "if-then-else: non equal"))
; ==> if-then-else: equal

(if (= (* 2 2) 6)
   (print "if-then-else: equal")
   (print "if-then-else: non equal"))
; ==> if-then-else: non equal

when and unless, the simplification of `if` without `begin`

(when (= (* 2 2) 4)
   (print "when: ..just do something..")
   (print "when: equal"))
; ==> when: ..just do something..
; ==> when: equal

(unless (= (* 2 2) 6)
   (print "unless: ..just do something..")
   (print "unless: not equal"))
; ==> unless: ..just do something..
; ==> unless: not equal

if-then-else, extended conditional `if` primitive.

(if (= (* 2 2) 4)
   (print "if-then-else*: equal")
else
   (print "if-then-else*: ..just do something..")
   (print "if-then-else*: non equal"))
; ==> if-then-else*: equal

(if (= (* 2 2) 4)
then
   (print "if-then-else*: ..just do something..")
   (print "if-then-else*: equal")
else
   (print "if-then-else*: ..just do something..")
   (print "if-then-else*: non equal"))
; ==> if-then-else*: ..just do something..
; ==> if-then-else*: equal

(if (= (* 2 2) 4) ; same as `when`
then
   (print "if-then-else*: ..just do something..")
   (print "if-then-else*: equal"))
; ==> if-then-else*: ..just do something..
; ==> if-then-else*: equal

case, the sequence of comparing values.

(case (* 2 2)
   (3 ; exact number
      (print "case: 3"))
   (4 ; exact number
      (print "case: 4"))
   ((5 6 7) ; list of numbers
      (print "case: 5 or 6 or 7"))
   (else
      (print "case: i don't know")))
; ==> case: 4

; extended case with usable else
(case (* 2 2)
   (3 ; exact number
      (print "case: 3"))
   (else => (lambda (num)
      (print "case: real value is " num))))
; ==> case: real value is 4

(case (* 2 2)
   (3 ; exact number
      (print "case: 3"))
   (else is num
      (print "case: real value is " num)))
; ==> case: real value is 4

; extended case with vectors
(case ['selector 1 2 3]
   (['case1 x y]
      (print "case: case1 " x ", " y))
   (['selector x y z]
      (print "case: selector " x ", " y ", " z))
   (else
      (print "case: i don't know")))
; ==> case: selector 1, 2, 3

cond, the sequnce of comparators.

(cond
   ((= (* 2 2) 4)
      (print "cond: equal"))
   ((= (* 2 2) 6)
      (print "cond: not equal"))
   (else
      (print "cond: i don't know")))
; ==> cond: equal

case-lambda, selecting the lambda based on arguments count.

(define smart (case-lambda
   ((x)
      (print x ", -, -"))
   ((x y)
      (print x ", " y ", -"))
   ((x y z)
      (print x ", " y ", " z))))
(smart 1)     ; ==> 1, -, -
(smart 1 2)   ; ==> 1, 2, -
(smart 1 2 3) ; ==> 1, 2, 3

ooRexx

For all of the conditional instructions, the conditional expression must evaluate either to '1' or '0'. Note that ooRexx conditional expression evaluation does not have a short circuiting mechanism. Where the logical operations | (or), & (and), or && (exclusive or) are used, all parts of the expression are evaluated. The conditional may also be a list of conditional expressions separated by commas. The expressions are evaluated left-to-right, and evaluation will stop with the first '0' result. For example,

if arg~isa(.string) & arg~left(1) == "*" then call processArg arg

would fail with a syntax error if the variable arg does not hold a string because the right-hand-side of the expression is still evaluated. This can be coded as

if arg~isa(.string), arg~left(1) == "*" then call processArg arg

With this form, the second conditional expression is only evaluated if the first expression is true.

IF THEN --- IF THEN/ELSE

if  y  then x=6                        /* Y must be either   0   or   1 */


if t**2>u then x=y
          else x=-y



if t**2>u then do j=1 to 10; say prime(j); end
          else x=-y



if z>w+4 then do
              z=abs(z)
              say 'z='z
              end
         else do;  z=0;  say 'failed.';  end



if x>y & c*d<sqrt(pz) |,
   substr(abc,4,1)=='@' then if z=0 then call punt
                                    else nop
                        else if z<0 then z=-y

SELECT WHEN

                     /*the  WHEN  conditional operators are the same as */
                     /*the   IF   conditional operators.                */

  select
  when t<0       then z=abs(u)
  when t=0 & y=0 then z=0
  when t>0       then do
                      y=sqrt(z)
                      z=u**2
                      end

                /*if control reaches this point  and  none of the WHENs */
                /*were satisfiied, a SYNTAX condition is raised (error).*/
  end

SELECT WHEN/OTHERWISE

     select
     when a=='angel'              then many='host'
     when a=='ass' | a=='donkey'  then many='pace'
     when a=='crocodile'          then many='bask'
     when a=='crow'               then many='murder'
     when a=='lark'               then many='ascension'
     when a=='quail'              then many='bevy'
     when a=='wolf'               then many='pack'
     otherwise  say
                say '*** error! ***'
                say a "isn't one of the known thingys."
                say
                exit 13
     end

OxygenBasic

if a then b=c else b=d

if a=0
  b=c
elseif a<0
  b=d
else
  b=e
end if

select case a
  case 'A'
  v=21
case 'B'
  v=22
case 1 to 64
  v=a+300
case else
  v=0
end select

Oz

if-then-else

proc {PrintParity X}
   if {IsEven X} then
      {Show even}
   elseif {IsOdd X} then
      {Show odd}
   else
      {Show 'should not happen'}
   end
end

if-then-else as a ternary operator

fun {Max X Y}
   if X > Y then X else Y end
end

case statement

fun {Fac X}
   case X of 0 then 1
   [] _ then X * {Fac X-1}
   end
end

PARI/GP

GP uses a simple if statement:

if(condition, do_if_true, do_if_false)

and short-circuit && and || (which can be abbreviated & and | if desired).

PARI can use all of the usual C conditionals.

Pascal

if-then-else

IF condition1 THEN
  procedure1
ELSE
  procedure3;

IF condition1 THEN
  BEGIN
    procedure1;
    procedure2
  END
ELSE
  procedure3;

IF condition1 THEN
  BEGIN
    procedure1;
    procedure2
  END
ELSE
  BEGIN
    procedure3;
    procedure4
  END;

case

Works with: Turbo Pascal version 7.0

Case selectors must be an ordinal type. This might seem to be a restriction, but with a little thought just about anything can be resolved to an ordinal type. Additionally, each selector may consist of more then one item. The optional ELSE keyword provides a default for values that do not match any of the given cases.

In Pascal there is no fall-through to the next case. When execution reaches the end of a matching clause, it continues after the end of the case statement, not in the code for the next case.

case i of
  1,4,9: { executed if i is 1, 4 or 9 }
    DoSomething;
  11, 13 .. 17: { executed if i is 11, 13, 14, 15, 16 or 17 }
    DoSomethingElse;
  42: { executed only if i is 42 }
    DoSomeOtherThing;
  else
    DoYetAnotherThing;
end;

Given the variable "X" as a char the following is valid:

Case X of
   'A'           : statement ;
   'B'           : statement ;
   in ['C'..'W'] : statement ;
else
   Statement ;
end;

Perl

Works with: Perl version 5

if/else

if ($expression) {
    do_something;
}
# postfix conditional
do_something if $expression;
if ($expression) {
    do_something;
}
else {
    do_fallback;
}
if ($expression1) {
    do_something;
}
elsif ($expression2) {
    do_something_different;
}
else {
    do_fallback;
}

unless

unless behaves like if, only logically negated.

You can use it wherever you can use if. An unless block can have elsif and else blocks, but there is no elsunless.

ternary operator

The ternary operator is used as an expression within a statement, rather than as a control flow structure containing one or more statements. It is frequently used in assignment, or sometimes for passing function call arguments that vary depending on some condition.

$variable = $expression ? $value_for_true : $value_for_false;

logical operators

$condition and do_something;  # equivalent to  $condition ? do_something : $condition
$condition or do_something;  # equivalent to  $condition ? $condition : do_something

&& and || have the same semantics as and and or, respectively, but their precedence is much higher, making them better for conditional expressions than control flow.

switch

At first there was no switch structure in Perl, although there were plenty ways to emulate it. In Perl 5.8, an experimental switch/case/else structure was introduced. Perl 5.10 replaced this with the given/when/default structure borrowed from Raku.

Works with: Perl version 5.10
use feature "switch";
given ($input) {
    when (0)          { print 'input == 0'; }
    when ('coffee')   { print 'input equal coffee'; }
    when ([1..9])     { print 'input between 1 and 9'; }
    when (/rats/)     { print 'input matches rats'; }
    default           { do_fallback; }
}

Phix

Library: Phix/basics

if

with javascript_semantics
if name="Pete" then
  -- do something
elsif age>50 then
  -- do something
elsif age<20 then
  -- do something
else
  -- do something
end if

There is no limit to the number of elsif clauses, including 0. The else clause is also optional, whereas the end if is always mandatory, which avoids any dangling else problems. All conditional expressions are short-circuited.

iff

somevar = iff(flag?true_expr:false_expr)

In an iff() expression, only one of true_expr or false_expr will be evaluated, not both.

Phix has some rudimentary support of preprocessor ifdef statements, but their use is discouraged since they are quite unnecessary in Phix, for example in the following no code whatsoever is emitted for the first if statement, and in the second the conditions are evaluated at compile-time and code is only emitted for one of the branches.

constant DEBUG=false
if DEBUG then
    puts(1,"debug is on\n")
end if
if platform()=WINDOWS then
    puts(1,"this is windows\n")
elsif platform()=LINUX then
    puts(1,"this is linux\n")
end if

switch

switch v /*with fallthrough*/ do
    case 1,2:
      -- do something
    case 3 then
      -- do something
      fallthrough
    case 4:
      -- do something
      break
    default:
      -- do something
end switch

By default there is no fallthough on switch clauses, however you can add(/uncomment) a directive, and you can override individual clauses with explicit fallthough or break statements. There is no need to have break between cases when it is the default. You can use either : or then on case clauses. The else keyword can be used instead of "default", and behaves identically. It can also be placed anywhere, even first, or completely omitted.

The compiler will automatically construct either a jump table or daisy-chained cmp/jmp chains from either if-constructs or switch-statements, leaving the programmer free to choose whichever shows the intent clearest, without having to worry about performance implications.

ilASM

Inline assembly, in the form of #ilASM{} constructs, should you be brave or desperate enough to use them, also have some conditional guards for cross-platform support

without js -- (but maybe, at some point, and obviously that is as custom verbatim JavaScript code instead of assembly code)
#ilASM{
    [32]
        mov eax,[var]
    [64]
        mov rax,[var]
    [PE32]
        push eax                        -- uExitCode
        call "kernel32.dll","ExitProcess"
    [PE64]
        mov rcx,rax                     -- uExitCode
        call "kernel32.dll","ExitProcess"
    [ELF32]
        mov ebx,eax                     -- error_code (p1)
        mov eax,1                       -- sys_exit(ebx=int error_code)
        int 0x80
--      xor ebx,ebx                     -- (common requirement after int 0x80)
    [ELF64]
        mov rdi,rax                     -- error_code (p1)
        mov rax,60                      -- sys_exit(rdi=int error_code)
        syscall
    []
      }

PHL

If-else:

var a = 5;
if (a == 5) {
   doSomething();
} else if (a > 0) {
   doSomethingElse();
} else {
   error();
}

PHP

if

Interpreter: PHP 3.x, 4.x, 5.x

<?php

$foo = 3;

if ($foo == 2)
  //do something

if ($foo == 3)
  //do something
else
  //do something else

if ($foo != 0)
{
  //do something
}
else
{
  //do another thing
}

?>

switch

Interpreter: PHP 3.x & 4.x & 5.x

<?php

switch ($i)
{
  case "apple":
      echo "i is apple";
      break;

  case "bar":
      echo "i is bar";
      break;

  case "cake":
      echo "i is cake";
      break;
}

?>

See Also

Picat

Picat is a multi-paradigm language (based on Prolog) and has some different conditional structures:

  • "direct" testing: The program will not continue if not satisfied.
  • if/then/elseif/else/end: Traditional if/then/else construct.
  • (condition -> then-part ; else-part): From Prolog.
  • Ret = cond(condition,then-part,else-part): Function which returns the appropriate value.
  • As a predicate: From Prolog.
  • As condition in a function's head.

Here are examples of each of these constructs.

go =>
  N = 10,

  % "direct" test that will fail if not satisfied
  N < 14,

  % if/then/elseif/else
  if N < 14 then
    println("less than 14")
  elseif N == 14 then
    println("is 14")
  else
    println("not less than 14")
  end,

  % From Prolog: (condition -> then ; else)
  ( N < 14 ->
   println("less than 14")
   ;
   println("not less than 14")
  ),

  % Ret = cond(condition, then, else)
  println(cond(N < 14, "less than 14", "not less than 14")),

  % as a predicate
  test_pred(N),

  % as condition in a function's head
  println(test_func(N)),

  println(ok), % all tests are ok
  
  nl.

% as a predicate
test_pred(N) ?=>
  N < 14,
  println("less than 14").
test_pred(N) =>
  N >= 14,
  println("not less than 14").
  
% condition in function head
test_func(N) = "less than 14", N < 14 => true.
test_func(_N) = "not less than 14" => true.
Output:
less than 14
less than 14
less than 14
less than 14
less than 14
ok

PicoLisp

Two-way conditions

(if (condition)                  # If the condition evaluates to non-NIL
   (then-do-this)                # Then execute the following expression
   (else-do-that)                # Else execute all other expressions
   (and-more) )

(ifn (condition)                 # If the condition evaluates to NIL
   (then-do-this)                # Then execute the following expression
   (else-do-that)                # Else execute all other expressions
   (and-more) )

One-way conditions

(when (condition)                # If the condition evaluates to non-NIL
   (then-do-this)                # Then execute tall following expressions
   (and-more) )

(unless (condition)              # If the condition evaluates to NIL
   (then-do-this)                # Then execute all following expressions
   (and-more) )

Four-way condition

(if2 (condition1) (condition2)   # If both conditions evaluate to non-NIL
   (expression-both)             # Then execute this expression
   (expression-first)            # Otherwise this for the first
   (expression-second)           # or this the second condition.
   (expression-none)             # If both are NIL, all following expressions
   (and-more) )

Multiple conditions

(cond
   ((condition1)                 # If this condition evaluates to non-NIL
      (expression 1)             # Execute these expression(s)
      (more 1) )
   ((condition2)                 # Otherwise, if this evaluates to non-NIL
      (expression 2)             # Execute these expression(s)
      (more 2) )
   (T                            # If none evaluated to non-NIL
      (expression 1)             # Execute these expression(s)
      (more 1) )

(nond
   ((condition1)                 # If this condition evaluates to NIL
      (expression 1)             # Execute these expression(s)
      (more 1) )
   ((condition2)                 # Otherwise, if this evaluates to NIL
      (expression 2)             # Execute these expression(s)
      (more 2) )
   (NIL                          # If none evaluated to NIL
      (expression 1)             # Execute these expression(s)
      (more 1) )

Selection

(case (expression)               # Evaluate the expression
   (value1                       # If it is equal to, or member of, 'value1'
      (do-this1)                 # Execute these expression(s)
      (do-that1) )
   (value2                       # Else if it is equal to, or member of, 'value2
      (do-this2)                 # Execute these expression(s)
      (do-that2) )
   (T                            # Else execute final expression(s)
      (do-something-else) ) )

PL/I

if-then-else

if condition_exp then unique_statement; else unique_statement;

if condition_exp then
    unique_statement;
else
    unique_statement;

if condition_exp 
then do;
    list_of_statements;
end;
else do;
    list_of_statements;
end;

So a cascading form can be derived from:

if condition_exp1 then
    statement_1;
else if condition_exp2 then
    statement_2;
else if condition_expN then
    statement_N;
else
    statement_E;

if condition_exp1 then do;
    list_of_statements;
end;
else if condition_exp2 then do;
    list_of_statements;
end;
else if condition_expN then do;
    list_of_statements;
end;
else do;
    list_of_statements;
end;

case

The PL/I 'case' statement has two possible formats:

select - format 1

select (i); /* select on value of variable */
  when (1,4,9)
    do;
      statement_s;
    end;

  when (11, 42)
    do;
      statement_s;
    end;

  other /* everything else */
    do;
      statement_s;
    end;
end;

select - format 2

select; /* select first matching condition */
  when (i = 4)
    do;
      statement_s;
    end;

  when (this = that)
    do;
      statement_s;
    end;

  when (mystring = 'ABCDE')
    do;
      statement_s;
    end;

  other
    do;
      statement_s;
    end;
end;

Notes:

  • in PL/I there is no fall-through to the next when. When execution reaches the end of a matching clause, it continues after the end of the select statement, not in the code for the next case.
  • the do ... end statements can be omitted if the when clause is a single statement.
  • if no other (or in full: otherwise) statement is present and none of the when cases is matched, the program will end in error.

PL/M

IF-THEN-ELSE:

/* IF-THEN-ELSE - THE ELSE STATEMENT; PART IS OPTIONAL */
IF COND THEN STATEMENT1; ELSE STATEMENT2;

/* CAN BE CHAINED - THE ELSE STATEMENTX; PART IS STILL OPTIONAL */
IF      COND1 THEN STATEMENT1;
ELSE IF CONB2 THEN STATEMENT2;
ELSE IF CONB3 THEN STATEMENT3;
ELSE               STATEMENTX;

DO-CASE:

/* CASE STATEMENT - EXECUTES STATEMENT0, STATEMENT1, ETC. */
/* DEPENDING ON WHETHER EXPR EVALUATES TO 0, 1, ... */
/* EXPR MUST BE IN RANGE OR THE PROGRAM WILL JUMP TO HYPERSPACE */
DO CASE EXPR;
    STATEMENT0;
    STATEMENT1;
    ...
END;

Plain English

Plain English only has one kind of conditional, called a "conditional".

If [a decider], [do something]; [do another thing].

The first parameter is a decider that returns yes or no. If the result was yes, all the other statements on the same line as the conditional will execute. Otherwise, execution continues immediately to the next line.

If the decider uses a negative word, the negative word is removed, the decider is done normally, and the result is reversed.

Conditionals may not go beyond 1 SLOC. Conditionals cannot be nested.

Pop11

The simplest conditional is:

if condition then
    ;;; Action
endif;

Two way conditional looks like:

if condition then
    ;;; Action1
else
    ;;; Alternative action
endif;

One can do multiway choice using elseif clause

if condition1 then
   ;;; Action1
elseif condition2 then
   ;;; Action1
elseif condition2 then
   ;;; Action2
elseif condition3 then
   ;;; Action3
else
   ;;; Alternative action
endif;

Instead of if keyword one can use unless keyword.

unless condition then /* Action */ endunless;

has the same meaning as

if not(condition) then /* Action */ endif;

One can also use elseunless keword.

if condition1 then
   ;;; Action1
elseunless condition2 then
   ;;; Action2
endif;
   ;;; Action2
endif;

has the same meaning as

if condition1 then
   ;;; Action1
elseif not(condition2) then
   ;;; Action2
endif;

Note that conditional must end in matching keyword, if must be finished by endif, unless must be finished by endunless (in the middle one can mix elseif with elseunless.

Pop11 conditional is an expression:

if x > 0 then 1 elseif x < 0 then -1 else 0 endif -> sign_x ;

assigns sign of x to sign_x.

Instead of multiway if one can use switchon construct (which is equivalent to a special case of if, but may be shorter).

switchon(x)
    case .isstring  then printf('A1');
    notcase .isinteger then printf('A2');
    case = 2 orcase = 3 then printf('A3');
    case > 4 andcase < 15 then printf('A4');
    else printf('A5');
endswitchon;

There is also multiway goto statement and conditional control transfers, we explain them together with other control transfers and loops (in case of loop exit/continue statements).

Pop11 also has preprocessor allowing conditional compilation:

#_IF condition1
/* Variant 1 */
#_ELSEIF condition2
/* Variant 2 */
#_ELSE
/* Variant 3 */
#_ENDIF

condition1 and condition2 are arbitrary Pop11 expressions (they have access to all previously compiled code).

Also note that Pop11 syntax is user extensible, so users may create their own conditional constructs.

PostScript

The "if" operator uses two items form the stack, a procedure and a boolean. It will execute the procedure if the boolean is true. It will not leave anything on the stack (but the procedure might):

9 10 lt {(9 is less than 10) show} if

The "ifelse" operator expects two procedures and executes the one or the other depending on the value of the boolean. I.e. this:

/a 5 lt {(yeah)} {(nope)} ifelse show

will render either the string "yeah" or "nope" depending on whether a is less than 5 or not.

PowerShell

If, ElseIf, Else

# standard if
if (condition) {
    # ...
}

# if-then-else
if (condition) {
    # ...
} else {
    # ...
}

# if-then-elseif-else
if (condition) {
    # ...
} elseif (condition2) {
    # ...
} else {
    # ...
}

Switch

# standard switch
switch ($var) {
    1 { "Value was 1" }
    2 { "Value was 2" }
    default { "Value was something else" }
}

# switch with wildcard matching
switch -Wildcard ($var) {
    "a*" { "Started with a" }
    "*x" { "Ended with x" }
}

# switch with regular expression matching
switch -Regex ($var) {
    "[aeiou]" { "Contained a consonant" }
    "(.)\1" { "Contained a character twice in a row" }
}

# switch allows for scriptblocks too
switch ($var) {
    { $_ % 2 -eq 0 } { "Number was even" }
    { $_ -gt 100 }   { "Number was greater than 100" }
}

# switch allows for handling a file
switch -Regex -File somefile.txt {
    "\d+" { "Line started with a number" }
    "\s+" { "Line started with whitespace" }
}

Prolog

A "pure" Prolog program by its very nature is one very long, very complicated boolean test. Absolutely every executable portion of Prolog is a test that succeeds or fails. Here are some examples, thus, of using conditionals in Prolog:

go :- write('Hello, World!'), nl.

While operationally this looks like a program that when go/0 is executed will print "Hello, World!" and exit, it is actually a predicate, in the strict logical sense of the term, that tests conditions. Denotationally we'd describe it as "go/0 succeeds iff write/1 succeeds with its passed-in argument, and if nl/0 subsequently succeeds." (The fact that write/1 and nl/0 **always** succeed and that we use them for their side effects only doesn't matter to the Prolog view of a program.)

fact(foo).
fact(bar).
fact(baz).

go :- fact(booger).
go :- fact(bar).

This example shows a few features of Prolog's testing and, specifically, shows nondeterminism and backtracking in action. In this we have a predicate fact/1 (so named because in this format, without an executable body, it is termed a "fact" in the literature). It has two clauses asserting both "bar" and "baz" as facts. go/0 also has two clauses. If we execute go/0, the runtime will tell us "true" (or, in some implementations, "yes") to indicate that the predicate call was successful. Denotationally we would say "fact(X) succeeds iff X unifies with foo, X unifies with bar, or X unifies with baz". We would also say "go/0 succeeds iff fact(booger) succeeds or if fact(bar) succeeds". When running, the first clause of go/0 will be executed and fact(booger) will be tested. fact(booger) does not match fact(bar) nor does it match fact(baz) so it fails. This leads the runtime to go back and try again with the **second** go/0 clause. In this one fact(bar) does, in fact, match fact(bar), so the overall test passes. A Prolog program is, thus, a very complicated tree of if/then statements, in effect.

fact(X) :-
    (   X = foo
    ;   X = bar
    ;   X = baz ).

go :-
    (   fact(booger)
    ;   fact(bar) ).

This version is semantically the same as the previous one. (In actual execution, because of some runtime optimizations, there are some minor differences in outcome, but nothing that would change the logical interpretation of the program.) Here we're showing more explicitly the various "or" conditions. In Prolog "," is roughly equivalent to "and" (conjunction) while ";" is roughly equivalent to "or" (disjunction). Because of this, and because of the fact we've taken separate clauses now and put them into explicit disjunctions it is clearer that we're performing a series of if/then tests in effect.

That being said, Prolog does have something that's very akin to real if/then statements (or, more accurately, similar to the ternary operator of languages like C):

fact(X) :-
    (   X = bar ->  write('You got me!'), nl
    ;               write(X), write(' is not right!'), nl, fail ).

go :-
    (   fact(booger)
    ;   fact(bar) ).

In this version of fact/1, the -> operator is used to perform a more traditional if/then/else. The general construct is ( condition -> succeed_branch ; fail_branch ). In this case if the parameter passed in unifies with 'bar', a message is written (recall that write/1 and nl/0 always succeed!) and the whole predicate exists with a success. If, on the other hand, the unification fails (you pass anything other than 'bar') it writes a snarky message and then calls fail/0, a predicate that, as its name suggests, always fails. There are more implications to using the conditional expression in Prolog; it is generally considered code smell. Other operators also exist for handling conditionals (like *->) that lack the "smell" of the conditional operator. The reasons for this are out of scope, however, for this article. Just know that the fact/1 predicate could have used *-> in place of -> and been more "sound" as a result.

PureBasic

Works with: PureBasic version 4.41

If, Elseif, Else

If a = 0
  Debug "a = 0"

ElseIf a > 0
  Debug "a > 0"

Else
  Debug "a < 0"

EndIf

Select

Variable = 2

Select Variable
  Case 0
    Debug "Variable = 0"

  Case 10, 11, 99
    Debug "Variable is 10, 11 or 99"

  Case 20 To 30
    Debug "Variable >= 20 And Variable <= 30"

  Default
    Debug "Variable = something else..."
EndSelect

CompilerIf

Compiler conditional structures works like normal conditional structures, except they are evaluated at compile time, and thus have to use constant expressions. Any defined constant can be used, these examples uses built-in constants.

CompilerIf #PB_Compiler_OS = #PB_OS_Linux And #PB_Compiler_Processor = #PB_Processor_x86
  Debug "Compiled on x86 Linux"
CompilerElse
  Debug "Compiled on something else"
CompilerEndIf

CompilerSelect

CompilerSelect #PB_Compiler_OS
  CompilerCase #PB_OS_Linux
    Debug "Compiled on Linux"
  CompilerCase #PB_OS_Windows
    Debug "Compiled on Windows"
  CompilerCase #PB_OS_MacOS
    Debug "Compiled on Mac OS"
  CompilerDefault
    Debug "Compiled on something else"
CompilerEndIf

Python

if-then-else

if x == 0:
    foo()
elif x == 1:
    bar()
elif x == 2:
    baz()
else:
    boz()

ternary expressions

Interpreter: Python 2.5

true_value if condition else false_value

Example:

>>> secret='foo'
>>> print 'got it' if secret=='foo' else 'try again'
'got it'

Note: this syntax is valid as an expression, the clauses cannot constain statements. The foregoing example is equivalent to:

>>> secret = 'foo'
>>> result = 'got it' if secret=='foo' else 'try again'
>>> print result
'got it'

Function dispatch dictionary

In some cases it's useful to associate functions with keys in a dictionary; and simply use this in lieu of long sequences of "if...elif...elif..." statements.

dispatcher = dict()
dispatcher[0]=foo  # Not foo(): we bind the dictionary entry to the function's object,
                   # NOT to the results returned by an invocation of the function
dispatcher[1]=bar
dispatcher[2]=baz  # foo,bar, baz, and boz are defined functions.

# Then later
results = dispatcher.get(x, boz)()  # binding results to a name is optional
# or with no "default" case:
if x in dispatcher:
    results=dispatcher[x]()
# The above, but with a dict literal
dispatcher = {
    0: foo,
    1: bar,
    2: baz,
}
# ...
results = dispatcher.get(x, boz)()
# Or without the temp variable
# (it's up to the reader to decide how "pythonic" this is or isn't)
results = {
    0: foo,
    1: bar,
    2: baz,
}.get(x, boz)()

This can be particularly handy when using currying techniques, or when lambda expressions or meta-function generators (factories) can be used in place of normal named functions.

In general a dispatch table or class/object abstraction (using dynamic method over-rides) is considered preferable to chains of if ... elif ... elif ... in Python programming.

QB64

Print "QB64/Qbasic conditional structures"
Dim k As String
Menu 1
View Print 13 To 23
Print "A menu example using the many options of IF statement"
k = " "
12: While k <> ""
    k = UCase$(Input$(1))
    If k = "O" GoTo O
    If k = "F" Then 22
    If k = "S" Then GoSub S: GoTo 12
    If k = "C" Then GoSub 4: GoTo 12
    If k = "E" Then GoSub 5: Exit While
Wend
Cls
Print "the same menu example with Select Case"
Sleep 2
While k <> ""
    k = UCase$(Input$(1))

    Select Case k
        Case "O"
            Print "You choose O"
        Case "F"
            Print "You choose F"
        Case "S"
            Print "You choose S"
        Case "C"
            Print "You choose C"
        Case "E"
            Print "You choose Exit"
            _Delay 1
            Exit While
        Case Else
            Print "Wrong choice"
    End Select
Wend
View Print
Cls
Menu 2
View Print 13 To 23
Print "menu demonstration using ON value GOTO"
k = " "
While k <> ""
    k = Input$(1)
    On Val(k) GOSUB 1, 2, 3, 4, 5
Wend
End

1:
Print "Chosen O"
Return

2:
Print "Chosen F"
Return

3:
Print "Chosen S"
Return

4:
Print "Chosen C"
Return

5:
Print "Chosen E"
If k = "5" Then End
Return


O:
Print "You choose O"
GoTo 12

22:
Print "You choose F"
GoTo 12

S:
Print "You choose S"
Return



Sub Menu (Kind As Integer)
    Locate 7, 33: Color 3, 4
    Print "Choose the item"
    Color 7, 0
    Locate , 33
    If Kind = 1 Then Print "Open a file"; Else Print "1) Open a file";
    Color 14, 1
    Locate , 33
    If Kind = 1 Then Print "O" Else Print "1"
    Color 7, 0

    Locate , 33
    If Kind = 1 Then Print "Find a file"; Else Print "2) Find a file";
    Color 14, 1
    Locate , 33
    If Kind = 1 Then Print "F" Else Print "2"
    Color 7, 0

    Locate , 33
    If Kind = 1 Then Print "Scan a file"; Else Print "3) Scan a file";
    Color 14, 1
    Locate , 33
    If Kind = 1 Then Print "S" Else Print "3"
    Color 7, 0

    Locate , 33
    If Kind = 1 Then Print "Copy a file"; Else Print "4) Copy a file";
    Color 14, 1
    Locate , 33
    If Kind = 1 Then Print "C" Else Print "4"
    Color 7, 0

    Locate , 33
    If Kind = 1 Then Print "Exit from Menu"; Else Print "5) Exit from Menu";
    Color 14, 1
    Locate , 33
    If Kind = 1 Then Print "E" Else Print "5"
    Color 7, 0

End Sub


Quackery

Quackery is a stack based language that traverses nests. Numbers are bigints that place themselves on the stack. Words are equivalent to functions and procedures. They operate on the contents of the stack. Nests, numbers, and words are items. Nests are zero or more items enclosed by the words [ and ].

Quackery has mix and match control flow words, so the conditional structure words if, iff, and else, along with done and again, (respectively, branch unconditionally to start and end of enclosing nest) and while, and until (respectively, branch conditionally to start and end of enclosing nest) can all be used in a nest in any order.

if conditionally skips over one item.

iff conditionally skips over two items.

else unconditionally skips over one item.

Demonstration of if, iff, and else in the Quackery shell.

/O> say "23 is greater than 42 is "
... 23 42 > not if [ say "not " ]
... say "true." cr
... 
23 is greater than 42 is not true.

Stack empty.

/O> say "23 is less than 42 is "
... 23 42 < not if [ say "not " ]
... say "true." cr
... 
23 is less than 42 is true.

Stack empty.

/O> 23 42 = iff
...   [ say "23 is equal to 42." ]
... else
...   [ say "23 is different to 42." ]
... cr
... 
23 is different to 42.

Stack empty.

/O> 23 42 != iff
...   [ say "23 is not equal to 42." ]
... else
...   [ say "23 is the same as  42." ]
... cr
... 
23 is not equal to 42.

Stack empty.

A numeric switch statement can be made with the words table and do.

/O>   [ [ table
...       [ say "zero" cr ]
...       [ say "one" cr ]
...       [ say "two" cr ] ] do ] is demo ( n --> )
... 0 demo
... 1 demo
... 2 demo
... 
zero
one
two

Stack empty.

Additionally, new control flow words can be created in Quackery using the meta-control flow words, which grant the properties of control flow word to nests that use them. See Metaprogramming#Quackery for an example of using the meta-control flow words ]if[ and ]else[ to create a comparison switch.

(]'[, pronounced "meta-literal" grants the property of ' (pronounced "literal", ' places the item following it on the stack and unconditionally branches over it) to the enclosing nest.)

See Flow-control structures#Quackery for a deeper dive into Quackery control flow.

R

if

Like most languages, R has an if statement as well as if-then-else:

x <- 0
if(x == 0) print("foo")
x <- 1
if(x == 0) print("foo")
if(x == 0) print("foo") else print("bar")
Output:
> if(x == 0) print("foo")
[1] "foo"
> if(x == 0) print("foo")
> if(x == 0) print("foo") else print("bar")
[1] "bar"

switch

R also has switch, but it's a function rather than a special form of any sort. In fact, R has two versions of switch: one for numbers and one for characters.

x <- 2
switch(x, print("Print if x == 1"), print("Print if x == 2"))

A notable part of the numeric version of switch is that, rounding and coercion aside, the cases must correspond exactly to the number of arguments given minus one. For example, the second argument of the switch statement will only be matched if the first argument equals (or is coerced to) 1 and the third argument will only do so for 2. There is no way to supply default cases or start from a number other than 1.

x <- 3
switch(x, print("Print if x == 1"), print("Print if x == 2"))
x <- 2.7
switch(x, print("Print if x == 1"), print("Print if x == 2 or if there is rounding to 2"))

The other switch, the one that works for characters, is much more sensible. Its rules are clearly laid out in documentation, but rely on R's mechanisms for names, which makes them a little bit complicated. See the language definition for a reasonably simple example.

x <- "match"
switch(x, mat = 0, match = 10, other = 100, 1000)
x <- "ma"
switch(x, mat = 0, match = 10, other = 100, 1000)
x <- "foo"
switch(x, mat = 0, match = 10, other = 100, 1000)
Output:
>  switch(x, print("Print if x == 1"), print("Print if x == 2"))
[1] "Print if x == 2"
> switch(x, print("Print if x == 1"), print("Print if x == 2"))
> switch(x, print("Print if x == 1"), print("Print if x == 2 or if there is rounding to 2"))
[1] "Print if x == 2 or if there is rounding to 2"
> switch(x, mat = 0, match = 10, other = 100, 1000)
[1] 10
> switch(x, mat = 0, match = 10, other = 100, 1000)
[1] 1000
> switch(x, mat = 0, match = 10, other = 100, 1000)
[1] 1000

ifelse

R's final example is the ifelse function. Like switch, it is not a special form, so its inclusion here is debatable. In fact, the current version of the language definition does not even mention it. However, 'An Introduction to R' gives a better description than I could:

"This has the form ifelse(condition, a, b) and returns a vector of the same length as condition, with elements a[i] if condition[i] is true, otherwise b[i] (where a and b are recycled as necessary)."

Note also that it is not a ternary operator and its documentation warns against using it as such. In my experience, its most common use is in recoding data. For example:

data <- c(1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 0)
ifelse(data == 1, "Yes", "No")
Output:
> ifelse(data == 1, "Yes", "No")
 [1] "Yes" "No"  "Yes" "Yes" "Yes" "Yes" "Yes" "No"  "No"  "No"  "No"  "Yes" "Yes" "No"  "Yes" "Yes" "Yes" "Yes" "Yes" "No" 

Racket

if

If-expressions in Racket must have both branches

(if (< x 10)
  "small"
  "big")

when/unless

One-sided conditional expressions use "when" and "unless". These are more convenient for side-effects since they have an implicit "begin" around their body, and you can also include new definitions

(when (< x 10)
  (define y (* x 10))
  (printf "small\n"))

cond

Used for multiple conditions:

(printf "x is ~a\n"
        (cond [(< x 1)     "tiny"]
              [(< x 10)    "small"]
              [(< x 100)   "medium"]
              [(< x 10000) "big"]
              [(< x 100000000) "huge"]
              [else "gigantic"]))

case

Similar to a "switch" statement in other languages

(case x
  [(1) "one"]
  [(2) "two"]
  [(3) "three"]
  [(4) "four"]
  [(6 8)   "even"]
  [(5 7 9) "odd"]
  [else    "something else"])

etc

Racket has macros, which means that you can define whatever new conditional you think is useful...

Raku

(formerly Perl 6)

if/else

if, else, elsif, unless, and given work much as they do in Perl 5, with the following differences:

  • All the parentheses are now optional.
  • unless no longer permits elsif or else blocks.
  • If the block of an if, elsif, or unless has a nonzero arity, the value of the conditional expression is used as an argument to the block:
    if won() -> $prize {
        say "You won $prize.";
    }
    If an else block has a nonzero arity, it receives the value of the condition tested by the last if or elsif.

given/when

Switch structures are done by topicalization and by smartmatching in Raku. They are somewhat orthogonal, you can use a given block without when, and vice versa. But the typical use is:

given lc prompt("Done? ") {
    when 'yes' { return }
    when 'no'  { next }
    default    { say "Please answer either yes or no." }
}

when blocks are allowed in any block that topicalizes $_, including a for loop (assuming one of its loop variables is bound to $_) or the body of a method (if you have declared the invocant as $_)." See more at: https://docs.raku.org/language/control#index-entry-switch_(given)

There are also statement modifier forms of all of the above.

Ternary operator

The ternary operator looks like this:

$expression ?? do_something !! do_fallback

Other short-circuiting operators

and, or, &&, || and // work as in Perl 5.

Red

If-Either-Case-Switch

If the result is true, the block! will be evaluated. If false nothing happens.

>> if 10 > 2 [print "ten is bigger"]
ten is bigger

EITHER

If the result is true the first block! will be evaluated. If false the second block! will be evaluated.

>> either 3 > 2 [print "Three larger"][print "Nope!"]
Three larger

CASE

The block! following the first true condition is evaluated.

n: 50
case [
  n < 10   [print "small number"]
  n < 100  [print "medium number"]
  n < 1000 [print "large number"]
  true     [print "none of these"]      
]

medium number

;CASE/ALL Prints all that are true
n: 50
case/all [
  n < 10   [print "small number"]
  n < 100  [print "medium number"]
  n < 1000 [print "large number"]
  true     [print "none of these"]      
]

medium number
large number
none of these

SWITCH

switch "india" [
   "a"       [print "string"]
   23        [print "integer"]
   "India"   [print "The country India"]
]

The country India

switch/default "U.S." [ 
   "a"       [print "string"]
   23        [print "integer"]
   "India"  [print "The country India"]
][
print "no match"
]

no match

Retro

choose, if, and -if

condition  [ true statements ] if
condition  [ false statements ] -if
condition  [ true statements  ] [ false statements ] choose

These forms can be used interactively, or inside function definitions.

when

:foo (n-)
  #1 [ ( if quote evaluates to true ) ] case
  #2 [ ( if quote evaluates to true ) ] case
  #3 [ ( if quote evaluates to true ) ] case
  drop ( default action ) ;

REXX

IF--THEN, IF--THEN--ELSE

if  y  then @=6                        /* Y  must be either   0  or  1  */

if t**2>u  then x=y                    /*simple  IF  with  THEN & ELSE. */
           else x=-y

if t**2>u  then do j=1  for 10;  say prime(j);  end    /*THEN  DO  loop.*/
           else x=-y                                   /*simple  ELSE.  */

if z>w+4  then do                                      /*THEN  DO group.*/
               z=abs(z)
               say 'z='z
               end
          else do;  z=0;  say 'failed.';  end          /*ELSE  DO group.*/

if x>y  &  c*d<sqrt(pz) |,             /*this statement is continued [,]*/
   substr(abc,4,1)=='~'  then  if  z=0  then call punt
                                        else nop       /*NOP pairs up IF*/
                         else  if  z<0  then z=-y      /*alignment helps*/

SELECT--WHEN

                      /*the  WHEN  conditional operators are the same as*/
                      /*the   IF   conditional operators.               */
 select
 when t<0        then z=abs(u)
 when t=0 & y=0  then z=0
 when t>0        then do
                      y=sqrt(z)
                      z=u**2
                      end

                      /*if control reaches here & none of the WHENs were*/
                      /*satisfiied, a SYNTAX (error) condition is raised*/
 end  /*1st select*/

     select
     when a=='angel'              then many='host'
     when a=='ass' | a=='donkey'  then many='pace'
     when a=='crocodile'          then many='bask'
     when a=='crow'               then many='murder'
     when a=='lark'               then many='ascension'
     when a=='quail'              then many='bevy'
     when a=='wolf'               then many='pack'
     otherwise                         many='?'
     end  /*2nd select*/          /* [↑]  uses OTHERWISE as a catch-all.*/

SELECT--WHEN/OTHERWISE

     select
     when g=='angel'              then many='host'
     when g=='ass' | g=='donkey'  then many='pace'
     when g=='crocodile'          then many='bask'
     when g=='crow'               then many='murder'
     when g=='lark'               then many='ascension'
     when g=='quail'              then many='bevy'
     when g=='wolf'               then many='pack'
     otherwise  say
                say '*** error! ***'
                say g  "isn't one of the known thingys."
                say
                exit 13
     end   /*select*/

Rhope

Works with: Rhope version alpha 1

if-then-else

If[cond]
|:
    Do Something[]
:||:
    Do Something Else[]
:|

Ring

if-but-else-ok

If x == 1
   SomeFunc1()
But x == 2
   SomeFunc2()
Else
   SomeFunc()
Ok

Switch

Switch x
On 1
   SomeFunc1()
On 2
   SomeFunc2()
Other
   SomeFunc()
Off

RLaB

if

Block of instructions following the if command has to be always enclosed in curly brackets.

if (x==1)
{
  // do something
}

if-else

If there are branching within the command, respective blocks have to be enclosed in the blocks preceding it. Consider an example:

if (x==1)
{
  // do something if x is 1
  y = const.pi;
else
  // do something if x is not 1
  y = sin(const.pi*(1-x)) / (1-x);
}
if (x==1)
{
  // do something if x is 1
  y = const.pi;
else if (x == 2)
{
  // do something if x is 2
  y = sin(const.pi*(1-x)) / (1-x);
else
  // do something in all the other cases
  y = rand();
}}

RPL

IF..THEN

IF <instruction(s)> THEN <instruction(s)> END

IF..THEN..ELSE

IF <instruction(s)> THEN <instruction(s)> ELSE <instruction(s)> END

Instructions between IF and THEN are not mandatory, but recommended for lisibility. The interpreter considers IF as a null word and performs branching when meeting the word THEN: if stack level 1 is not equal to zero, the instructions between THEN and END will be executed.

IFT and IFTE are stack-based conditonal structures. IFT evaluates the content of stack level 1 only if the content of stack level 2 is not zero, otherwise it is dropped. IFTE evaluates the content of stack level 1 if the content of stack level 2 is zero, otherwise if evaluates the content of stack level 2.

CASE..END

CASE
   <instruction(s)> THEN <instruction(s)> END
   <instruction(s)> THEN <instruction(s)> END
   @ as many branches as needed
   <instruction(s)>    @ default branch (optional)
   END

Ruby

See Conditional Structures/Ruby

Run BASIC

' Boolean Evaluations
'
' > Greater Than
' < Less Than
' >= Greater Than Or Equal To
' <= Less Than Or Equal To
' = Equal to

x = 0

if x = 0 then print "Zero"

' --------------------------
' if/then/else
if x = 0 then
print "Zero"
else
print "Nonzero"
end if

' --------------------------
' not
if x then
print "x has a value."
end if
if not(x) then
print "x has no value."
end if

' --------------------------
' if .. end if
if x = 0 then
print "Zero"
goto [surprise]
end if
wait

if x = 0 then goto [surprise]
print "No surprise."
wait

[surprise]
print "Surprise!"
wait

' --------------------------
' case numeric
num = 3

select case num
case 1
print "one"

case 2
print "two"

case 3
print "three"

case else
print "other number"

end select

' --------------------------
' case character
var$="blue"

select case var$

case "red"
print "red"

case "green"
print "green"

case else
print "color unknown"

end select

Rust

Compile-Time

Conditional compilation

Rust supports conditional compilation via the `cfg` annotation.

// This function will only be compiled if we are compiling on Linux
#[cfg(target_os = "linux")]
fn running_linux() {
    println!("This is linux");
}
#[cfg(not(target_os = "linux"))]
fn running_linux() {
    println!("This is not linux");
}

// If we are on linux, we must be using glibc
#[cfg_attr(target_os = "linux", target_env = "gnu")]
// We must either be compiling for ARM or on a little endian machine that doesn't have 32-bit pointers pointers, on a
// UNIX like OS and only if we are doing a test build
#[cfg(all(
        any(target_arch = "arm", target_endian = "little"),
        not(target_pointer_width = "32"),
        unix,
        test
        ))]
fn highly_specific_function() {}

Conditional compilation may also be achieved via the `cfg!` macro.

fn main() {
     if cfg!(target_os = "linux") {
         // Do something
     }
}

Generics (static dispatch)

By default, generics in Rust are monomorphized, so no vtable lookups at runtime are necessary.

trait PrintType {
    fn print_type(&self);
}

impl PrintType for char {
    fn print_type(&self) {
        println!("char");
    }
}

impl PrintType for f64 {
    fn print_type(&self) {
        println!("64-bit float");
    }
}

fn prints_type_of_args<T, U>(arg1: &T, arg2: &U)
    where T: PrintType,
          U: PrintType
{
    arg1.print_type();
    arg2.print_type();
}

fn main() {
    prints_type_of_args(&'a', &2.0);
    prints_type_of_args(&'a', &'b');
}

Runtime

If-statement

if some_conditional {
    do_stuff();
} else if some_other_conditional {
    do_other_stuff();
} else {
    destroy_humanity();
}

// If statements are also expressions and will yield the value of the last expression in each block
let x = if y > z { y + 1 } else { z * 4 };

// Pattern matching may also be used
struct Point {
    x: i32,
    y: i32,
}
fn some_function(p: Option<Point>) {
    if let Some(Point { x: x_coord, y: y_coord }) = p {
        // Do something with x_coord and y_coord
    }
}

Match statement

Match statements are essentially more powerful switch statements

fn some_other_function(p: Option<Point>) {
    match p {
        Some(Point { x: 0, y: 0 }) => println!("Point is on origin"),
        Some(Point { x: 0, y: _ }) | Some(Point { x: _, y: 0 }) => println!("Point is on an axis"),
        Some(Point {x: a, y: b}) if a == b => println!("x and y are the same value"),
        Some(Point {x: ref mut a, y: ref b}) if *a > 4 && *b < 2 => println!("we got a mutable reference to x-value and an immutable reference to y-value."),
        op @ Some(p) => println!("op is the Option<Point> while p is the contained Point"),
        None => println!("We didn't get a point"),
    }
}

Generics (dynamic dispatch)

Generics may also be accomplished via dynamic dispatch, so the actual code that is run is determined at compile time. Using the same trait defined in the static dispatch section:

fn prints_args_dynamic(arg1: &PrintType, arg2: &PrintType) {
    arg1.print_type();
    arg2.print_type();
}
fn main() {
   prints_args_dynamic(&'a', &2.0);
   prints_args_dynamic(&6.3,&'c');
}

Sather

    if EXPR then
      -- CODE
    elsif EXPR then
      -- CODE
    else
      -- CODE
    end;

EXPR must evaluate to BOOL (true or false); elsif and else are optional.

    case EXPR
      when EXPRL then
         -- CODE
      when EXPRL then
         -- CODE
      else
         -- CODE
    end;

EXPRL is a single expression or a comma-separated list of exressions. The expressions must evaluate to comparable objects (the method is_eq must be implemented)

Scala

Library: Scala
  if (n == 12) "twelve" else "not twelve"
  
  today match {
    case Monday =>
      Compute_Starting_Balance;
    case Friday =>
      Compute_Ending_Balance;
    case Tuesday =>
      Accumulate_Sales
    case _ => {}
  }

Scheme

Procedures can be categorised as primitive or derived. Derived procedures can be defined in terms of primitive procedures.

Primitive

if

(if <test> <consequent> <alternate>)
(if <test> <consequent>)

Example:

(display
  (if (> 1 2)
      "yes"
      "no"))
(newline)
(display
  (if (> 1 2)
      (- 1 2)))
(newline)
Output:
no
#<unspecified>

Derived

cond

(cond <clause1> <clause2> ...)

Example:

(display
  (cond ((> 1 2) "greater")
        ((< 1 2) "less")))
(newline)
(display
  (cond ((> 1 1) "greater")
        ((< 1 1) "less")
        (else "equal")))
(newline)
Output:
less
equal

case

(case <key> <clause1> <clause2> ...)

Example:

(display
  (case (* 2 3)
    ((2 3 5 7) "prime")
    ((1 4 6 8 9) "composite")))
(newline)
(display
  (case (car (list c d))
    ((a e i o u) "vowel")
    ((w y) "semivowel")
    (else "consonant")))
(newline)
Output:
composite
consonant

Scilab

if-then-else

if condition1 then instructions1
[elseif condition2 then instructions2]
....
[else instructionse]
end

select-case

select expression
  case expression1 then instructions1
  [case expression2 then instructions2]
  ...
  [else instructionse]
end

Seed7

if-then-else

There can be single or multiple statements. An if-statement can have multiple elsif parts.

if condition then
  statement
end if;

if condition then
  statement1
else
  statement2;
end if;

if condition1 then
  statement1
elsif condition2 then
  statement2;
end if;

if condition1 then
  statement1
elsif condition2 then
  statement2;
else
  statement3;
end if;

case

case i of
  when {1, 4, 9}:  # Executed if i is 1, 4 or 9
    statement1;
  when {11} | {13 .. 17}:  # Executed if i is 11, 13, 14, 15, 16 or 17
    statement2;
  when {42}:  # Executed only if i is 42
    statement3;
  otherwise:
    statement4;
end case;

SIMPOL

if-else if-else

if x == 1
  foo()
else if x == 2
  bar()
else
  foobar()
end if

ternary if function

.if(x == 1, "hello", "world")

Simula

Works with: SIMULA-67

Simula 67 has conditional statements of the form:

 statement::=  if conditional_expression then statement else statement 
   if X=Y then K:=I else K:=J
 statement::=  if conditional_expression then statement
   if X=Y then K:=I

An example:

BEGIN  
  INTEGER i,j;
  i:=1; j:=2;
  OutText("i ");
  IF i=1 THEN OutInt(i,1); 
  OutImage;
  OutInt(i,2); OutInt(j,2); 
  IF i<j THEN OutText(" : i<j") ELSE OutText(" : i>=j");
  OutImage;
  IF i>=j THEN BEGIN
    OutText("i=");
    OutInt(i,5)
  END
  ELSE BEGIN
    OutText("j=");
    OutInt(j,5)
  END;
  OutImage
END

Simula 67 has also a switch structure:

 declaration::=  switch switch:=list_of labels
   statement::=  goto switch[expression]

An example:

BEGIN  
  INTEGER i,j;
  SWITCH target:=L1,L2,L3;
  i:=1; j:=2;
  OutText("::");
  GOTO target(j);
  L1: OutText("AA");
  L2: OutText("BB");
  L3: OutText("CC");
  OutImage
END

Slate

ifTrue/ifFalse

"Conditionals in Slate are really messages sent to Boolean objects. Like Smalltalk. (But the compiler might optimize some cases)"
 balance > 0
     ifTrue: [inform: 'still sitting pretty!'.]
     ifFalse: [inform: 'No money till payday!'.].


caseOf:otherwise:

c@(Net URLPathEncoder traits) convert
[ | byte1 byte2 byte3 digit1 digit2|
  [c in isAtEnd] whileFalse:
    [byte1: c in next.
     byte1 caseOf: {
       $+ -> [c out nextPut: $\s].
       $% -> [byte2: c in next.
              byte3: c in next.
              digit1: (byte2 toDigit: 16).
              digit2: (byte3 toDigit: 16).
              digit1 isNil \/ [digit2 isNil] ifTrue: [error: 'Error reading hex sequence after %'].
              c out nextPut: (digit1 * 16 + digit2 as: c out elementType)].
     } otherwise: [c out nextPut: byte1].
     ].
].

whileTrue:/whileFalse:

[p isAtEnd] whileFalse: [p next evaluate]].

Slope

The following examples are highly derived, but should give the basics. All of the forms below (if, case, cond) return the result of evaluating their associated expression/consequent. The examples below tend toward side effects, so mostly return the empty list.

if

Syntax:

(if [test] [consequent] [[alternate]])

Example:

(define my-file (file-open-read "my-file.txt"))
(if my-file (write (read-all my-file)) (! "Could not open file"))

case

Syntax:

(case [value] (match-val expression)...)

Example:

(case my-enum
  (string (do-string my-enum))
  (bool (do-bool my-enum))
  (proc (my-enum))
  (number (do-number my-enum))
  (else (! "No match found in case")))

cond

Syntax:

(cond ([test] [expression])...)

Example:

(define my-num 123)
(cond
  ((positive? my-num) 'positive)
  ((negative? my-num) 'negative)
  (else 'zero))

SmallBASIC

if

IF foo == 1
    PRINT "one"
ELSEIF foo == 2
    PRINT "two"
ELSE
    PRINT "something else"
ENDIF

Inline if

ans = iff(x <= 5, 0, 10)

select

select case x
    case 12
        print "x is 12"
    case 13,14,15
        print "x is 13,14,or 15"
    case iff(x <= 4, x, x + 1)
        print "x <= 4"
    case else
        print "x is not <=4,12,13,14,15"        
end select

Smalltalk

Smalltalk has no builtin control structures in its language syntax. All is done by passing blocks (aka lambda-closures) as parameters to boolean or block receivers (or others). You can define your own and additional control structures, most visible as various container enumeration messages (to:do: / do: / doWith: /etc.) and in the way exceptions are handled (which are also defined as library functions). All in all, there are hundreds or thousands of such functions found in typical Smalltalk systems, too many to be listed here.

A common pattern for handling a multi-option switch is to create classes for the various options, and let Polymorphism take care of the decisions (although switch-case like constructs are possible).

Another common pattern is to hold a collection of blocks and dispatch to one of them (eg. in parsers, dispatching on the next incoming character), or in state machines, depending on an input token.

Notice that all constructs below are expressions and have a value. The value can be assigned or used as argument in a message send.

ifTrue/ifFalse

Conditionals in Smalltalk are really messages sent to Boolean objects.
The most basic conditional is the ifTrue/ifFalse, which is defined in 4 variants in the Boolean class ¹ (the receiver is the following examples is a boolean, which get the alternative code pieces as argument):

 balance > 0
     ifTrue: [Transcript cr; show: 'still sitting pretty!'.]
     ifFalse: [Transcript cr; show: 'No money till payday!'.].

 balance < 10 ifTrue:[ self goGetSomeMoney ].

 balance > 1000 ifTrue:[ self beHappy ].

 (balance < 10) 
    ifFalse:[ self gotoHappyHour ]
    ifTrue:[ self noDrinksToday ].

You can also use them as the ternary operator

abs := x > 0 ifTrue: [ x ] ifFalse: [ x negated ]

Or get the alternatives from somewhere else (for example, passed as parameter)

...
trueAction := [ ... do something ].
falseAction := [ ... do something else ...].
...
abs := x > 0 ifTrue:trueAction ifFalse:falseAction. "3)"

Note ¹ strictly speaking, these are methods (aka virtual functions) in the subclasses of Boolean (True and False) if which true and false are singletons. Thus, conditional execution is actually implemented via polymorphism, in that those methods either do or do not evaluate their argument (or one of the alternatives). The compiler will optimize and inline special cases (i.e. boolean receivers).
Note ² of course, you are free to implement similar control structures in either one of the existing or your own classes and thus implement your own control structures.
Note ³ no brackets here; because ifTrue/ifFalse sends #value to the argument (which is a lambda block) to have it evaluate itself. If we had extra brackets here, we'd get the block unevaluated as value.

Switch Case

|x|
x := 1.
value :=
    x caseOf: {
       [1]->['one'].
       [2]->['two'].
       [3]->['three']
    }
    otherwise:['none of them'].

SNOBOL4

SNOBOL4 has no structured programming features, but the two constructs in question could be easily emulated with FAILURE/SUCCESS and indirect jumps

	A = "true"
* "if-then-else"
if	A "true"			:s(goTrue)f(goFalse)
goTrue	output = "A is TRUE"		:(fi)
goFalse	output = "A is not TRUE"	:(fi)
fi

* "switch"
switch		A ("true" | "false") . switch	:s($("case" switch))f(default)
casetrue	output = "A is TRUE"	:(esac)
casefalse	output = "A is FALSE"	:(esac)
default		output = "A is neither FALSE nor TRUE"
esac
end

SNUSP

$==?\==zero=====!/==#
    \==non zero==/

? is the only conditional operator. It skips one character if the current cell is zero.

! is an unconditional skip. !/ is the idiom for joining two lines of execution. ?! inverts the test.

\ and / redirect the flow of control. All the other characters besides $ and # are commentary.


Sparkling

If statement:

var odd = 13;
if odd % 2 != 0 {
    print("odd");
}

If-else statement:

var odd = 13;
if odd % 2 != 0 {
    print("odd");
} else {
    print("even");
}

If and if-else statements can be chained:

var nodiv3 = 13;
if nodiv3 % 3 == 0 {
    print("divisible by 3");
} else if nodiv3 % 3 == 1 {
    print("gives 1 remainder");
} else {
    print("gives 2 remainder");
}

There's no "switch-case" statement in Sparkling yet, but it's work in progress.

SQL

Works with: MS SQL version 2005

Conditional Expression

case when a then b else c end

declare @n int
set @n=124
print case when @n=123 then 'equal' else 'not equal' end

--If/ElseIf expression
set @n=5
print case when @n=3 then 'Three' when @n=4 then 'Four' else 'Other' end

If/Else

declare @n int
set @n=123
if @n=123
  BEGIN --begin/end needed if more than one statement inside
    print 'one two three'
  END
ELSE
  if @n=124 print 'one two four'
  else print 'other'

SSEM

The SSEM's only conditional operation is 011 Test, which causes the computer to skip the next instruction if the value held in the accumulator is negative. This program illustrates it: assuming address 10 stores a variable, we test whether its negation is negative (i.e. whether the variable itself is positive). If it is, we skip the next instruction and proceed with the program; but, if it is not negative (i.e. the variable is negative or zero), we jump to address 1 + the value stored at address 14. It is easy to see how this can be used to implement loops, other conditional tests, etc.

01010000000000100000000000000000   -10 to c
00000000000000110000000000000000   Test
01110000000000000000000000000000   14 to CI

Stata

cond function

This is an equivalent of a ternary ?: in C, useful for instance when creating a variable with gen. See cond in Stata help.

clear
set obs 4
gen a = cond(mod(_n, 2)==1, "A", "B")
list, noobs noheader

  +---+
  | A |
  | B |
  | A |
  | B |
  +---+

if command

This one is mainly useful in programs. See ifcmd in Stata help. To illustrate the command, here is a program that checks if a number is prime.

program isprime
	sca n = `0'
	sca p = 1
	if n<5 {
		if n!=2 & n!=3 {
			sca p = 0
		}
	}
	else {
		if mod(n, 2)==0 {
			sca p = 0
		}
		else {
			sca k=3
			while k*k<=n {
				if mod(n, k)==0 {
					sca p = 0
					continue, break
				}
				sca k = k+2
			}
		}
	}
	
	if p {
		di "`n' is prime."
	}
	else {
		di "`n' is not prime."
	}
end

isprime `=10^12-11'
999999999989 is prime.

if expression

When used in a command, if means the command is to be applied to the data subset for which the if expression is true.

clear
set obs 100
count
  100
count if mod(_n, 3)==0
  33

if statement in Mata

See Stata help. Here is an equivalent of the above program to check if a number is prime.

function isprime(n) {
	if (n<5) return(n==2 | n==3)
	else if (mod(n, 2)==0) return(0)
	else {
		for (k=3; k*k<=n; k=k+2) {
			if (mod(n, k)==0) return(0)
		}
		return(1)
	}
}

isprime(10^12-11)
  1

ternary operator in Mata

See Stata help. Here is a recursive implementation of the Fibonacci sequence, to illustrate.

function fib(n) {
	return(n<2 ? n : fib(n-1)+fib(n-2))
}

fib(10)
  55

Swahili

if-else if-else (kama-au-sivyo)

kama (kweli) {
  andika("statement")
} au (kweli /* condition */) {
  andika("statement")
} au (kweli /* condition */) {
  andika("statement")
} sivyo {
  andika("statement")
}

Tailspin

Tailspin has only one true conditional structure, a set of matchers. Each templates (sort of a function that takes one input value and emits zero or more outputs) has a set of matchers. If it only has matchers, they are invoked. If the templates has a block, the matchers are invoked by sending to them (by "-> #"). The matchers can also be used as a looping structure by sending values back to be matched (also by "-> #").

templates foo
  when <=0> do 'zero' -> !OUT::write
  when <..0> do
    'negative ' -> !OUT::write
    -$ -> #
  when <?($ mod 2 <=0>)> do 'even' -> !OUT::write
  otherwise 'odd' -> !OUT::write
end foo

Tcl

if-then-else

if {$foo == 3} {
    puts "foo is three"
} elseif {$foo == 4} {
    puts "foo is four"
} else {
    puts "foo is neither three nor four"
}

or (using the ternary operator of expressions)

set result [expr { $foo == 3 ? "three" : "not three" }]

switch

switch -- $foo {
    3 {puts "foo is three"}
    4 {puts "foo is four"}
    default {puts "foo is something else"}
}

Note that the switch command can also use glob matching (like case in the Bourne Shell) or regular-expression matching.

Tern

There are several conditional statements.

If Statement

if(a > b)
   println(a);

If Else Statement

if(a > b) {
   println(a);
} else {
   println(b);
}

Unless Statement

unless(a > b) {
   println(b);
} else {
   println(a);
}

Switch Statement

switch(a) {
   case 10:
   case 11: 
      println(a);
      break;
   default:
      println(b);
}

TI-83 BASIC

There are 3 forms of conditional statement:

Basic form
with only one statement for the true part:

If condition
statement

or in one line

If condition : statement

If-Then form

If condition
Then
statements
End

If-Then-Else form

If condition
Then
statements
Else
statements
End

Toka

ifTrue

( condition ) ( quote ) ifTrue

100 100 = [ ." True\n" ] ifTrue
100 200 = [ ." True\n" ] ifTrue

ifFalse

( condition ) ( quote ) ifFalse

100 100 = [ ." True\n" ] ifFalse
100 200 = [ ." True\n" ] ifFalse

ifTrueFalse

( condition ) ( true quote ) ( false quote ) ifTrueFalse

100 100 = [ ." Equal\n" ] [ ." Not Equal\n" ] ifTrueFalse
100 200 = [ ." Equal\n" ] [ ." Not Equal\n" ] ifTrueFalse

TorqueScript

if-then-else

// numbers and objects
if(%num == 1)
{
	foo();
}
else if(%obj == MyObject.getID())
{
	bar();
}
else
{
	deusEx();
}

// strings
if(%str $= "Hello World")
{
	foo();
}
else if(%str $= "Bye World")
{
	bar();
}
else
{
	deusEx();
}

switch

// numbers and objects
switch(%num)
{
	case 1:
		one();
	case 2:
		twoThreeOrFour();
	case 3:
		twoThreeOrFour();
	case 4:
		twoThreeOrFour();
	case 5:
		five();
	case MyObject.getID():
		anObject();
	default:
		everythingElse();
}

// strings
switch$(%str)
{
	case "Hello":
		arrival();
	case "Goodbye":
		departure();
	default:
		somethingElse();
}

conditional (ternary) operator (?:)

%formatted = %str @ ((getSubStr(%str,strLen(%str) - 1,1) $= "s") ? "'" : "'s");


Transd

Transd has as an universal conditional expression - the if-elsif-else operator. Also, the conditional evaluation is achieved through logical functions.

#lang transd

MainModule: {
    _start: (λ locals: b 1 c 0
        (textout (if b "OK" else "NO") "\n")

        // switch/case emulation

        (textout (* 5
            (if (== b 0) 2
            elsif (== b 1) 5
            else 6)) "\n")

        // example of using 'or' as a conditional construct

        (or (!= c 0) (textout "c is 0"))
    )
}
Output:
OK
25
c is 0

Trith

branch

true ["yes" print] ["no" print] branch

when

true ["yes" print] when

unless

false ["no" print] unless


True BASIC

! IF-ELSEIF-ELSE-END IF
! SELECT-CASE
! ON GOTO, ON GOSUB

IF expr_booleana THEN
   sentencia(s)
END IF


IF expr_booleana1 THEN
   sentencia(s)
ELSEIF expr_booleana2 THEN
   sentencia(s)
ELSEIF expr_booleana3 THEN
   sentencia(s)
ELSE
   sentencia(s)
END IF


SELECT CASE expr_booleana
CASE 1
     sentencia(s)
CASE 2
     sentencia(s)
CASE ELSE
     sentencia(s)
END SELECT


ON expresión GOTO label1, label2 ELSE label3


ON expresión Gosub label1, label2 ELSE label3

TUSCRIPT

IF ELSEIF ELSE ENDIF

$$ MODE TUSCRIPT

condition="c"
IF (condition=="a") THEN
   ---> do something
ELSEIF (condition=="b") THEN
   ---> do something
ELSE
   ---> do something
ENDIF

SELECT CASE DEFAULT ENDSELECT

$$ MODE TUSCRIPT

days="Monday'Tuesday'Wednesday'Thursday'Friday'Saturday'Sunday"
dayofweek=DATE (today,day,month,year,number)
day=SELECT (days,#dayofweek)

SELECT day
CASE "Monday"
   ---> do something
CASE "Saturday","Sunday"
   ---> do something
DEFAULT
   ---> do something
ENDSELECT

TXR

In TXR, most directives are conditionals, because they specify some kind of match. Given some directive D, the underlying logic in the language is, roughtly, "if D does not match at the current position in the input, then fail, otherwise the input advances according to the semantics of D".

An easy analogy to regular expressions may be drawn. The regex /abc/ means something like "if a doesn't match, then fail, otherwise consume a character and if b doesn't match, then fail, otherwise consume another character and if c doesn't match, then fail otherwise consume another character and succeed." The expressive power comes from, in part, not having to write all these decisions and book-keeping.

The interesting conditional-like structures in TXR are the parallel directives, which apply separate clauses to the same input, and then integrate the results in various ways.

For instance the choose construct will select, from among those clauses which match successfully, the one which maximizes or minimizes the length of an extracted variable binding:

@(choose :shortest x)
@x:@y
@(or)
@x<--@y
@(or)
@x+@y
@(end)

Suppose the input is something which can match all three patterns in different ways:

foo<--bar:baz+xyzzy

The outcome (with txr -B) will be:

x="foo"
y="bar:baz+xyzzy"

because this match minimizes the length of x. If we change this to :longest x, we get:

x="foo<--bar:baz"
y="xyzzy"

The cases, all and none directives most resemble control structures because they have short-circuiting behavior. For instance:

@(all)
@x:y@
@z<-@w
@(and)
@(output)
We have a match: (x, y, z, w) = (@x, @y, @z, @w).
@(end)
@(end)

If any subclause fails to match, then all stops processing subsequent clauses. There are subtleties though, because an earlier clause can produce variable bindings which are visible to later clauses. If previously bound variable is bound again, it must be to an identical piece of text:

@# match a line which contains some piece of text x
@# after the rightmost occurence of : such that the same piece
@# of text also occurs at the start of the line preceded by -->
@(all)
@*junk:@x
@(and)
-->@x@/.*/
@(end)
$ echo "-->asdfhjig:asdf" | txr -B weird.txr -
junk="-->asdfhjig"
x="asdf"
$ echo "-->assfhjig:asdf" | txr -B weird.txr -
false
$

UNIX Shell

Works with: Bourne Shell

If conditionals

The basic syntax is if command-list; then command-list; fi. If the first command list succeeds (by returning 0 for success), then the shell runs the second command list.

if test 3 -lt 5; then echo '3 is less than 5'; fi

Else and elif

There are optional elif (else if) and else clauses.

if test 4 -ge 6
then echo '4 is greater than or equal to 6'
elif test 4 -lt 6
then echo '4 is less than 6'
else echo '4 compares not to 6'
fi

Switch conditionals

The Unix shell provides support for multibranch switch conditional constructs using the case statement:

case value in
  choicea)
    foo
    ;;
  choiceb)
    bar
    ;;
esac

Conditional branching using operators

One can also use && and || as conditional structures; see short-circuit evaluation#UNIX Shell.

test 3 -lt 5 && echo '3 is less than 5'
test 4 -ge 6 || echo '4 is not greater than or equal to 6'

Conditional loops

The Unix shell also supports conditional loops:

# This is a while loop
l=1
while [ l -le 5 ]; do
  echo $l
done

# This is an until loop
l=1
until [ l -eq 5 ]; do
  echo $l
done

C Shell

The single-line if syntax is if (expression) simple-command.

if (3 < 5) echo '3 is less than 5'
if ({ grep -q ^root: /etc/passwd }) echo 'passwd has root'

The multi-line if syntax has a then clause, and can have optional else if and else clauses. Each clause may contain multiple commands.

if (4 >= 6) then
	echo '4 is greater than or equal to 6'
else if (4 < 6) then
	echo '4 is less than 6'
else
	echo '4 compares not to 6'
endif

Unison

factorial : Nat -> Nat
factorial x =
  if x == 0 then 1
  else
    x * fac (Nat.drop x 1)

Ursalang

if…then…else

Ursalang has a single conditional construct, the familiar `if…then…else`.

if energyLevel > 9000 { "That's impossible!!!" } else { "Ok, I guess" }

As in most C-like languages, conditionals can be chained:

if color == "red" { "aaaaaah!" }
else if color == "blue" { "oooooh!" }
else { "eeeeeeee!" }

V

ifThenElse

[true]
  ['is true' puts]
  ['is false' puts]
ifte

=is true

ifThen

[true]
  ['is true' puts]
if
=is true

When

3 [
  [1 =] [1 *]
  [2 =] [10 *]
  [3 =] [100 *]
  [4 =] [1000 *]
] when

=300

Choice

true
  1 2
choice

=1

false
  1 2
choice

=2

VBA

If Else End If

Sub C_S_If()
Dim A$, B$

    A = "Hello"
    B = "World"
    'test
    If A = B Then Debug.Print A & " = " & B
    'other syntax
    If A = B Then
        Debug.Print A & " = " & B
    Else
        Debug.Print A & " and " & B & " are differents."
    End If
    'other syntax
    If A = B Then
        Debug.Print A & " = " & B
    Else: Debug.Print A & " and " & B & " are differents."
    End If
    'other syntax
    If A = B Then Debug.Print A & " = " & B _
    Else Debug.Print A & " and " & B & " are differents."    
    'other syntax
    If A = B Then Debug.Print A & " = " & B Else Debug.Print A & " and " & B & " are differents."
    If A = B Then Debug.Print A & " = " & B Else: Debug.Print A & " and " & B & " are differents."
End Sub

If ElseIf Else End If

Sub C_S_ElseIf()
Dim A$, B$

    A = "Hello"
    B = "World"
    'test
    If A = B Then Debug.Print A & " = " & B
    'other syntax
    If A = B Then
        Debug.Print A & " = " & B
    ElseIf A > B Then
        Debug.Print A & " > " & B
    Else
        Debug.Print A & " < " & B
    End If
End Sub

Select Case

Sub C_S_Select_Case()
'With Strings
Dim A$, C&

    A = "Hello"
    Select Case A
        Case "World"
            Debug.Print "A = World"
        Case "Hello"
            Debug.Print "A = Hello"
        Case Else
            Debug.Print "You make a mistake"
    End Select
'With numerics
    C = 11
    Select Case C
        Case Is <= 10
            Debug.Print "C <= 10"
        Case Is < 20, Is > 10
            Debug.Print "10 < C < 20"
        Case Is >= 20
            Debug.Print "C >= 20"
    End Select
'Select Case Boolean
    'With Strings
    Select Case False
        Case A <> "Hello"
            Debug.Print "A = Hello"
        Case A Like "*orl*"
            Debug.Print "A Not Like *orl*"
        Case Else
            Debug.Print "You make a mistake"
    End Select                  'return : "A = Hello"
    'Other conditions's order
    Select Case False
        Case A Like "*orl*"
            Debug.Print "A Not Like *orl*"
        Case A <> "Hello"
            Debug.Print "A = Hello"
        Case Else
            Debug.Print "You make a mistake"
    End Select                  'return : "A Not Like *orl*"
    'With numerics
    Select Case True
        Case C <= 10
            Debug.Print "C <= 10"
        Case C < 20, C > 10
            Debug.Print "10 < C < 20"
        Case C >= 20
            Debug.Print "C >= 20"
    End Select
End Sub

Inline IF

Sub C_S_IIF()
    Dim myName
    myName = 2
    Debug.Print IIf(myName = 1, "Bryan", "Justin")
    'return : Justin
End Sub

Switch

Sub C_S_Switch()
    Dim myName
    myName = 2
    Debug.Print Switch(myName = 1, "Bryan", myName = 2, "Justin", myName = 3, "John")
    'return : Justin
End Sub

VBScript

if-then-else

Block form:

If condition1 Then
     statement
End If

If condition1 Then
    statement
ElseIf condition2 Then
    statement
...
ElseIf conditionN Then
    statement
Else  
    statement
End If

Line form:

If condition Then statement

If condition Then statement Else statement

select-case

Select Case Expression
    Case Value1: statement
    Case Value2: statement
    ...
    Case ValueN: statement
    Case Else:   statement
End Select

Select Case Expression
    Case Value1
        statements 
    Case Value2 
        statements 
    ...
    Case ValueN 
        statements 
    Case Else 
        statements 
End Select

Verbexx

@VAR a b = 1 2;                   

// -------------------------------------------------------------------------------------
//  @IF verb  (returns 0u0 = UNIT, if no then: or else: block is executed) 
//  ========  (note: both then: and else: keywords are optional)

@SAY "@IF 1   " ( @IF (a > b) then:{"then:"} else:{"else:"} ); 
@SAY "@IF 2   " ( @IF (b > a) else:{"else:"} then:{"then:"} );
@SAY "@IF 3   " ( @IF (a > b) then:{"then:"}                );
@SAY "@IF 4   " ( @IF (b > a) then:{"then:"}                );
@SAY "@IF 5   " ( @IF (a > b) else:{"else:"}                );
@SAY "@IF 6   " ( @IF (b > a) else:{"else:"}                );
@SAY "@IF 7   " ( @IF (b > a)                               );

//  ---------------------------------------------------------------------------------
//  ? verb (conditional operator)
//  ====== ( 1st block (TRUE) is required, 2nd block (FALSE) is optional)

@SAY "? 1     " ( (a < b) ? {"1st"} {"2nd"} ); 
@SAY "? 2     " ( (a > b) ? {"1st"} {"2nd"} ); 
@SAY "? 3     " ( (a < b) ? {"1st"}         ); 
@SAY "? 4     " ( (a > b) ? {"1st"}         ); 

// -----------------------------------------------------------------------------------
// @CASE verb
// ==========
//
//  - executes code block for first when: condition that evaluates to TRUE
//
//  - normally, ends after running that code block 
//
//  - if no when: conditions are true, executes else: code block (if present)
//
//  - can exit a when: block with @CONTINUE case: verb -- causes @CASE to continue 
//    looking for more true when: blocks or the else: block

@VAR n = 0; 
@LOOP times:3
{
  @SAY ( "n =" n "        @CASE results:"
         ( @CASE
             when:(n == 0) { "n == 0(1)"                   } 
             when:(n == 0) { "n == 0(2)"                   } 
             when:(n == 1) { "n == 1(1)"; @CONTINUE case:  }
             when:(n == 1) { "n == 1(2c)"                  }
             else:         { "else"                        }
         ) 
       )
  ;
  n++;
};

/] -----------------------------------------------------------------------

Output: 

@IF 1    else:
@IF 2    then:
@IF 3    0_u0
@IF 4    then:
@IF 5    else:
@IF 6    0_u0
@IF 7    0_u0
? 1      1st
? 2      2nd
? 3      1st
? 4      0_u0
n = 0         @CASE results: n == 0(1)
n = 1         @CASE results: n == 1(2c)
n = 2         @CASE results: else


Verilog

if-else

if( expr_booleana ) command1;
else                command2;

case

case( expr_booleana )
valor1: command1;
valor2: command2;
...
default: commandN;
endcase


Visual Basic

if-then-else

Block form

If condition Then
     statement
End If

If condition Then
    statement
Else  
    statement
End If

If condition1 Then
    statement
ElseIf condition2 Then
    statement
...
ElseIf conditionN Then
    statement
Else  
    statement
End If

Line form

If condition Then statement

If condition Then statement Else statement

select-case

Select Case Expression
    Case Value1: statement
    Case Value2: statement
    ...
    Case ValueN: statement
    Case Else:   statement
End Select

Select Case Expression
    Case Value1
        statements 
    Case Value2 
        statements 
    ...
    Case ValueN 
        statements 
    Case Else 
        statements 
End Select

inline if-then-else

IIf(expr, then-value, else-value)

Example:

    myName = 2
    Debug.Print IIf(myName = 1, "John", "Jack")
    'return : "Jack")

inline switch

Switch(expr-1, value-1[, expr-2, value-2 … [, expr-n,value-n]])

Example:

    myName = 2
    Debug.Print Switch(myName = 1, "James", myName = 2, "Jacob", myName = 3, "Jeremy")
    'return : "Jacob"

Visual Basic .NET

if-then-else

Basic

Dim result As String, a As String = "pants", b As String = "glasses"

If a = b Then
  result = "passed"
Else
  result = "failed"
End If

Condensed

Dim result As String, a As String = "pants", b As String = "glasses"

If a = b Then result = "passed" Else result = "failed"

If a = b Then
  result = "passed"
Else : result = "failed"
End If

If a = b Then : result = "passed"
Else
  result = "failed"
End If

if-then-elseif

Dim result As String, a As String = "pants", b As String = "glasses"

If a = b Then
  result = "passed"
ElseIf a <> b Then
  result = "failed"
Else
  result = "impossible"
End If

select-case-else

Dim result As String, a As String = "pants", b As String = "glasses"

Select Case a
  Case b
    result = "match"
  Case a : result = "duh"
  Case Else
    result = "impossible"
End Select

inline-conditional

Imports Microsoft.VisualBasic

...

Dim result As String = CType(IIf("pants" = "glasses", "passed", "failed"), String) 'VB 1-8

Dim result As String = If("pants" = "glasses", "passed", "failed") 'VB 9

generic-inline-conditional

Works with: Visual Basic .NET version 8.0
Imports Microsoft.VisualBasic

...

Function IIf2(Of T)(ByVal condition As Boolean, ByVal truepart As T, ByVal falsepart As T) As T
  If condition Then Return truepart Else Return falsepart
End Function

...

Dim result As String = IIf2("pants" = "glasses", "passed", "failed") ' type is inferred

generic-inline-conditional

Language Version: 9.0+

Dim result As String = If("pants" = "glasses", "passed", "failed") ' type is inferred

V (Vlang)

If and match are the general purpose conditional structures in V (Vlang), although the language certainly contains other conditional elements.

If

Simplest usage is,

if boolean_expression {
    statements
}

The braces are required, even around a single statement.

if boolean_expression {
    statements
} else {
    other
    statements
}

Braces are required around else clauses, as above, unless the statement of the else clause is another if statement. In this case the statements are chained like this,

if boolean_expression1 {
    statements
} else if boolean_expression2 {
    otherStatements
}

Match

Simple usage is,

match true {
    boolean_expression1 {
        statements
    }
    boolean_expression2 {
        other
        statements
    }
    else {
        last
        resort
        statements
    }
}

Because match can work with any number of arbitrary boolean expressions, it replaces if/elseif chains often found in other programming languages.

Match can also switch on the value of an expression, as in,

switch expression_of_any_type {
    value1 {
        statements
    }
    value2, value3, value4 {
        other
        statements
    }
    else {}
}

As shown, multiple values can be listed for a single case clause. Since vlang is statically typed, the types of value1, 2, 3, and 4 must match the type of the expression.

Vorpal

if-then-else

if(condition){
   result = 'met'
}
else{
   result = 'not met'
}

Woma

Woma has simple if statements.

break-if

Valid inside of a <@> (loop) block.

<%>condition

continue-if

Valid inside of a <@> (loop) block.

<$>condition

if statement

Valid inside of a function or a <@> (loop) block.

condition = True
condition<?>print(condition)

Wrapl

simple conditional

Conditionals in Wrapl are expressions. Either success or failure can be omitted from the expression.

condition => success // failure
condition => success
condition // failure

goal directed evaluation

Wrapl's goal directed evaluation can be used to control conditional execution. The select-right operator & produces the values of the right operand for each value produced by the left operand. Thus if the left operand fails to produce any values, the right operand is never evaluated.

condition & success

The sequence operator | produces the values of the left operand followed by the values of the right operand. Thus if the left operand produces enough values (for example in a context where only one value is required), the right operand is never evaluated.

condition | failure

Wren

The if/else statement and the ternary operator (?:) are Wren's basic conditional structures though it can be argued that the && and || operators, which do short-circuit evaluation, should be included under this heading as well.

for (b in [true, false]) {
    if (b) {
        System.print(true)
    } else {
        System.print(false)
    }

    // equivalent code using ternary operator
    System.print(b ? true : false)

    // equivalent code using && operator
    System.print(b && true)

    // equivalent code using || operator
    System.print(b || false)

    System.print()
}
Output:
true
true
true
true

false
false
false
false

X86 Assembly

ifs/elseifs/elses

Assembly doesn't work on if/else if/else statements(Unless you're using MASM or alike assemblers:)). Rather, it has conditional jumps which work off flags set by the comparison. Take this general statement from C.

if(i>1)
   DoSomething

FailedSoContinueCodeExecution.

There are actually a number of ways to implement that in assembly. The most typical way would be something like..

cmp i, 1
jg _DoSomething
FailedSoContinueCodeExecution

Using the "jg" instruction,our code will jump to _DoSomething if the comparison(cmp i,1) made our ZF(ZeroFlag) flag well, zero. Which means only 1 thing. It is in fact greater than. In contrast, if i is in fact equal or less than 1, ZF is set to 1. The Zero Flag will remain set as long as we don't use any instructions that alter flags(comparisons for example). So, here's another C example

if(i>1)
   DoSomething
else if(i<=1)
   DoSomethingElse
FailedSoContinueCodeExecution

In this case, we can use our previous example as a skeleton.

cmp i, 1
jg _DoSomething
jle _DoSomethingElse
FailedSoContinueCodeExecution

This does another state check on the Zero flag(actually jg/jle also check another flag, but that's not overly important) using jle. JumpifLessthanorEqual. Essentially, jle jumps if ZG is set to 1. So, it's jump condition is the opposite to jg.

One last commonly used condition.

if(i==1)
   DoSomething
else
   DoSomethingElse
FailedSoContinueExecution

In this case, we'd do this.

cmp i, 1
je _DoSomething
jne _DoSomethingElse
FailedSoContinueExecution

The je/jne jump instructions are again like jg/jle opposites of each other and again like je/jne rely on how the zero flag is set in the previous comparison.
There are many different conditional jumps in assembly and many ways to set them, test, and, or to name a few. The ones covered are just some commonly used ones in order to show how assembly deals with conditional statements.

XLISP

If

An IF expression has the form (IF <condition> <then-clause> <opt-else-clause>), for example:

(if (eq s "Rosetta Code")
    "The well-known programming chrestomathy site"
    "Some other website, maybe, I dunno" )

If the condition evaluates to anything except NIL or the empty list (which are equivalent), it is counted as true and the whole expression evaluates to the value of the then clause; otherwise it evaluates to the value of the optional else clause, if one is provided, or else to the empty list.

Case

CASE expressions resemble the multi-way branching constructs found in most programming languages: an expression is evaluated, and the value of the whole expression is provided by the first clause that evaluates to a true value. Optionally, an ELSE expression can be provided, in case none of the clauses fits.

(case s
    ("Rosetta Code" "Ah yes, the chrestomathy site")
    ("Stack Overflow" "Oh dear me, having problems are you?")
    ("Github" "Say no more")
    (else "Sorry, never heard of it") )

Cond

COND is a more general conditional than IF or CASE: it resembles a CASE statement, but with the option of using a different conditional expression in each clause. A default value can be provided using ELSE, as with CASE, or any expression that is guaranteed to return a value other than NIL or the empty list.

(cond
   ((eq s "Rosetta Code") "Chrestomathy site")
   ((> n 37) "Some other appropriate value, presumably")
   (t "If you're seeing me, s wasn't equal to Rosetta Code and n must have been 37 or below") )

XPL0

     if BOOLEAN EXPRESSION then STATEMENT
     if BOOLEAN EXPRESSION then STATEMENT else STATEMENT
     if BOOLEAN EXPRESSION then EXPRESSION else EXPRESSION
     case INTEGER EXPRESSION of
             INTEGER EXPRESSION, ... INTEGER EXPRESSION: STATEMENT;
             ...
             INTEGER EXPRESSION, ... INTEGER EXPRESSION: STATEMENT
             other STATEMENT
     case of
             BOOLEAN EXPRESSION, ... BOOLEAN EXPRESSION: STATEMENT;
             ...
             BOOLEAN EXPRESSION, ... BOOLEAN EXPRESSION: STATEMENT
             other STATEMENT

XSLT

The <xsl:if> element allows simple conditional processing.

<xsl:if test="condition">
  <!-- executed if XPath expression evaluates to true -->
</xsl:if>

The <xsl:choose>, <xsl:when>, and <xsl:otherwise> elements allow more general conditional processing.

<xsl:choose>
  <xsl:when test="condition1">
    <!-- included if condition1 evaluates to true (like C `if`) -->
  </xsl:when>
  <xsl:when test="condition2">
    <!-- included if all previous conditions evaluated to false and
         condition2 evaluates to true (like C `else if`) -->
  </xsl:when>
  <--
    ...
  -->
  <xsl:otherwise>
    <!-- included if all previous conditions evaluated to false
         (like C `else`) -->
    <!-- (The `otherwise` element is optional) -->
  </xsl:otherwise>
</xsl:choose>

The XPath expressions in the test attribute are evaluated in boolean context (converted as if by the boolean function if necessary).

<xsl:if test="@attrib = 'foo'">...</xsl:if>
<xsl:if test="position() != last()">...</xsl:if>
<xsl:if test="not(false())">...</xsl:if>

<!-- Some XPath expressions must be escaped. -->
<xsl:if test='contains(node, "stuff") and (position() &gt; first())'>...</xsl:if>

<!-- The following two examples are synonymous because the test attribute is
     implicitly converted to boolean. -->
<xsl:if test="boolean($expr)">...</xsl:if>
<xsl:if test="$expr">...</xsl:if>


Yabasic

// if-then-endif, switch / end switch
// on gosub, on goto
// repeat / until, do / loop, while / end while


if expr_booleana then
   sentencia(s)
endif 


if expr_booleana sentencia(s)


if expr_booleana1 then
   sentencia(s)
elsif expr_booleana2
   sentencia(s)
elsif expr_booleana3 then
   sentencia(s)
else
   sentencia(s)
endif 


switch expr_booleana
   case valor1
      sentencia(s)
   case valor2
      sentencia(s)
   default
      sentencia(s)
end switch


on expresion gosub label1, label2
   sentencia(s)
label label1
   sentencia(s)
return
label label2
   sentencia(s)
return


on expresion goto label1, label2
   sentencia(s)
label label1
   sentencia(s)
label label2
   sentencia(s)


repeat
   sentencia(s)
until valor1


do
   sentencia(s)
loop


while expr_booleana
   sentencia(s)
end while


Z80 Assembly

Control structures in assembly languages are typically based around the zero and carry flags. If two quantities are equal, subtracting them will result in zero. The CP instruction compares the accumulator with another value, either an immediate, an 8-bit register, or the byte pointed to by HL, IX+#, or IY+#, where # is an 8-bit signed offset. CP sets the processor flags the same way SUB would, except the value in the accumulator is never changed. This lets you compare two values "non-destructively." CP must use the accumulator as its primary operand, and can't be directly used to compare 16-bit register pairs, though there are workarounds that use a combination of instructions.

The compare instruction is often used in combination with jumps, calls, and returns to implement high-level control structures.

If-Then-Else

We'll look at this example in C and in Z80 Assembly:

char x;
if (x == 20)
{
   doThis();
}
else
{
   doThat();
}
cp 20 
jr nz,Else
   call doThis
   ;execution returns here after the call
   jr done
Else:
   call doThat
done

While the Z80 does support conditional calls and returns, in this example they weren't a good choice, since there's no guarantee that the function doThis won't alter the flags, and you can't back up/restore the flags on the stack without backing up/restoring the accumulator at the same time, which isn't always what you want.

In this example, we'll look at situation where there is no else block (in other words, if condition is not met, do nothing and continue with the program.)

C code:

if (x == 20)
{
   DoSomething();
}
// rest of program

Z80 Assembly code:

cp 20
call z,DoSomething
;rest of program

If the accumulator didn't equal 20, no CALL will actually take place.

Switch

Switch cases can be implemented in a few ways. The simplest way is by checking each value individually.

ld a,(HL)   ;switch (HL)
 cp 1        ;case (1)
 jr nz,+     ;branch to next colon (note: not all assemblers support this syntax)
    call HL_EQUALS_1
:
 cp 2        ;case (2)
 jr nz,+     ;branch to next colon
    call HL_EQUALS_2
:
 cp 50
 jr nz,+
    call HL_EQUALS_50
:
 ;rest of program

The above example continues to check the other cases even after a match is found. If you don't want that to happen, do this:

ld a,(HL)   ;switch (HL)
 cp 1        ;case (1)
 jr nz,+     ;branch to next lone colon
    call HL_EQUALS_1
    jr done  ;You could also write "jr +++"
:
 cp 2        ;case (2)
 jr nz,+     ;branch to next lone colon
    call HL_EQUALS_2
    jr done  ;you could also write "jr ++"
:
 cp 50
 jr nz,+
    call HL_EQUALS_50
:
done:   
 ;rest of program

Another way to implement switch cases is with a lookup table of functions. This uses a command called JP (HL). Despite the parentheses around (HL), no dereferencing takes place - the program counter is simply set to the value in HL. This method is a little more complicated but allows you to create an indexed array of functions and choose one to execute. This method doesn't allow for fallthrough. You have to create a dispatcher that you can CALL, and pre-load the accumulator with the desired index and HL with the pointer to the 0th function in the table. Wherever you go needs to end in a RET instruction, so that you'll end up just after you CALLed the dispatcher.

Dispatch: ;remember, you need to CALL this address for it to work properly. Otherwise your program will most likely crash.
add a  ;this is a table of 16-bit values, so multiply the index by 2.
ld a,(hl)    ;get the low byte of the function addr. you wish to call
push af
   inc hl
   ld a,(hl) ;get the high byte of the function addr. you wish to call
   ld H,a    ;store the high byte in H
pop af
ld L,a       ;store the low byte in L
jp (HL)      ;now you've jumped to the desired function. Its RET will return execution to the instruction just after "CALL Dispatch"

The disadvantage to this method is that it relies on the case values being consecutive. If they're not, you're better off using the other method, but you can still implement this if you pad the lookup table with pointers to a RET, which will make you return immediately back to after the dispatch call, without having done anything.

zkl

if (x) y else z;
if(a)b else if (c) else d; etc
x:=(if (a) b else c);

a and b or c  // usually the same as if(a) b else c, beware if b evals to False

switch(x){
  case(1){...}
  case("2"){...}  // matches anything
  case(a)[fallthrough]{...}  // no break, no break has to be explicit
  case(b){...}
  else {...} // case a C's default, has to be at the end
}

Zig

const std = @import("std");
const builtin = @import("builtin");

fn printOpenSource(comptime is_open_source: bool) !void {
    if (is_open_source) {
        try std.io.getStdOut().writer().writeAll("Open source.\n");
    } else {
        try std.io.getStdOut().writer().writeAll("No open source.\n");
    }
}
fn printYesOpenSource() !void {
    try std.io.getStdOut().writer().writeAll("Open source.\n");
}
fn printNoOpenSource() !void {
    try std.io.getStdOut().writer().writeAll("No open source.\n");
}
const fnProto = switch (builtin.zig_backend) {
    .stage1 => fn () anyerror!void,
    else => *const fn () anyerror!void,
};
const Vtable = struct {
    fnptrs: [2]fnProto,
};

// dynamic dispatch: logic(this function) + vtable + data
fn printBySelectedType(data: bool, vtable: Vtable) !void {
    if (data) {
        try @call(.{}, vtable.fnptrs[0], .{});
    } else {
        try @call(.{}, vtable.fnptrs[1], .{});
    }
}

pub fn main() !void {
    // if-else
    if (true) {
        std.debug.assert(true);
    } else {
        std.debug.assert(false);
    }
    // comptime switch
    const open_source = comptime switch (builtin.os.tag) {
        .freestanding => true,
        .linux => true,
        .macos => false,
        .windows => false,
        else => unreachable,
    };
    // conditional compilation
    std.debug.assert(builtin.zig_backend != .stage2_llvm);
    // static dispatch (more complex examples work typically via comptime enums)
    try printOpenSource(open_source);
    // dynamic dispatch (runtime attach function pointer)
    var vtable = Vtable{
        .fnptrs = undefined,
    };
    // runtime-attach function pointers (dynamic dispatch)
    vtable.fnptrs[0] = printYesOpenSource;
    vtable.fnptrs[1] = printNoOpenSource;
    try printBySelectedType(open_source, vtable);

    // TODO Arithmetic if once https://github.com/ziglang/zig/issues/8220 is finished
}