案件没有陈述和休息

时间:2014-05-23 18:32:36

标签: c switch-statement rpn

我正在处理RPN计算器,我发现了一些使用switch的方法,其中一些case没有任何表达式和break语句:

这是我使用此算法的方法,遗憾的是它无法正常工作 作为函数的输入,我使用struct数组定义如下:

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

    double number;
    enum OPERATORS oper;
};

这是RPN解析器:

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++;

    }
}

问题主要是为什么PLUS条款中的MULTIcase只有;没有声明?

如果有人希望看到整个代码,可能会发现此处的错误是整个calculate.c计划http://pastebin.com/WteqbmJg

1 个答案:

答案 0 :(得分:4)

switch()语句中,控件将传递给匹配的case

没有case的{​​{1}}(或任何可能重定向控件的其他内容)将继续执行下一个“案例”中的代码(包括break案例)。

在问题代码中,default没有声明(即使PLUS是可选的)的原因是它“落入”;案例。就像DIV案件落到MULTI案件一样,

所有非常合法的C编码。