You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中switch语句能否匹配多个值?如何正确实现?

如何在C语言的switch语句中为一个case设置多个匹配值?

在C语言的switch语句中,无法直接在一个case后写多个值(比如case 4,6,9,11这种写法是语法错误)。正确的做法是将多个case标签依次列出,每个标签后不添加break,让它们共享同一段执行代码,直到最后一个case后再写break退出分支。

你的代码中的错误点:

  1. 逻辑或表达式误用:case (1||3||5||7||8||10||12) 写法错误。1||3这类逻辑或运算的结果是布尔值1(非零值在逻辑运算中视为真),所以这个case实际只匹配值1,而非你期望的所有31天的月份。
  2. 多值case语法错误:case 4 6 9 11 不符合C语言语法,case后必须是单个常量表达式,不能直接罗列多个值。
  3. 未定义行为与逻辑错误:
    • 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 16:35:21