switch
Executes a specific block of PSL code based on the value of a variable.
Syntax
switch ( expression )
{
case a : { BLOCK }
case b : { BLOCK }
. . .
case p ,q, r : { BLOCK }
. . .
case n: { BLOCK }
default: { BLOCK }
}
Parameters
Parameter | Definition |
---|---|
expression | PSL expression whose integer value specifies the PSL statement BLOCK that will be executed |
a,b, ... p,q,r, ... n | values indicating the value of the variable that will cause the corresponding BLOCK to be executed |
BLOCK | one or more statements that are executed when the corresponding case value equals variable |
Description
The switch
statement evaluates expression and based on its integer value executes a specific PSL BLOCK. The case
labels correspond to the values of expression for which a specific PSL BLOCK is available.
If the value of expression falls outside the range of the values in the case
labels, execution continues with the BLOCK corresponding to the default
label. If no default
label exists, execution will continue with the first statement following the switch
statement.
The switch
statement is similar in form and function to the C switch
statement.
The PSL switch
statement executes in almost the same way as a long sequence of if
- then
- else
- if
statements. A case
or default
clause is effectively a run-time statement that specifies a comparison against the value of expression:
- If the value of expression matches a
case
, execution moves inside the BLOCK for thecase
ordefault
clause; and after completing BLOCK, execution continues after the entire switch statement (that is, there is no falling through to the next case clause). - If the value of expression does not match a
case
, execution skips to thedefault
clause; and if there is none, execution moves to the statement following theswitch
statement.
Any statement within the switch
statement case block that is not part of a case
or default
BLOCK executes only if all the case
labels above it failed to match expression (that is, it executes as part of the normal sequence of control flow).
Differences between the PSL and C switch Statements
The following differences exist between the PSL switch
statement and the C switch
statement:
- PSL
case
expressions can be dynamically evaluated expressions whereas C only permits constant expressions. - The colon delimiter that separates the
case
label from the executable BLOCK is optional in PSL and required in C. - PSL requires that the
default
label follow allcase
labels in theswitch
statement case block, whereas C allowsdefault
to appear anywhere within the case labels. PSL returns a compilation error if one or morecase
labels followdefault
. - PSL does not return a compilation error for duplicate
case
labels in theswitch
statement case block, whereas C does. In PSL, the second of the duplicatecase
labels is unreachable. - PSL allows multiple cases that execute a common BLOCK to be specified as a comma separated list within a single
case
label, where C requires that each case be a separatecase
label stacked above a single BLOCK. (Conversely, the stacked labels will not work in PSL.) - Execution of a PSL BLOCK does not fall through to the next
case
label and BLOCK, as it does the Cswitch
statement. Upon reaching the closing right brace of acase
ordefault
BLOCK, execution moves to the end of the PSLswitch
statement. - The PSL
switch
statement uses thelast
statement to exit from a BLOCK, whereas C uses thebreak
statement. Thelast
statement exits the innermostswitch
statement or loop. However, because of the absence of fall-through in PSL, there is little need to use thelast
statement in theswitch
statement.
Similarities between the PSL and C switch Statements
The following similarities exist between the PSL switch
statement and the C switch
statement:
- both generate a compiler error upon detecting two
default
labels in a singleswitch
statement - both permit nested
switch
statements
Efficiency of switch Statements versus if-then-elsif Sequences
Because of the similar method of implementation, there is almost no difference in efficiency between PSL switch
statements and if
- then
- elsif
sequences. Programming style is the main consideration in the choice. To speed up switch
statements, BMC Software recommends that you specify the most likely cases first. The speedup is also true of if
- then
- elsif
sequences.
Pitfall: switch Statement case Labels That Modify case Variables
The case
BLOCKs are evaluated at run-time in their order of appearance:
case
order for BLOCKs- left-to-right for expressions in the comma-separated lists of multiple-case labels
All expressions within a comma-separated list are evaluated before the case
label. This evaluation occurs even if the first expression is a match.
This sequence and method of evaluating the case label can be a dangerous pitfall if any expression in the list modifies either variable for the current switch
statement or a variable used in another case
expression.
Pitfall: Statements Inside a switch Statement That Are Not Part of a BLOCK
Under PSL, statements within a switch
statement that are not part of a BLOCK (free statements) can and will be executed if they are reached by the flow of execution. The condition for control flow to reach these statements is that variable cannot match any of the case
labels that precede them within the switch
statement.
Pitfall: Nesting case Labels That Use the Same Variable
PSL does not return a warning or error message when two case labels evaluated against expression are nested one inside the other. Two examples of this situation are shown in the following PSL switch example:
switch(x)
{
case 1:
{
f1() # Function f1 Called
case 2 :{f2();} # Function f2 Unreachable
f3(); # Function f3 Called
}
default: {case 4: {f4();}} # Function f4 called if x=4
}
Since case
and default
labels are run-time statements, the effect of one case
label nested within another is that expression must match the case
value for the case
BLOCK to execute. This means that expression must equal two different values! In case
1 of the example, f2
will never be called because x
cannot equal both 1
and 2
.
In the default
case of the example, f4
will be called if expression = 4 because there is no case
4 defined in the switch
statement. When expression = 4, the default BLOCK executes, containing the case
4 BLOCK call to function f4
.
Although nesting case
labels within one another is possible and may have some utility, BMC Software views them as a potential pitfall both because of the possibility of creating unreachable BLOCKs and because future PSL versions may not support case
label nesting.
Comments
Log in or register to comment.