learn_C_deep_7 (switch 语句的基本理解、case 的作用、break的作用switch、case 推荐规则)

简介: learn_C_deep_7 (switch 语句的基本理解、case 的作用、break的作用switch、case 推荐规则)

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;
}


image.png

总结: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修饰的变量不可以。


相关文章
|
11月前
if-else if与switch的区别
if-else if与switch的区别
85 0
switch case 执行
switch case 执行
101 0
|
C#
switch case语句
switch case语句
137 0
|
Dart
Dart之break、continue/ switch...case
Dart之break、continue/ switch...case
84 0
Dart之break、continue/ switch...case
|
Java
switch case 语句有如下规则
switch case 语句有如下规则
142 0
|
C语言
分支与循环语句(if…else , switch...case , default)
分支与循环语句(if…else , switch...case , default)
114 0
分支与循环语句(if…else , switch...case , default)
switch……case语句面试题
switch……case语句面试题
94 0
|
设计模式 Java Spring
消除代码中的 if-else/switch-case的正确姿势
消除代码中的 if-else/switch-case的正确姿势
284 0
|
Java 容器 设计模式
如何优化代码中大量的if/else,switch/case?
前言 随着项目的迭代,代码中存在的分支判断可能会越来越多,当里面涉及到的逻辑比较复杂或者分支数量实在是多的难以维护的时候,我们就要考虑下,有办法能让这些代码变得更优雅吗? 正文 使用枚举 这里我们简单的定义一个表示状态的枚举。
2316 0