Search code examples
cswitch-statementrpn

case without statement and break


I'm dealing with RPN calculator and I've found some approach that's using the switch where some of the case doesn't have any expression and break statement:

Here is my approach that's using this algorithm unfortunately it's not working properly As an input for the function I'm using the array of struct defines as follow:

num OPERATORS {val, PLUS, MINUS, MULTI, DIV, SIN, COS, O_PAREN, C_PAREN, END};
typedef struct value {

    double number;
    enum OPERATORS oper;
};

And here is the RPN parser:

void get_the_rpn(struct value values[], struct value rpn_values[], int length) {

    struct value stack[256]; //stack for keeping the values
    int i; //iterator
    int pos; //postion on stack

    i=pos=0;
    //go trough each element in values and reprase it to the rpn format
    while(values[i].oper != END) {

        //check first if current element isn't number
        if(values[i].oper == val) {
            rpn_values[i] = values[i];
            pos++;
        }
        //current element isn't number is an operator
        else
            switch(values[i].oper)
            {
                case PLUS:
                    ;
                case DIV:
                    while (pos && stack[pos-1].oper != O_PAREN &&
                                  stack[pos-1].oper != PLUS &&
                                  stack[pos-1].oper != MINUS) {
                        rpn_values[i] = stack[--pos];
                    }
                    stack[pos++] = values[i];
                    break;
                case MINUS:
                    while (pos && stack[pos-1].oper != O_PAREN) {
                        rpn_values[i] = stack[--pos];
                    }
                    stack[pos++] = values[i];
                    break;
                case MULTI:
                    ;
                case O_PAREN:
                    stack[pos++] = values[i];
                    break;
                case C_PAREN:
                    while (stack[pos-1].oper != O_PAREN) {
                        rpn_values[i] = stack[--pos];
                    }
                    pos--;
                    break;
                case SIN:
                    rpn_values[i] = values[i];
                    break;  //edited
                case COS:
                    rpn_values[i] = values[i];
                    break;  //edited
            }
        i++;

    }
}

The question mostly is why for PLUS and MULTI in the case clause there is no statement simply ;?

If someone would like to see whole code and maybe could found the bug here is the whole calculate.c program http://pastebin.com/WteqbmJg


Solution

  • In a switch() statement, control is passed to the matching case.

    A case without a break (or anything else that might redirect control) will continue to execute the code in the next 'case' (including the default case).

    In the question code, the reason that PLUS has no statement (even the ; is optional), is that it 'falls-through' to the DIV case. Just as the MULTI case falls-through to the O_PAREN case,

    All very legitimate C coding.