我正在处理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
条款中的MULTI
和case
只有;
没有声明?
如果有人希望看到整个代码,可能会发现此处的错误是整个calculate.c
计划http://pastebin.com/WteqbmJg
答案 0 :(得分:4)
在switch()
语句中,控件将传递给匹配的case
。
没有case
的{{1}}(或任何可能重定向控件的其他内容)将继续执行下一个“案例”中的代码(包括break
案例)。
在问题代码中,default
没有声明(即使PLUS
是可选的)的原因是它“落入”;
案例。就像DIV
案件落到MULTI
案件一样,
所有非常合法的C编码。