如何按变量名循环遍历并求和?无法使用数组等数据结构
不用数组/向量实现单个float变量的for循环累加方案
因为循环变量是运行时的,而x0/x1这类变量名是编译时的标识,直接用for循环没法通过i直接访问对应变量——你之前尝试的##拼接宏失效的核心原因就在这里:预处理器在编译前执行,根本不知道运行时i的具体值,没法动态拼接出变量名。
针对N<10的限制,有两种简单可行的实现方式:
方法一:用预处理器宏映射循环变量到对应变量
通过宏定义一个三元表达式链,把循环变量i映射到对应的xN变量,在for循环中直接调用即可:
#include <stdio.h> // 最多覆盖到x9,满足N<10的要求 #define GET_X(i) \ ((i) == 0 ? x0 : \ (i) == 1 ? x1 : \ (i) == 2 ? x2 : \ (i) == 3 ? x3 : \ (i) == 4 ? x4 : \ (i) == 5 ? x5 : \ (i) == 6 ? x6 : \ (i) == 7 ? x7 : \ (i) == 8 ? x8 : x9) int main() { float x0 = 1.5f, x1 = 2.5f, x2 = 3.5f, x3 = 4.5f; int N = 4; // N小于10 float sum = 0.0f; for (int i = 0; i < N; ++i) { sum += GET_X(i); } printf("累加结果:%.1f\n", sum); return 0; }
方法二:在for循环内嵌入switch-case
直接在循环里用switch根据i的值选择对应的变量累加,逻辑更直观:
#include <stdio.h> int main() { float x0 = 1.1f, x1 = 2.2f, x2 = 3.3f; int N = 3; float sum = 0.0f; for (int i = 0; i < N; ++i) { switch(i) { case 0: sum += x0; break; case 1: sum += x1; break; case 2: sum += x2; break; case 3: sum += x3; break; case 4: sum += x4; break; case 5: sum += x5; break; case 6: sum += x6; break; case 7: sum += x7; break; case 8: sum += x8; break; case 9: sum += x9; break; } } printf("累加结果:%.1f\n", sum); return 0; }
两种方法本质都是在编译阶段把运行时的i值和编译时的变量名做静态映射,绕开了数组/向量的使用限制。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

