Date post: | 18-Jan-2016 |
Category: |
Documents |
Upload: | jewel-higgins |
View: | 215 times |
Download: | 0 times |
Copyright 2004-2005 - Curt Hill
The C/C++ switch Statement
A multi-path decision statement
Copyright 2004-2005 - Curt Hill
Flow of Control in C/C++• Recall the flow statements in C and
C++:– Decisions
• If• Switch Case
– Loops• for• while• do• Break
• Here we consider the switch
Copyright 2004-2005 - Curt Hill
Why?• There are times when we would
use the following type of nested ifif(a == 2) x = 5;else if(a == 4) { x = 12 * y;… }else if(a == 8) {…}else if(a == 12) {…}else cout << “Error”;
Copyright 2004-2005 - Curt Hill
General Form of This• Each if has a similar condition
– One variable compared with a constant– Comparison is always equality
• The Then statement does something• The Else statement does another if• There is only one variable and one
comparison in all the ifs• Generally such a construction needs
a switch-case not an if
Copyright 2004-2005 - Curt Hill
If and Switch• An if is a decision of one path out
of two– A bool has only two values
• A switch is a decision of one path out of many
• A switch is based on an int, char, enumeration – Which may have many values
Copyright 2004-2005 - Curt Hill
General Form of Switch
switch (integral expression) { case con1: many statements break;
case con2: many statements break;
case con3: many statements break;…}
Copyright 2004-2005 - Curt Hill
Notes• switch, case and break are reserved
words• The parenthesized expression is
evaluated to obtain a value– This value chooses the path– The type of the value must be an integer,
character or enumeration– May not be floating point, string or any
object
• The case indicates a path– Must be followed by a constant– The constant value following the case must
match the type of the expression– It may be a defined, literal or constant
declaration
Copyright 2004-2005 - Curt Hill
Exampleswitch (credit_hours / 32) {
case 0:
standing = “freshman”;
break;
case 1:
standing = “sophomore”;
break;
case 2:
standing = “junior”;
break;
case 3:
standing = “senior”;
break;
}
Copyright 2004-2005 - Curt Hill
More Notes• There is only one set of braces
which surrounds all the cases• The path starts with a case and
ends with a break• Multiple cases allow for multiple
ways to identify a path• The cases do not have to be in any
particular order• Duplicate cases are not allowed
– Compiler actually checks for this
Copyright 2004-2005 - Curt Hill
Multiple case exampleswitch (grade) {
case ‘a’:
case ‘A’:
points = 4 * credit_hours;
break;
case ‘b’:
case ‘B’:
points = 3 * credit_hours;
break;
…
}
Copyright 2004-2005 - Curt Hill
Missing Path
• What happens if the switch expression does not match any case label?
• Equivalent to the correct case followed by a break– It does nothing
• The default label allows a catch all case
Copyright 2004-2005 - Curt Hill
Example Revisited
AnsiString standing;switch (credit_hours / 32) { case 0: standing = “freshman”; break;… case 3: standing = “senior”; break;default: standing = “unknown”; cout << “Error”;
}
Copyright 2004-2005 - Curt Hill
default
• default is a reserved word• The default label acts like a case label
with out case or specifying a value• It catches any value not explicitly
mentioned in a case• It is customarily last, but does not have
to be there• Leaving it out is the same as doing
nothing for all the unmentioned cases
Copyright 2004-2005 - Curt Hill
The Break Statement
• The break has the effect of leaving a switch or loop
• The last path does not need a break• A return will also work since it
leaves the entire function/method not just the switch
• It is not required, but leaving it out makes for interesting flow
Copyright 2004-2005 - Curt Hill
Leaving out a break
• If a break is left out, execution will drop into the next part
• Leaving out the last break is not a problem since there is no next part
• Consider the following example
Copyright 2004-2005 - Curt Hill
Omitted break exampleswitch (val) { case 5: x += 5; case 12: x += 8; y = 2; break; case 6: x += 8; y = 4; break;}
If val is 5, x will have 13 added to it and y will be set to 2.
All the effect of val == 12 is also executed for x == 5.
Copyright 2004-2005 - Curt Hill
Omitted break notes
• This feature, inherited from C, is both good and bad
• It is somewhat good in that it allows an economy of code– Very few switches actually use this
feature
• It is usually bad because we seldom want it but the compiler never gives an error when a break is left out
Copyright 2004-2005 - Curt Hill
Equivalence of if and switch
• We have already seen an if doing what a switch can do
• The reverse is also true:switch(b>c){ case true: …. break; case false: …. break;}
• Always use what is more natural
Copyright 2004-2005 - Curt Hill
Common mistakes
• We cannot use strings or other objects for the case expression or labels
• We cannot use floating point values (float or double) for the expression or case labels– Recall the problems with floating
point equality
Copyright 2004-2005 - Curt Hill
Uses• switch is much less used than an if
– Just not as much need for it
• Often used to decode an integer or enumeration into a string– Month number into a name
• Used to select different actions for these as well
• Often used for a menu in console programs
Copyright 2004-2005 - Curt Hill
Readability• Indenting things is again the rule• My choice:
– Indent the case – Indent the code past the case
• Example:switch (item) { case 1: duh = duh2; … break case 2: … }
Enumerations and Switch
• We frequently use switch to input, output and decode enumerations
• Lets look at enumeration examples• Suppose:enum colortype {ctRed, ctGreen, ctBlue, ctWhite, ctBlack} color;
Copyright 2004-2005 - Curt Hill
Display• For displayable output use a switch:• String s = “None”;switch (color) { case ctRed: s = “Red”; break; case ctGreen: s = “Green”; break;… } // end of switch
Copyright 2004-2005 - Curt Hill
Copyright © 2005-2007 Curt Hill
Input
• Several approaches• Read in integer and use switch
case to make into enumeration• Read in string and use nested ifs to
create enumeration
Input with integer• In a console program:cout << “Enter color:”;int val;cin >> val;switch (val){ case 0: color = ctRed; break; case 1: …
• The same may be done using text input from windows
Copyright 2004-2005 - Curt Hill
Decoding• Decoding is using an enumeration
to perform different actions• Consider:switch (action){ case aExit: Close(); break; case aAbout: Application->MessageBox(……
Copyright 2004-2005 - Curt Hill
Finally• Switch is the one of many decision• Switch is the least used decision
– Many more ifs than switches– Less frequently used than most loops
• Use it when the pattern is seenif (a==1) …else if (a==3)…else if (a==2) …
Copyright © 2005-2007 Curt Hill