如何使用数组索引作为运算符?

时间:2014-11-03 16:30:58

标签: c

如何将数组索引用作运算符?

这样:

#include<stdio.h>

main()
{
    char sign[]={'+','-'};
    int a, b;
    a = 12 sign[1] 10;
    printf("%d",a);
}

实际上这段代码不起作用。这类程序的正确代码是什么?

4 个答案:

答案 0 :(得分:7)

最简单的方法是使用switch语句或if-else链。

#include<stdio.h>

int main() {
    char sign[]={'+','-'};
    int a,b;

    switch (sign[1]) {
        case '+':
            a = 12 + 10;
            break;

        case '-':
            a = 12 - 10;
            break;
    }

    printf("%d",a);
}

如果我这样做,我可能最终会将一些逻辑转移到一个函数中。也许是这样的:

#include<stdio.h>

int perform_operation(char op, int lhs, int rhs) {
    switch (op) {
        case '+':
            return lhs + rhs;

        case '-':
            return lhs - rhs;

        default:
            return 0;
    }
}

int main() {
    char sign[]={'+','-'};
    int a = perform_operation(sign[1], 12, 10);
    printf("%d",a);
}

答案 1 :(得分:3)

如果你没有严格依赖中缀符号,你可以简单地通过

int plus(int x, int y)
{
    return x + y;
}

int minus(int x, int y)
{
    return x + y;
}

int (*)(int, int) sign[]={plus, minus};

您将能够将其用作:

int a = sign[1](10, 12);

答案 2 :(得分:1)

你可以使用函数指针:

//function:
int addInt(int a, int b) {
    return a+b;
}

//define the pointer:
int (*functionPtr)(int,int);

main ()
{
  functionPtr sign[5];
  sign[0] = &addInt;

   int a = 5, b = 8;
  //...
  int sum = sign[0](a,b);
  printf("%d", sum);
  return 0;
}

它有点复杂,在大多数简单的情况下,你会想要使用switch语句来调用不同的函数,但在处理更大,更复杂的情况时,这是一个非常有用的方法。

我使用像这样的函数指针数组的一个例子是在开发图像处理应用程序时,供应商提供了一些非常特殊的处理算法。
他们的代码虽然是专有的,所以虽然我们可以获得包含可以进行处理的函数的dll,但我们无法将其构建到代码中。由于可能需要任何数量的这些dll,并且我们希望能够在不重新编译整个系统的情况下添加 - 删除功能,我们需要能够读取dll并对其进行管理。我们使用上面这样的方法来做到这一点。

答案 3 :(得分:0)

我很想使用三元数:

a = 12 + (sign[1] == '-' ? -1 : +1) * 10;

当然这默认为+,但您可以引入早期检查来防范。

您可以使用它来形成一个宏:

12 + SIGN(1) 10;

#define SIGN(s) (sign[(s)] == '-' ? -1 : +1) *

除了方括号外,还可以恢复问题中表达式的形式。