Technical name for switch statement without breaks - switch-statement

Does anyone know the "technical name" for a switch statement without breaks?
I have looked through several textbooks and searched online for quite a while with no results.

A switch statement with no breaks (and no loop, so it's not Duff's Device), I would just call a jump table.
Not one of the tools commonly used for structured programming, that's for sure.

When execution continues from one Case clause to the next it's called "fall-through".
switch (i) {
case 1:
// do something
case 2:
// do something else
break;
case 3:
// do another thing
}
Execution will "fall through" from case 1 to case, but not from case 2 to case 3. Is this what you're asking?

Fall through?
Or are you talking about a specific switch statement with no breaks, called Duff's Device?
send(to, from, count)
register short *to, *from;
register count;
{
register n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
}while(--n>0);
}
}

Related

good day i need tips on how to work around this problem

Write a C++ program using switch-case that would ask the user to type a temperature in Fahrenheit then will be converted by the program in Celsius and will display a suitable message according to temperature state below:
Temp < 0 then Freezing weather
Temp 1-10 then Very Cold weather
Temp 11-20 then Cold weather
Temp 21-30 then Normal in Temp
Temp 31-40 then Its Hot
Temp >=40 then Its Very Hot
i can work around the conversion process, but i cannot understand how to implement it using switch case,
switch-case can accept only expression and result of this expression. You can do it in a bit bulky way. But keep in mind that this style is low-readable and actually you'd better use simple if else constructions.
#include <iostream>
using namespace std;
int main()
{
int temperature;
cin >> temperature;
switch(temperature)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10:
cout << "Very cold";
break;
case 11:
case 12:
case 13:
case 14:
case 15:
case 16:
case 17:
case 18:
case 19:
case 20:
cout << "Cold";
break;
case 21:
case 22:
case 23:
case 24:
case 25:
case 26:
case 27:
case 28:
case 29:
case 30:
cout << "Normal";
break;
case 31:
case 32:
case 33:
case 34:
case 35:
case 36:
case 37:
case 38:
case 39:
case 40:
cout << "Hot";
break;
default:
if(temperature<0)
cout << "Freezing";
if(temperature>=40)
cout << "Very hot";
}
}

I want to convert this switch part of code in single line using ternary operators

