基于另一变量批量设置多变量的高效实现方法(C语言)
嘿,刚接触C语言就想着优化冗余代码,这意识真不错!针对你用冗长if-else根据x的值批量设置变量的问题,这里有几个更优雅的实现方案,还能完美适配你用指针在main()以外函数操作变量的需求:
方法1:结构体数组映射(最直观的批量赋值方案)
这个思路是把每个x对应的一组变量值打包成结构体,再把所有结构体放进数组里,直接通过x的值索引数组就能拿到对应配置,完全替代if-else链。
示例代码:
#include <stdio.h> // 定义存储一组变量值的结构体 typedef struct { int a; int b; int c; int d; } VarConfig; // 把x对应的配置提前存在数组里(x从1开始的话,数组首元素做占位用) const VarConfig configs[] = { {0, 0, 0, 0}, // x=0(占位,避免索引越界) {10, 100, 0, 0}, // x=1的配置 {10, 50, 100, 0}, // x=2的配置 {0, 25, 50, 100} // x=3的配置 }; // 外部函数:用指针接收变量,根据x设置值 void setVariables(int x, int* a, int* b, int* c, int* d) { // 先检查x是否在有效范围内,防止数组越界 if (x < 1 || x >= sizeof(configs)/sizeof(configs[0])) { *a = *b = *c = *d = 0; printf("Invalid x value!\n"); return; } // 直接从数组取出配置赋值 VarConfig cfg = configs[x]; *a = cfg.a; *b = cfg.b; *c = cfg.c; *d = cfg.d; } int main() { int x, a, b, c, d; printf("Enter x: "); scanf("%d", &x); setVariables(x, &a, &b, &c, &d); printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); return 0; }
这个方案的核心是配置与逻辑分离,后续要加新的x配置,直接在数组里加结构体就行,不用改逻辑代码,维护起来特别方便。
方法2:函数指针表(适合带复杂逻辑的场景)
如果有些x对应的变量设置不止简单赋值,还要做计算、判断等操作,用函数指针表会更灵活。每个x对应一个专门的设置函数,通过函数指针数组直接调用对应函数。
示例代码:
#include <stdio.h> // 定义函数指针类型:接收变量指针,无返回值 typedef void (*SetVarFunc)(int*, int*, int*, int*); // 每个x对应的设置函数 void setX1(int* a, int* b, int* c, int* d) { *a = 10; *b = 100; *c = *d = 0; } void setX2(int* a, int* b, int* c, int* d) { *a = 10; *b = 50; *c = 100; *d = 0; } void setX3(int* a, int* b, int* c, int* d) { *a = 0; *b = 25; *c = 50; *d = 100; } void setDefault(int* a, int* b, int* c, int* d) { *a = *b = *c = *d = 0; printf("Invalid x, set default values.\n"); } // 函数指针数组:索引对应x的值 const SetVarFunc setFuncs[] = { setDefault, // x=0 setX1, // x=1 setX2, // x=2 setX3 // x=3 }; // 外部函数:根据x调用对应设置函数 void setVariables(int x, int* a, int* b, int* c, int* d) { if (x < 1 || x >= sizeof(setFuncs)/sizeof(setFuncs[0])) { setDefault(a, b, c, d); return; } // 调用对应函数 setFuncs[x](a, b, c, d); } int main() { int x, a, b, c, d; printf("Enter x: "); scanf("%d", &x); setVariables(x, &a, &b, &c, &d); printf("a=%d, b=%d, c=%d, d=%d\n", a, b, c, d); return 0; }
这个方案适合逻辑复杂的场景,每个配置的逻辑都封装在独立函数里,可读性和扩展性都很强。
小提示
不管用哪种方案,一定要检查x的取值范围,避免数组越界导致程序崩溃。如果x的取值不是连续的(比如x=1,3,5),可以先用switch做一次映射,把x转成连续的索引再用上面的方法。
内容的提问来源于stack exchange,提问作者Weaver
相关产品推荐
相关产品推荐

