2011-05-26 47 views
0

您好我有一个称为Ç比较算符优先

INT比较方法(炭OP1,OP2炭)

该方法将return 1, -1 or 0取决于比较的结果。 (如果op1 < op2则为1)。

我需要比较以下操作:

- subtraction 
* multiplication 
/division 
^ exponentiation 
% remainder 

我一直在使用一个枚举考虑,如:

enum ops{ 
    '+'=1, '-'=1, '*'=2, '/'=2, '^', '%' 
}var; 

但这并不编译。任何人都可以伸出援手吗?

+0

因此比较是优先顺序吗? – 2011-05-26 01:08:28

回答

3

不能使用字符键的枚举,你应该这样做:

enum ops { 
    OP_PLUS  = 1, 
    OP_MINUS  = 1, 
    OP_MULT  = 2, 
    OP_DIV  = 2, 
    OP_POWER, 
    OP_MOD 
} var; 
2

枚举必须标识符名称,而不是字符。我建议命名它们​​,MINUS,等等(还有,为什么会%具有更高的优先级比^吗?事实上标准是给%相同的优先级为*/。)

2
#include <stdio.h> 

struct precedence 
{ 
    char op; 
    int prec; 
} precendence[] = 
{ { '+', 1 }, 
    { '-', 1 }, 
    { '*', 2 }, 
    { '/', 2 }, 
    { '^', 3 }, 
    { '%', 4 }, 
    { 0, 0 }}; 

int compare(char *a, char *b) 
{ 
    int prec_a = 0, prec_b = 0, i; 

    for(i=0; precendence[i].op && (!prec_a || !prec_b); i++) 
    { 
    if (a == precendence[i].op) 
     prec_a = precendence[i].prec; 
    if (b == precendence[i].op) 
     prec_b = precendence[i].prec; 
    } 

    if (!prec_a || !prec_b) 
    { 
    fprintf(stderr,"Could not find operator %c and/or %c\n",a,b); 
    return(-2); 
    } 
    if (prec_a < prec_b) 
    return -1; 
    if (prec_a == prec_b) 
    return 0; 
    return 1; 
} 


main() 
{ 
    char a,b; 

    a='+'; b='-'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='+'; b='*'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='+'; b='^'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='+'; b='%'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='*'; b='+'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='^'; b='+'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
    a='%'; b='+'; printf("Prec %c %c is %d\n", a,b,compare(a,b)); 
}