C编程:从0到24按规则输出Hello、Red、Green、Blue
问题分析与修正方案
核心问题梳理
- 偶数判断逻辑颠倒:
if (i % 2)实际判断的是奇数(偶数取模2结果为0,条件不成立),应改为if (i % 2 == 0)。 - 赋值替代比较:
if (i = R[j])是把R[j]的值赋给循环变量i,直接破坏外层循环的遍历逻辑,这是导致无限循环的根本原因,必须改为比较运算符==。 - 冗余逻辑与无效参数:printf格式字符串无占位符,无需传入
i;奇数判断的三层嵌套循环无需全部遍历,找到匹配项后即可终止判断。
修正后的代码(保留原数组思路)
#include <stdio.h> int main () { int i, j; int R[] = {1,7,13,19}; int G[] = {3,9,15,21}; int B[] = {5,11,17,23}; // 遍历0到24(原代码i<24仅到23,需包含24则改为i<=24) for (i = 0; i <= 24; i++) { // 处理偶数 if (i % 2 == 0) { printf("Hello\n"); continue; // 处理完直接进入下一轮循环 } // 处理奇数 int matched = 0; // 检查Red for (j = 0; j < 4; j++) { if (i == R[j]) { printf("Red\n"); matched = 1; break; } } if (matched) continue; // 检查Green for (j = 0; j < 4; j++) { if (i == G[j]) { printf("Green\n"); matched = 1; break; } } if (matched) continue; // 检查Blue for (j = 0; j < 4; j++) { if (i == B[j]) { printf("Blue\n"); break; } } } return 0; }
更简洁的优化方案(利用数学规律)
观察奇数集合的规律:
- Red:1,7,13,19 →
(i - 1) % 6 == 0 - Green:3,9,15,21 →
(i - 3) % 6 == 0 - Blue:5,11,17,23 →
(i - 5) % 6 == 0
基于此可彻底去掉数组和嵌套循环,代码更高效:
#include <stdio.h> int main () { for (int i = 0; i <= 24; i++) { if (i % 2 == 0) { printf("Hello\n"); } else if ((i - 1) % 6 == 0) { printf("Red\n"); } else if ((i - 3) % 6 == 0) { printf("Green\n"); } else if ((i - 5) % 6 == 0) { printf("Blue\n"); } } return 0; }
关键说明
- 原代码
i < 24仅能遍历到23,若需包含24需修改为i <= 24。 - 使用
continue可避免多层嵌套判断,让逻辑更清晰。 - 数学规律方案无需额外数组,执行效率更高且更易维护。
内容的提问来源于stack exchange,提问作者LeonidasEng
相关产品推荐
相关产品推荐

