在C语言中将运算符作为参数传递给函数

5
我希望将大于(>)和小于(<)操作符作为参数传递给函数,这有可能吗?是否有任何方法可以将这些运算符作为参数传递?请问是否有人可以帮助我。

2
你不能直接这样做。你需要传递一个运算符的表示(通常使用枚举),然后函数将其转换为正确的运算符。 - kaylum
3
我们有一个典型的情况,即某个新用户提出了一个完全合理的问题,但却收到了无可挽回的傻瓜式负评。 - MK.
你是不是遇到了XY问题 - Lundin
4个回答

3
你可以使用宏定义做出可怕的事情,但一般来说,你无法这样做。通常你会接受一个双参数函数并调用它,这个函数可以使用><进行比较,参见sort文档中的示例。
话虽如此,这不是超级高效的(通过指针调用函数不能被内联化,而对于像><这样的廉价操作,函数调用开销超过了比较工作)。为了使其有效率,需要:
1. 多个代码副本,每个可能的运算符一个(可能通过宏定义生成) 2. 转移到C++并使用模板化代码与functors / lambdas,以便可以正确地内联。

当然,从技术上讲,C++模板代码在特化模板时实际上也会复制多个代码。但是它以一种更安全的方式进行操作,只在需要时才这样做,并且不会使源代码变得混乱不堪,只会稍微增加最终二进制文件的大小。 - ShadowRanger

2

没有办法传递一个“原始操作符”,但有办法实现相同的结果。最简单的方法是使用char

int func(char op, int a, int b)
{
    if (op == '<')
    {
        return a < b;
    }
    else if (op == '>')
    {
        return a > b;
    }
    return -l; /* error */
}

更复杂的解决方案是使用指向执行操作的函数的函数指针(类似于sort方法使用的比较器)。


2
你可以创建一个枚举并将其传递。 或者你可以像这样传递一个指向比较函数的指针:
#include <stdio.h>

int max(int a, int b, int (*comp)(int, int)) {
  if (comp(a, b) < 0) {
     return b;
  } else {
     return a;
  }
}

int mycomp(int a, int b) {
  return a < b ? -1 : 1;
}

int main() {
  printf("%d %d\n", max(1, 2, mycomp), max(2, 1, mycomp));
}

0
你可以使用#define#编写此函数。字符#将运算符更改为字符串。(例如在#define中,#+ = "+")。
示例代码:
#include <stdio.h>
#define great(c) ((#c==">")? (1):(0))

int main()
{
    printf ("%d", great(>));
    return 0;
}

在此代码中,我将 > 作为函数参数传递。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接