在c?
中执行switch-case(和if-else)功能的替代方法是什么?答案 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组。但是,有时这些流量控制结构不是某些问题的最佳选择。具体情况如:
在这些情况下,有两种模式我觉得有用:
在第一种方法中,您将域中的每个值映射到函数指针的集合。每个函数处理来自您的域的特定案例(值)。这允许您直接“跳转”到特定案例的正确处理程序。当每个案例与所有案例分开并且很少或没有重叠逻辑时,这种模式很有效。
在第二种方法中,您将所有调度方法链接在一起 - 并针对所有情况调用它们中的每一个。每个调度的方法决定它是否处理大小写,并立即返回或执行某些处理。当某些处理程序的职责之间存在重叠时,此模式很有用。它的性能稍差,因为调用了多个处理程序,并且每个处理程序都决定是否需要执行其处理。但是,这是处理重叠逻辑的一种更简单的方法 - 通常在具有直通(或跳转)条件的switch()语句中处理的类型。
如果问题确实需要,您应该只使用其中一种技术,因为它们对于未来的开发人员来说不那么明显,并且如果实施不当会引入不必要的复杂性和维护问题。它还使您的代码更难以理解,通过更常见的结构,如switch或if / else。