On Fri, 18 Jun 2010 20:23:45 -0400, Jonathan M Davis <jmdavisp...@gmail.com> wrote:

bearophile wrote:

Jonathan M Davis:
but requiring that each case end with a break would seriously restrict
the usefulness of switch statements.

Time ago there was a long thread about this topic (and in the meantime
Walter has added the "static switch" that burns the fat chance to add to
D2 a second safer switch that fixes both the common kind of bugs caused by
C switch statements and not just the enum-switch bugs avoided by the
current static switch!) and I am not sure it's right to restart that
discussion again. Anyway, can you show me one example where requiring that
each case end with a break OR goto restricts the usefulness of switch
statements?

Bye,
bearophile

Well, I would pount out that you mentioning it more or less reopens the
discussion, but in any case, the simplest answer would be if you have
multiple values for the variable that your switching on which should all be using the same kind. Fortunately, D simplifies that by allowing you to put multiple values with a single case. An extension of that is if you have two cases which are almost identical but where one of them needs to do something
first before the code that is common between both cases.

A more complicated example would be one where you're doing something like
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);
        }
}

Even if you drop the whole issue of the loop interleaving with the case
statements in Duff's Device, you could still have a situation where you
would have a series of things that should be done with how many of them you do depending on what the value you're switching on and you doing all of the
preceding ones for each greater value. e.g.

switch(value)
{
    case 0:
        do something...
    case 1:
        do something else...
    case 2:
        do a third thing...
    case 3:
        do yet more...
}

If value were 0, you'd need to do everything that is done at each case
statement, while if it were 2, you'd only need to do whatever is done for 2
and 3.

I grant you that in most cases, you don't need to do that sort of thing and that missing a break is an error, but there are definitely cases where being able to have case statements fall through can be quite handy. If it wouldn't likely break compatability with C/C++, I'd suggest requiring a continue if you wanted to fall through (since that wouldn't require a new keyword), but I think that that would break compatibility in cases where the switch is in a loop, so that's probably a no-go, and I very much doubt that Walter would
want to add the keyword fallthrough or something similar.

It is an issue, but it's a well-known one, and I don't think that requiring
a break is worth the loss of power. If we push for a change, it should
probably be in requiring a keyword to indicate that you meant to fall
through. That would give you the safety without losing the power.

- Jonathan M Davis

continue is a valid keyword inside a switch statement, so no, you can't use it.

Reply via email to