C语言中switch语句能否匹配多个值?如何正确实现?
如何在C语言的switch语句中为一个case设置多个匹配值?
在C语言的switch语句中,无法直接在一个case后写多个值(比如case 4,6,9,11这种写法是语法错误)。正确的做法是将多个case标签依次列出,每个标签后不添加break,让它们共享同一段执行代码,直到最后一个case后再写break退出分支。
你的代码中的错误点:
- 逻辑或表达式误用:
case (1||3||5||7||8||10||12)写法错误。1||3这类逻辑或运算的结果是布尔值1(非零值在逻辑运算中视为真),所以这个case实际只匹配值1,而非你期望的所有31天的月份。 - 多值case语法错误:
case 4 6 9 11不符合C语言语法,case后必须是单个常量表达式,不能直接罗列多个值。 - 未定义行为与逻辑错误:
m = m++;和j = j++;属于C语言未定义行为,直接写m++或j++即可。while (j < 1 && j > 30)逻辑错误,一个数不可能同时小于1且大于30,应该用||(逻辑或)。
修正后的代码:
switch (m) { case 2: do { printf("请输入日期(数字):"); scanf("%d", &j); } while (j > 29 || j < 1); if (j == 29) { j = 1; m++; } else { j++; } break; case 1: case 3: case 5: case 7: case 8: case 10: case 12: do { printf("请输入日期(数字):\n"); scanf("%d", &j); } while (j < 1 || j > 31); if (j == 31) { j = 1; m++; } else { j++; } break; case 4: case 6: case 9: case 11: do { printf("请输入日期(数字):\n"); scanf("%d", &j); } while (j < 1 || j > 30); if (j == 30) { j = 1; m++; } else { j++; } break; }
说明:
- 多个连续的case标签(如
case 4: case 6:)会共享后续代码块,直到遇到break语句。 - 移除了冗余的
a = a;和m = m;语句,这些语句对变量无任何修改,可直接省略。 - 修正了while循环的逻辑错误,确保输入日期在合法范围内。
内容的提问来源于stack exchange,提问作者riad djaid
相关产品推荐
相关产品推荐

