1

我正在处理 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++;

    }
}

问题主要是为什么 for PLUSandMULTIcase子句中没有简单的语句;

如果有人想查看整个代码并且可能会发现这里的错误是整个calculate.c程序http://pastebin.com/WteqbmJg

4

1 回答 1

4

switch()语句中,控制权被传递给匹配的case.

case没有 a (break或任何其他可能重定向控制的东西)将继续执行下一个“案例”(包括default案例)中的代码。

在问题代码中,PLUS没有声明(甚至;是可选的)的原因是它“通过”DIV案例。就像MULTI案子落到O_PAREN案子一样,

所有非常合法的 C 编码。

于 2014-05-23T18:40:39.770 回答