【问题标题】:C function call selection using ternary operator使用三元运算符的 C 函数调用选择
【发布时间】:2016-08-30 03:11:20
【问题描述】:

我有两个 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 语法需要一次写入参数?

【问题讨论】:

  • 在你的第一个代码段中,在'else'子句中,它应该是f2
  • 如果condition 既是真又是假,那么调用相同的函数f1 是什么意思?如果这是一个错字,请更正它。
  • 是的,当然应该是 f2,谢谢
  • 我想知道您是否在提问之前尝试了您在问题中输入的代码。它实际上按书面形式工作,消除了您发布的复杂答案。
  • @DavidHoelzer 实际上我做到了,但使用了更复杂的功能,现在我会再试一次

标签: c function syntax call function-call


【解决方案1】:

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

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

【讨论】:

  • @Jack,您应该重新阅读有关提问的帮助部分。如果可以的话,我们鼓励回答我们自己的问题。这不仅仅是为了帮助,而是为了增加 SO 的知识库。
  • @enrico.bacis 但据我所知,只要函数具有相同的类型/签名,您的“pythonic”语法也应该可以正常工作!另见stackoverflow.com/questions/75538/…
  • 为什么要引入临时变量? result = (condition ? f1 : f2)(a, b, c, …) 也可以。
  • @Jack: blog.stackoverflow.com/2011/07/… 这个想法是:“我知道这样,你知道更好的吗?”
  • 我不能对此投票,因为它不必要地使问题复杂化并破坏了对 Pythonic 方法的请求。 @unwind 的回答要好得多。
【解决方案2】:

是的,就像你建议的那样,它可以正常工作。

函数调用运算符() 只需要一个左侧的计算结果为函数指针的函数指针,函数名称就是这样做的。

调用时不需要取消对函数指针的引用,() 操作符可以做到这一点。

此示例程序演示:

#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 是成熟的 OOP,函数也是一流的对象 - 就像类一样。
猜你喜欢
  • 2019-07-30
  • 2014-01-19
  • 2021-08-07
  • 2016-11-21
  • 2021-09-30
  • 2023-03-05
  • 2021-03-25
  • 1970-01-01
  • 2022-01-10
相关资源
最近更新 更多