在不使用switch case的情况下将字符转换为算术运算符,即将'+'转换为+

时间:2014-03-01 12:34:32

标签: c

void main()
{
    char c;
    int op;
    int a=10,b=20,sum;

    scanf("%c",&c);
    if(c=='+')
      op=1;
    else if(c=='-')
      op=2;
    else if(c=='*')
      op=3;

    switch(op)//here i used switch but i don't want to use it
    {
       case 1: sum=a+b;
               break;
       case 2: sum=a-b;
               break;
       case 3: sum=a*b;
                break;
    }
       printf("%d",sum);

}
当c包含c时,

输出应为30 总和应该包含30 acb应评估为a + b,它应包含30

6 个答案:

答案 0 :(得分:4)

我并不是说这是一种好的做事方式,但你可能会有这样的事情:

#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

typedef int (*fn)(int, int);
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }

int main(void) {
    int a = 10, b = 20, sum;
    char c;
    fn f[256] = {NULL};

    f['+'] = add;
    f['-'] = subtract;
    // etc

    scanf("%c", &c);
    fn fn = f[(int)c];
    assert(fn != NULL);
    sum = fn(a, b);
    printf("%d\n", sum);

    return EXIT_SUCCESS;
}

但实际上,只需要使用switch语句。

答案 1 :(得分:3)

你可以这样做:

void main()
{
    char c;
    int a=10,b=20,sum;
    scanf("%c",&c);
    sum=(c=='+')?(a+b):((c=='-')?(a-b):((c=='*')?(a*b):0));
    printf("%d",sum);
}

不要与行sum=(c=='+')?(a+b):((c=='-')?(a-b):((c=='*')?(a*b):0));混淆。它实际上是这样做的:

if(c=='+')
    sum=a+b;
else
{
    if(c=='-')
        sum=a-b;
    else
    {
        if(c=='*')
            sum=a*b;
        else
            sum=0;
    }
}

运算符(?:)称为条件(三元)运算符。

其语法:

condition ? expression1 : expression2

如果条件为真,则返回expression1。否则将返回表达式2。如您所见,该行中使用了3个嵌套条件运算符。

详细了解条件运算符here

答案 2 :(得分:2)

当涉及到C时,不可能通常太强大了。在功能编程方面,它总是太强大。

#include <stdio.h>

int (*ops[5])(int,int);
int mul(int f, int s)  { return f*s; }
int plus(int f, int s) { return f+s; }

int main(int argc, char** argv)
{
  ops[0] = &mul;
  ops[1] = &plus;

  printf("%u + %u = %u\n", 5, 10, ops['+' - 42](5, 10));
  return 0;
}

ops是一个函数指针数组(每个都有两个整数并返回一个,这是int上标准操作的类型)。 '*'的ASCII码是42(巧合!),'+'是43,依此类推。 ops [0] =&amp; mul初始化ops以包含将两个数相乘的函数的地址。然后在printf中,ops由要应用的运算符的字符代码减去第一个运算符的索引,即调用相应的函数并传递所需的参数。不幸的是,四个基本artihmetic运算符的四个ASCII码的间隔不连续(44不是运算符),因此阵列需要5个元素。这种技术被称为查找表,如果我知道如何获取内置+函数的地址而不是为它定义包装器,它可以做得更好。

答案 3 :(得分:1)

对不起,您无法将char转换为运营商。如果您想根据输入采取不同的操作,必须分支。

如Matteo Italia和Jens Gustedt所述,您可以让您的开关更加紧凑。

scanf("%c",&c);
switch(c) {
   case '+': sum = a + b; break;
   case '-': sum = a - b; break;
   case '*': sum = a * b; break;
   default: break; /* invalid op? */
}

答案 4 :(得分:1)

char c;
int a=10, b=20, result=0;

scanf("%c", &c);
c=='+' && (result = a + b);
c=='-' && (result = a - b);
c=='*' && (result = a * b);
printf("%d", result);

答案 5 :(得分:0)

如果没有一些切换/检查,那么在C / C ++中是不可能的。