for(int i=0; i<num.length; i++){
switch(num[i]/10){
case 10:
case 9:
aCount++;
break;
case 8:
bCount++;
break;
case 7:
cCount++;
break;
case 6:
dCount++;
break;
default: fCount++;
}
I want to short this code using multiple ternary operators in single line instead of switch statement. is it possible?
Not easily, no. First up, you haven't specified the language, it may be possible in C++ by using references, or in C by using pointers. But, even if it is possible, you'll most likely end up with truly ugly code.
If you're just looking to improve readability (the usual reason for shorter code, in my opinion), that can be done without changing the structure of the code, something like (assuming those are marks 0..100 and grades a..f):
for (int i = 0; i < num.length; i++) {
// Map <60 to f, 6x to d, 7x to c, 8x to b, 90+ to a.
switch (num[i] / 10) {
case 10: case 9: aCount++; break;
case 8: bCount++; break;
case 7: cCount++; break;
case 6: dCount++; break;
default: fCount++;
}
}

Convert if 'with range' to switch statement

Someone asked me today how to convert the following if statement to switch:
int i=5;
if(i>10)
{
Do Something;
}
else
{
Do Something else;
}
And I proposed that assuming i is an integer with only positive values:
int i=5;
switch(i)
{
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
case 10: Do Something else;
break;
case default: Do Something;
break;
}
Is there any other, more elegant way of doing it?
There is no direct way of doing that in C#, you can try the following.
int range = (number - 1) / 10;
switch(range)
{
case 0:
Console.WriteLine("1 to 10");
break;
case 1:
Console.WriteLine("11 to 20");
break;
//.,......
default:
break;
}
Not really sure how much clear it would be, IMO, the above approach would reduce the code readability, its better if you use if-else for the range checking. Also the above would work only if the range is constant.
First, note your two code examples (as were originally written) were not equivalent:
You're not Do[ing] Something Else when i==10 in your switch example.
But the original if code was checking on i>10 (as opposed to i>=10).
So case 10: should be explicitly included in your list of cases that fall through to Do Something Else.
To answer your question, I believe in some languages (eg pascal, objective C, I think?) a range similar to this is allowed:
switch(i)
{
case 1-10: // or is it "case 1 .. 10" ?
Do Something else;
break;
case default:
Do Something;
break;
}
But this is not supported in C#. Refer the very final point in the code discussion regarding "stacking" of case labels here MSDN switch(C#)

Switch fallthrough in Dart

I started learning Dart today, and I've come across something that my google skills are having trouble finding.
How do I have a fall-through in a non-empty case?
My use case is this: I'm writing a sprintf implementation (since dart doesn't have this too), which would work except for this fall-through thing. When parsing the variable type you can, for example, have "%x" versus "%X" where the upper case type tells the formatter that the output is supposed to be uppercase.
The semi-pseudocode looks like:
bool is_upper = false;
switch (getType()) {
case 'X':
is_upper = true;
case 'x':
return formatHex(is_upper);
}
The other ways I can think of doing this, would one of the following
1:
switch (getType()) {
case 'X': case 'x':
return formatHex('X' == getType());
}
2:
var type = getType();
if (type in ['x', 'X']) {
return formatHex('X' == getType());
}
Now, the second choice almost looks good, but then you have to remember that there are eleven cases, which would mean having eleven if (type in []), which is more typing that I'd like.
So, does dart have some // //$FALL-THROUGH$ that I don't know about?
Thanks.
The Dart specification gives a way for a switch case to continue to another switch case using "continue":
switch (x) {
case 42: print("hello");
continue world;
case 37: print("goodbye");
break;
world: // This is a label on the switch case.
case 87: print("world");
}
It works in the VM, but sadly the dart2js switch implementation doesn't yet support that feature.
From the dart language tour, your example of (2) should be correct.
var command = 'CLOSED';
switch (command) {
case 'CLOSED': // Empty case falls through.
case 'NOW_CLOSED':
// Runs for both CLOSED and NOW_CLOSED.
executeClose();
break;
}
It would be an error if you tried to do something as follows
var command = 'OPEN';
switch (command) {
case 'OPEN':
executeOpen();
// ERROR: Missing break causes an exception to be thrown!!
case 'CLOSED':
executeClose();
break;
}
EDIT: This seems to only have worked due to a bug in the implementation of Dart. See the Dart 1.x language spec, section "17.15 Continue".
The bug is now fixed, as reported in a comment, so this no longer works. Keeping for historical reasons.
Also, a simplification of Lasse's answer is to use a simple continue; instead of continue <label>; as in:
bool is_upper = false;
switch (getType()) {
case 'X':
is_upper = true;
continue;
case 'x':
return formatHex(is_upper);
}
You can't have a non-empty case body in Dart that falls through, this will raise an error.
What I tend to do with anything other than very simple switch statements is to refactor all the common code out into functions, so that you don't have this multi-level control flow in the switch itself.
In other words, something like:
switch (getType()) {
case 'X':
return formatHex(true);
case 'x':
return formatHex(false);
}
There's no reason why you need to have fallthrough. It comes in handy when the actions in a case section can be carried out in toto at the end of another case section, but this method can do that without fallthrough and without making your switch statement complex.
It can also handle more complex cases where there are common actions that aren't included in toto at the end. For example, you may want to do something at the start or in the middle of the case section. Calling common functions handles that more than well enough:
switch (getType()) {
case 'X':
doSomethingOnlyForUpperCase();
doSomethingCommon();
doSomethingElseOnlyForUpperCase();
return formatHex(true);
case 'x':
doSomethingCommon();
return formatHex(false);
}
I actually also do this for languages (such as C) that support this sort of non-empty fall-through since I believe it aids in readability and maintainability.
Dart in 202207, just empty, instead of continue label
PermissionStatus recordStatus =
await Permission.requestSinglePermission(
PermissionName.Microphone);
switch (recordStatus) {
case PermissionStatus.allow:
case PermissionStatus.always:
case PermissionStatus.whenInUse:
return;
default:
break;
}

How can I use a function pointer instead of a switch statement?

How can I use a function pointer instead of a switch statement?
A slightly different approach from the link posted by ars: You can use the value from the switch statement as an array index in an array of function pointers. So instead of writing
switch (i) {
case 0: foo(); break;
case 1: bar(); break;
case 2: baz(); break;
}
you can do this
typedef void (*func)();
func fpointers[] = {foo, bar, baz};
fpointers[i]();
Alternatively you can use the function pointers instead of numbers as described in ars's answer.
Here's a page that does a pretty good job of explaining this in C++:
http://oopweb.com/CPP/Documents/FunctionPointers/Volume/CCPP/FPT/em_fpt.html
EDIT:
Above link is broken as of June 2020. Cached here:
https://web.archive.org/web/20170606042951/http://oopweb.com/CPP/Documents/FunctionPointers/Volume/CCPP/FPT/em_fpt.html

Resources