The CASE and SWITCH statements are similar in function, but differ in the following ways:

  • Execution exits the CASE statement at the end of the matching statement. By contrast, execution within a SWITCH statement falls through to the next statement. The following table illustrates this difference:

    CASE

    SWITCH

    x=2
    CASE x OF
       1: PRINT, 'one'
       2: PRINT, 'two'
       3: PRINT, 'three'
       4: PRINT, 'four'
    ENDCASE
    x=2
    SWITCH x OF
       1: PRINT, 'one'
       2: PRINT, 'two'
       3: PRINT, 'three'
       4: PRINT, 'four'
    ENDSWITCH

    IDL Prints:

    two

    IDL Prints:

    two
    three
    four

    Because of this difference, the BREAK statement is often used within SWITCH statements, but less frequently within CASE. (For more information on using the BREAK statement, see BREAK.) For example, we can add a BREAK statement to the SWITCH example in the above table to make the SWITCH example behave the same as the CASE example:

       x=2
       SWITCH x OF
          1: PRINT, 'one'
          2: BEGIN
                PRINT, 'two'
                BREAK
             END
          3: PRINT, 'three'
          4: PRINT, 'four'
       ENDSWITCH

    IDL Prints:

       two
  • If there are no matches within a CASE statement and there is no ELSE clause, IDL issues an error and execution halts. Failure to match is not an error within a SWITCH statement. Instead, execution continues immediately following the SWITCH.

The decision on whether to use CASE or SWITCH comes down deciding which of these behaviors fits your code logic better. For example, our first example of the CASE statement looked like this:

CASE name OF
   'Larry': PRINT, 'Stooge 1'
   'Moe':   PRINT, 'Stooge 2'
   'Curly': PRINT, 'Stooge 3'
ELSE: PRINT, 'Not a Stooge'
ENDCASE

We could write this example using SWITCH:

SWITCH name OF
   'Larry': BEGIN
               PRINT, 'Stooge 1'
               BREAK
            END
   'Moe':   BEGIN
               PRINT, 'Stooge 2'
               BREAK
            END
   'Curly': BEGIN
               PRINT, 'Stooge 3'
               BREAK
            END
ELSE: PRINT, 'Not a Stooge'
ENDSWITCH

Clearly, this code can be more succinctly expressed using a CASE statement.

There may be other cases when the fall-through behavior of SWITCH suits your application. The following example illustrates an application that uses SWITCH more effectively. The DAYS_OF_XMAS procedure accepts an integer argument specifying which of the 12 days of Christmas to start on. It starts on the specified day, and prints the presents for all previous days. If we enter 3, for example, we want to print the presents for days 3, 2, and 1. Therefore, the fall-through behavior of SWITCH fits this problem nicely. The first day of Christmas requires special handling, so we use a BREAK statement at the end of the statement for case 2 to prevent execution of the statement associated with case 1.

PRO DAYS_OF_XMAS, day
 
   IF (N_ELEMENTS(day) EQ 0) THEN DAY = 12
   IF ((day LT 1) OR (day GT 12)) THEN day = 12
   day_name = [ 'First', 'Second', 'Third', 'Fourth', 'Fifth', $
                'Sixth', 'Seventh', 'Eighth', 'Ninth', 'Tenth',$
                'Eleventh', 'Twelfth' ]
 
   PRINT, 'On The ', day_name[day - 1], $
      ' Day Of Christmas My True Love Gave To Me:'
 
   SWITCH day of
      12: PRINT, '    Twelve Drummers Drumming'
      11: PRINT, '    Eleven Pipers Piping'
      10: PRINT, '    Ten Lords A-Leaping'
       9: PRINT, '    Nine Ladies Dancing'
       8: PRINT, '    Eight Maids A-Milking'
       7: PRINT, '    Seven Swans A-Swimming'
       6: PRINT, '    Six Geese A-Laying'
       5: PRINT, '    Five Gold Rings'
       4: PRINT, '    Four Calling Birds'
       3: PRINT, '    Three French Hens'
       2: BEGIN
            PRINT, '    Two Turtledoves'
            PRINT, '    And a Partridge in a Pear Tree!'
            BREAK
         END
      1: PRINT, '    A Partridge in a Pear Tree!'
   ENDSWITCH
END

If we pass the value 3 to the DAYS_OF_XMAS procedure, we get the following output. Achieving this behavior with CASE would be difficult.

On The Third Day Of Christmas My True Love Gave To Me:
   Three French Hens
   Two Turtledoves
   And a Partridge in a Pear Tree!
 

See Also


CASE, SWITCH