使用三元运算符进行C函数调用选择

8

我有两个C函数f1f2,它们接受相同的参数。根据条件,我需要使用相同的参数调用其中一个函数:

if (condition) {
    result = f1(a, b, c);
} else {
    result = f2(a, b, c);
}

我知道可以使用以下语法:

result = condition ? f1(a, b, c) : f2(a, b, c)

是否有可能使用DRY语法,只需写一次参数?


如果condition既为真又为假,调用相同的函数f1是什么意思?如果这是一个打字错误,请纠正它。 - user3078414
在你提问之前,我不得不想知道你是否尝试过你放在问题中的代码。它实际上可以按照所写的方式工作,省去了你发布的复杂答案。 - David Hoelzer
@DavidHoelzer,实际上我已经尝试过了,但是使用了一个更加复杂的函数,现在我会再试一次。 - enrico.bacis
你为什么不试一下呢?这样比在这里问要快得多吧?只要在使用之前声明了f1f2,它就能正常工作(但你不会尝试编译未在使用前声明或定义函数的代码,对吧——那已经是上个千年的事情了!)。 - Jonathan Leffler
实际上,在Python中没有? ...:,因此不清楚您所说的“pythonic syntax”是什么意思。而且两种语言的语义非常不同。 - too honest for this site
显示剩余3条评论
2个回答

10

是的,它像你建议的那样很好地工作。

函数调用运算符()只需要一个左操作数,该操作数计算为函数指针,函数名就是函数指针。

调用时不需要解引用函数指针,()运算符会自动解引用。

此示例程序演示:

#include <stdio.h>

static int foo(int x) {
    return x + 1;
}

static int bar(int x) {
    return x - 1;
}

int main(void) {
    for (int i = 0; i < 10; ++i)
        printf("%d -> %d\n", i, (i & 1 ? foo : bar)(i));
    return 0;
}

它会打印出:

0 -> -1
1 -> 2
2 -> 1
3 -> 4
4 -> 3
5 -> 6
6 -> 5
7 -> 8
8 -> 7
9 -> 10

这里没有什么奇怪的。

考虑到 C 语言比 Python 先发明了很多,也许是 Python 的语义更像 C 语言。当然,或许只是更加明智而已。 :)


结构相似,但语法不同(Python没有? .. :,而是使用if .. else运算符),机制也不同。与C++不同,Python是完全成熟的面向对象编程语言,函数和类都是一等对象。 - too honest for this site

2
可以像这样使用函数指针:

int (*f)(int, int, int, ...);
f = condition ? f1 : f2;
result = (*f)(a, b, c, ...);

1
@Jack,你应该重新阅读有关提问的帮助部分。如果我们能够回答自己的问题,我们会被鼓励这样做。这不仅仅是为了帮助,更是为了增加SO的知识库。 - StoryTeller - Unslander Monica
2
但据我所知,您的“pythonic”语法也应该可以正常工作,只要函数具有相同的类型/签名!另请参见https://dev59.com/b3VD5IYBdhLWcg3wI3-L#tZ6cEYcBWogLw_1b7H_h - CherryDT
1
你为什么引入了一个临时变量? result = (condition ? f1 : f2)(a, b, c, ...) 也能够正常工作。 - The Paramagnetic Croissant
@Jack: http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/ 这个想法是:“我知道这个方法,你知道更好的吗?” - enrico.bacis
我知道你可以回答自己的问题,我已经这样做过了。我的意思是他写的那种“你本来可以......”。 - Jack
显示剩余2条评论

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