C 比较运算符优先级

发布于 2024-11-09 11:48:10 字数 396 浏览 0 评论 0原文

你好,我有一个方法叫做

int 比较(char op1, char op2)

该方法将根据比较结果返回 1、-1 或 0。 (如果 op1 < op2,则为 1)。

我需要比较以下操作:

- subtraction
* multiplication
/ division
^ exponentiation
% remainder

我已经考虑过使用枚举,例如:

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

但这无法编译。有人可以帮忙吗?

Hi there i have a method called

int compare(char op1, char op2)

the method will return 1, -1 or 0 depending on the result of the comparison. (1 if op1 < op2).

I need to compare the following operations:

- subtraction
* multiplication
/ division
^ exponentiation
% remainder

I have considered using an enum such as:

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

but this doesn't compile. Can anyone lend a hand?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

安人多梦 2024-11-16 11:48:10

您不能使用字符作为枚举的键,您应该执行以下操作:

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

You can't use characters as keys for the enum, you should do something like:

enum ops {
    OP_PLUS       = 1,
    OP_MINUS      = 1,
    OP_MULT       = 2,
    OP_DIV        = 2,
    OP_POWER,
    OP_MOD
} var;
仲春光 2024-11-16 11:48:10
#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));
}
#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));
}
橘亓 2024-11-16 11:48:10

枚举必须是标识符名称,而不是字符。我建议将它们命名为 PLUSMINUS 等(另外,为什么 % 的优先级高于 ^事实上的标准是给予 %*/ 相同的优先级。)

enums have to be identifier names, not characters. I suggest naming them PLUS, MINUS, etc. (Also, why would % have higher precedence than ^? The de facto standard is to give % the same precedence as * and /.)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文