switch 语句的基本理解
switch是一种控制语句,用于控制程序流程的走向。在 switch 语句中,可以根据表达式的值执行特定的代码块。switch 语句包含一个表达式和多个 case 块。首先会计算表达式的值,然后在 case 块中匹配相应的值。如果匹配成功,则执行该 case 块中的代码,然后跳出 switch 语句。如果所有的 case 块均未匹配成功,则执行默认的代码块。
switch (整型变量 / 常量 / 整型表达式) {
case var1:
break;
case var2:
break;
case var3:
break;
default:
break;
}
接下来我们来看一段代码
//#define _CRT_SECURE_NO_WARNINGS 1 #include<stdio.h> #pragma warning(disable:4996) int main() { int day = 0; scanf("%d", &day); //if语句具备两个功能 //1.判断 //2.分支 //switch-case-break也具备这个功能 //但是switc不具备判断和分支的能力,它仅仅做的是拿day的值去进行匹配 switch (day) { case 1://1.判断 printf("星期一!\n"); break;//2.分支 case 2: printf("星期二!\n"); break; case 3: printf("星期三!\n"); break; case 4: printf("星期四!\n"); break; case 5: printf("星期五!\n"); break; case 6: printf("星期六!\n"); break; case 7: printf("星期天!\n"); break; } return 0; }
这是一个用 C 语言编写的程序。首先,程序使用 `#define` 预处理指令定义了一个宏 `_CRT_SECURE_NO_WARNINGS`,以消除安全问题的警告(scanf)。`#include` 指令包含了 `stdio.h` 头文件,提供了标准输入/输出函数的声明。接着,程序使用 `#pragma` 指令来禁用特定的警告,这里的 `#pragma warning(disable:4996)` 指令是不对 Visual Studio 中的特定警告输出进行编译器检查和编译输出的。
在 `main` 函数中,程序定义了一个整型变量 `day`,并调用 `scanf` 函数读入一个整数,保存到 `day` 中。程序接着使用 `switch` 语句来根据 `day` 的值输出相应的信息。如果 `day` 的值符合任何一个 `case`,则输出特定的字符串,然后使用 `break` 语句跳出 `switch` 语句的执行。如果 `day` 的值都不符合任何一个 `case`,则不会输出任何信息。最后,`main` 函数返回 0 表示程序正常结束。
总的来说,该程序演示了使用 `switch` 语句实现多分支选择的功能,优化了使用多个 `if...else` 语句的代码可读性和可维护性。
case语句的深度理解
case 的作用
在C语言中,`case`是一种用于`switch`语句中的一个关键字。`switch`语句可以根据表达式的值来选择执行哪个`case`分支中的语句块。
case本质本质是进行判定功能。
case语句的要求
switch(m) && case n
//其中m 和 n必须是什么类型变量或者表达式?
//case 语句后的值要求是一个常量表达式或者枚举类型或者宏定义
,即在编译时即可计算出结果的表达式。
//case 语句后面是否可以是const修饰的只读变量呢?不行
#include <stdio.h>
#include <windows.h>
int main()
{
const int a = 10;
switch (a) {//可以 - a是常量
case a: //不行 - error C2051: case 表达式不是常量
printf("hello\n");
break;
default:
break;
}
system("pause");
return 0;
}
下面这段代码有没有错误呢?
case 1:
int a = 1;
print("%d\n",a);
break;
在 C 语言中,case 语句中不能定义新的变量。这是因为在 C 语言中,switch-case 语句的语法规定,case 分支中只能包含语句,不能包含声明语句。
如果需要在 case 分支中使用变量,我们可以应该在 switch 语句前定义该变量,或者在加上定义时加上{},或者封装成函数
int a = 1; switch (day) { case 1: printf("%d\n", a); break;
case 1: { int a = 1; printf("%d\n", a); } break;
void test() { int a = 1; printf("%d\n", a); } case 1: test(); break;
break 的作用
在`switch`语句中,`break`用于结束当前分支,跳出整个`switch`语句。
break本质其实是进行分支功能。
如果我们switch语句中没有break会怎么样呢?
这是一段使用了 switch-case 语句的 C 语言代码,功能是根据输入的数字 day(表示星期几)输出相应的星期几的字符串。 先通过 scanf 函数读入 day 的值,然后使用 switch-case 语句进行判断。在 switch 语句中,针对每个可能的 day 值,都有一个对应的 case 分支,分别输出对应的字符串。 需要注意的是,在 case 分支中没有使用 break 语句,这意味着在匹配到某个 case 分支后,会一直往下执行直到遇到下一个 break 或者 switch 语句结束。因此,如果输入的 day 为 5,输出的不仅是“星期五!”还包括后面的“星期六!”、“星期天!”,然后 switch 语句才结束。
总结:每个`case`分支的最后一条语句必须是`break`语句,否则程序将继续执行下一个分支的代码,直到遇到`break`语句或`switch`语句结束为止。
switch case 推荐规则
规则一:
如果我们想周一到周五打印“工作日”,周六到周日打印“休息日”该怎么做呢?
#include<stdio.h> #pragma warning(disable:4996) int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: printf("工作日!\n"); break; case 2: printf("工作日!\n"); break; case 3: printf("工作日!\n"); break; case 4: printf("工作日!\n"); break; case 5: printf("工作日!\n"); break; case 6: printf("休息日!\n"); break; case 7: printf("休息日!\n"); break; } return 0; }
上面的这种写法虽然可行,但是重复的语句比较多,此时我们可以换一种写法。
#include<stdio.h> #pragma warning(disable:4996) int main() { int day = 0; scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日!\n"); break; case 6: case 7: printf("休息日!\n"); break; } return 0; }
总结:如果多个不同case匹配,想执行同一个语句,我们就可以省区前面的case语句,只保留最后一个case语句。
规则二:
在上面的程序当中,如果我们输入1-7以外的任何数,程序都没有运行结果,那么当用户使用该代码的时候,其代码的体验感是非常不足的,因为你输入1-7以外的任何数,程序没有报错,用户也不清楚要输入什么,以及提示什么错误。所以我们要改进一下上面的代码。
#include<stdio.h> #pragma warning(disable:4996) int main() { int day = 0; printf("Please enter your day:>"); scanf("%d", &day); switch (day) { case 1: case 2: case 3: case 4: case 5: printf("工作日!\n"); break; case 6: case 7: printf("休息日!\n"); break; default: printf("你输入的值有误!\n"); } return 0; }
总结:default 是一个关键字,用于 switch-case 语句结构中的 "缺省(默认)" 分支。default分支表示当所有的 case 分支都不匹配时,执行的代码。需要注意的是,default 分支可以放在 switch 语句的任何位置。但通常情况下,建议将 default 分支放到 switch 语句的最后面,以便于更好地理解代码的逻辑。
小结:
1.switch语句中,case完成判断功能,break完成分支功能,default完成处理异常情况。
2.case 表达式:
语句;
2.1.如果表达式和语句是一对多的关系(case有多条语句),此时不能再case中定义 变量,如果需要,使用函数或{}或在switch外定义该变量。
2.2.如果表达式和语句是多对一的关系,此时建议在执行相同语句的case后省区break 语句,只需最后一个保留即可。
3.default可以出现在switch内的任何地方,建议放在末尾。
4.case :表达式必须在编译的时候就能转化为值,可以是宏,但是const修饰的变量不可以。