Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无陈述和中断的情况_C_Switch Statement_Rpn - Fatal编程技术网

C 无陈述和中断的情况

C 无陈述和中断的情况,c,switch-statement,rpn,C,Switch Statement,Rpn,我正在处理RPN计算器,我发现了一些使用开关的方法,其中一些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计算器,我发现了一些使用
开关的方法,其中一些
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++;

    }
}
问题主要是为什么在
案例
子句中没有简单的
语句

如果有人想查看整个代码,并且可能在这里发现错误,则在
switch()
语句中的整个
calculate.c
程序,控制权将传递给匹配的
案例

如果
案例
没有
中断
(或可能重定向控制的任何其他内容),则将在下一个“案例”(包括
默认案例)中继续执行代码

在问题代码中,
PLUS
没有语句(即使是
也是可选的),原因是它“通过”了
DIV
的情况。正如
MULTI
案例与
O\u PAREN
案例一样

所有非常合法的C编码。

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

如果
案例
没有
中断
(或可能重定向控制的任何其他内容),则将在下一个“案例”(包括
默认案例)中继续执行代码

在问题代码中,
PLUS
没有语句(即使是
也是可选的),原因是它“通过”了
DIV
的情况。正如
MULTI
案例与
O\u PAREN
案例一样


所有的C代码都是合法的。

一个同样有趣的问题是,为什么在
SIN
上面的
COS
中没有这样做。顺便说一句,这被称为跌破开关盒,写这篇文章的恶魔应该是一致的。它们还应该提供一个适当的
默认值:
,用于捕获诸如
val
END
之类的意外值(虽然从技术上讲,这些值不能在前导码到位的情况下进入交换机)。同样有趣的问题是,为什么在
SIN
上面的
COS
中没有这样做。顺便说一句,这被称为跌破开关盒,写这篇文章的恶魔应该是一致的。它们还应该提供一个适当的
默认值:
用于捕获意外值,如
val
END
(尽管从技术上讲,这些值不能在前导码到位的情况下进入交换机)。正确的编码是合法的。建议一种带有注释的编码风格,该注释表示有意的失败<代码>案例加号:/*跌破*/@chux,同意。在问题代码中,这样的构造很容易被忽略。@chux同样同意。如果您不使用中断来终止案例标签,那么您最好添加一条注释,指定该意图,以便跟随您的“有用”工程师知道它是故意的。这就是我所想的,但在这种方法中,
'+'
操作符会发生什么?它不会进入
堆栈
。。。我的解决方案是一些预先准备好的RPN算法的组合。使用
struct
array是我的想法,不太确定t;是的。p、 我在
COS
之后添加了
break
,并将
SIN
设置为True。建议一种带有注释的编码风格,该注释表示有意的失败<代码>案例加号:/*跌破*/@chux,同意。在问题代码中,这样的构造很容易被忽略。@chux同样同意。如果您不使用中断来终止案例标签,那么您最好添加一条注释,指定该意图,以便跟随您的“有用”工程师知道它是故意的。这就是我所想的,但在这种方法中,
'+'
操作符会发生什么?它不会进入
堆栈
。。。我的解决方案是一些预先准备好的RPN算法的组合。使用
struct
array是我的想法,不太确定t;是的。p、 我在
COS
SIN
之后添加了
break