在c中执行switch-case(和if-else)功能的替代方法是什么?

时间:2009-07-13 13:22:00

标签: c switch-statement

在c?

中执行switch-case(和if-else)功能的替代方法是什么?

4 个答案:

答案 0 :(得分:3)

函数指针是另一种选择。请考虑以下通过函数指针数组调用函数的代码段:

#include <stdio.h>

void fn0(int n) { printf ("fn0, n = %d\n",n); }
void fn1(int n) { printf ("fn1, n = %d\n",n); }
void fn2(int n) { printf ("fn2, n = %d\n",n); }
void fn3(int n) { printf ("fn3, n = %d\n",n); }

static void (*fn[])(int) = {fn0, fn1, fn2, fn3};

int main(void) {
    int i;
    for (i = 0; i < 4; i++)
        fn[i](10-i);
    return 0;
}

这会产生:

fn0, n = 10
fn1, n = 9
fn2, n = 8
fn3, n = 7

这种构造使得实现诸如有限状态机之类的东西非常容易,而不是大量switch语句或接近无法管理的嵌套if,你可以只使用整数用于索引函数指针数组的状态变量。

答案 1 :(得分:2)

你总是可以使用gotos ...... :-p

答案 2 :(得分:1)

函数指针和策略模式的半实现:)

..虽然你需要一些逻辑来确定调用哪个函数

答案 3 :(得分:1)

有几种不同的方法可以在C中处理条件分支和切换方案。

您自己提到的典型模式是switch()语句和if / else if / else组。但是,有时这些流量控制结构不是某些问题的最佳选择。具体情况如:

  • 在大型域上进行高性能分支
  • 对仅在运行时已知的值域进行分支
  • 根据其他条件在运行时更改分支路径

在这些情况下,有两种模式我觉得有用:

  1. 直接调度的策略模式
  2. 带有链式调度的策略模式
  3. 在第一种方法中,您将域中的每个值映射到函数指针的集合。每个函数处理来自您的域的特定案例(值)。这允许您直接“跳转”到特定案例的正确处理程序。当每个案例与所有案例分开并且很少或没有重叠逻辑时,这种模式很有效。

    在第二种方法中,您将所有调度方法链接在一起 - 并针对所有情况调用它们中的每一个。每个调度的方法决定它是否处理大小写,并立即返回或执行某些处理。当某些处理程序的职责之间存在重叠时,此模式很有用。它的性能稍差,因为调用了多个处理程序,并且每个处理程序都决定是否需要执行其处理。但是,这是处理重叠逻辑的一种更简单的方法 - 通常在具有直通(或跳转)条件的switch()语句中处理的类型。

    如果问题确实需要,您应该只使用其中一种技术,因为它们对于未来的开发人员来说不那么明显,并且如果实施不当会引入不必要的复杂性和维护问题。它还使您的代码更难以理解,通过更常见的结构,如switch或if / else。