Is there ANY chance we can fix the bitwise operator precedence rules?

Robert Jacques sandford at jhu.edu
Fri Jun 18 19:53:07 PDT 2010


On Fri, 18 Jun 2010 20:23:45 -0400, Jonathan M Davis  
<jmdavisProg at 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.


More information about the Digitalmars-d mailing list