Search code examples
coding-styleswitch-statement

Switch statement fall-through...should it be allowed?


For as long as I can remember I have avoided using switch statement fall-through. Actually, I can't remember it ever entering my consciousness as a possible way to do things as it was drilled into my head early on that it was nothing more than a bug in the switch statement. However, today I ran across some code that uses it by design, which got me immediately wondering what everyone in the community thinks about switch statement fall-through.

Is it something that a programming language should explicitly not allow (like C# does, though it supplies a workaround) or is it a feature of any language that is powerful enough to leave in the programmer's hands?

Edit: I wasn't specific enough to what I meant by fall-through. I use this type a lot:

    switch(m_loadAnimSubCt){
        case 0:
        case 1:
            // Do something
            break;
        case 2:
        case 3:
        case 4:
            // Do something
            break;
   }

However, I'm concerned about something like this.

   switch(m_loadAnimSubCt){
        case 0:
        case 1:
            // Do something, but fall through to the other cases
            // after doing it.

        case 2:
        case 3:
        case 4:
            // Do something else.
            break;
   }

This way whenever the case is 0, 1 it will do everything in the switch statement. I've seen this by design and I just don't know if I agree that switch statements should be used this way. I think the first code example is very useful and safe. The second seems kind of dangerous.


Solution

  • It may depend on what you consider fallthrough. I'm ok with this sort of thing:

    switch (value)
    {
      case 0:
        result = ZERO_DIGIT;
        break;
    
      case 1:
      case 3:
      case 5:
      case 7:
      case 9:
         result = ODD_DIGIT;
         break;
    
      case 2:
      case 4:
      case 6:
      case 8:
         result = EVEN_DIGIT;
         break;
    }
    

    But if you have a case label followed by code that falls through to another case label, I'd pretty much always consider that evil. Perhaps moving the common code to a function and calling from both places would be a better idea.

    And please note that I use the C++ FAQ definition of "evil"