switch case判断

发布于:2022-12-15 ⋅ 阅读:(671) ⋅ 点赞:(0)
  • 在一个 switch 中可以有任意数量的 case 语句。每个 case 后跟一个要比较的值和一个冒号
  • 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止
  • 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。也就是不再执行switch语句。
  • 不是每一个 case 都需要包含 break如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
  • 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 中的 break 语句不是必需的。default case语句的作用就是判断除了上述的case情况之外的其他情况。
    #include<stdio.h>
    
    int main()
    {
        int data;
        printf("请输入一个数:");
        scanf("%d",&data);
        switch(data){
            case 1:
             puts("满足条件1的情况");    
                break;
            case 2:
             puts("满足条件2的情况");    
                break;
            case 3:
             puts("满足条件3的情况");    
                break;
    		default:
    		puts("其他情况");
        }
        return 0;
    }

    该代码中需要注意的有:

  • 1:switch()括号里面必须写有变量

  • 2:case 1:case后面加所属情况注意用空格隔开,之后加冒号

  • 3:default后面加冒号:

#include<stdio.h>

int main()
{
    int data;
    printf("请输入一个数:");
    scanf("%d",&data);
    switch(data){
        case 1:
          puts("满足条件1的情况");    
        case 2:
         puts("满足条件2的情况");    
            break;
        case 3:
         puts("满足条件3的情况");    
            break;
		default:
		puts("其他情况");
    }
    return 0;
}

 该代码情况一之间并没有使用break,所以当输入的数字是1的时候,代码运行的结果是

满足条件1的情况
满足条件2的情况

所以为了实现这种情况,改进后的代码是:


    switch(data){
        case 1:
        case 2:
         puts("满足条件1和2的情况");    
            break;
     

这样无论是输入1还是2,代码运行的结果都是:

满足条件1和2的情况

上述情况均是变量data为整型数据的时候,那么data的类型能不能是字符型呢

 看代码:

#include<stdio.h>

int main()
{
    char cdata;
    printf("请输入一个字符:");
    scanf("%c",&cdata);
    switch(cdata){
        case 'a':
          puts("满足条件a的情况");    
        case 'b':
         puts("满足条件b的情况");    
            break;
        case 'c':
         puts("满足条件c的情况");    
            break;
		default:
		puts("其他情况");
    }
    return 0;
}

在上述代码中,不同于整型变量的是,变量的类型变成了字符型,与之相关联的case后面的所属情况也要相应的变成字符,但是虽然表面看起来是用字符表示所属情况,但是最终编译器使用的是ascii码值来进行相应的操作。所以本质上还是和整型数据是一样的。

同样: 情况a的后面要是去掉break的话,输入a或者b,代码运行的结果是:

满足条件a和条件b的情况

 将整型变量和字符变量结合在一起会是什么样子呢:

 看代码:

#include<stdio.h>

int main()
{
    char cdata;
	int  data;  
	
    printf("请输入一个字符:");
    scanf("%c",&cdata);
    switch(cdata){
        case 'a':
          puts("满足条件a的情况");    
		  break;
        case 'b':
         puts("满足条件b的情况");    
            break;
		default:
		puts("其他情况");
    }
	printf("请输入一个数:");
    scanf("%d",&data);
    switch(data){
        case 1:
          puts("满足条件1的情况");    
		  break;
        case 2:
         puts("满足条件2的情况");    
            break;
		default:
		puts("其他情况");
	}
  
    return 0;

}

此时,代码运行的结果是:

请输入一个字符:a
满足条件a的情况
请输入一个数:1
满足条件1的情况

但是如果将整型和字符型的代码顺序调换一下,却出现了问题:

代码如下:

#include<stdio.h>

int main()
{
    char cdata;
	int  data;  
	printf("请输入一个数:");
    scanf("%d",&data);
    switch(data){
        case 1:
          puts("满足条件1的情况");    
		  break;
        case 2:
         puts("满足条件2的情况");    
            break;
		default:
		puts("其他情况");
	} 
	printf("请输入一个字符:");
    scanf("%c",&cdata);
    switch(cdata){
        case 'a':
          puts("满足条件a的情况");    
		  break;
        case 'b':
         puts("满足条件b的情况");    
            break;
		default:
		puts("其他情况");
    }
  
    return 0;

}

 但提醒输入数字的时候,整型数据的判断是正确的,但是到了下面的字符型时却是直接跳过:

结果如下:
 

请输入一个数:1
满足条件1的情况
请输入一个字符:其他情况

字符的判断直接显示其他情况。

出现上述情况的原因是:整型数据在提醒输入的时候,scanf之后的回车没有被接收,导致到了字符型的时候,回车被当作一个字符接收,转换成ascii码后与所存情况进行判断,最后得出其他情况的结果。解决方法就是键入getchar()吸收掉回车键。

即:

printf("请输入一个字符:");
	getchar();
    scanf("%c",&cdata);

这样一改之后运行结果就正常了。 

但是为什么调换顺序之前不用getchar也能正常运行呢!!!

 

本文含有隐藏内容,请 开通VIP 后查看