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