c语言的switch 循环

c语言初学者
这段代码看不懂,请帮我分析一下,谢谢

#include<stdio.h>
int main(void)
{
    int c;
    while((c=getchar())!='\n')
    switch(c-'2')
    {
        case 0:
        case 1: putchar(c+4);
        case 2: putchar(c+4); break;
        case 3: putchar(c+3);    
        default: putchar(c+2); break;
    }
    printf("\n");
    return 0;
}
输入2473,结果为668977

这个涉及到2个概念,
一个是ascii和数字转换的问题,在ascii中,0 1 2 3 4 5 6 7 8 9 是连续排列的
所以 '2' - '2' = 0  '4'-'2' = 2 '4' + '4' = 8 等等
一个是switch如果case后没有break,会贯通到下面的一个标签。比如第一个,走到了case0 1 2,所以输出66
综上,
c = 2: 66
c = 4: 8
c = 7: 9
c = 3: 77
所以结果668977

  • 输入2 ,'2' - '2' =0 , 匹配case 0,没有break,接着 case 1,打印6,没有break,继续case2,打印 6,break 退出switch。
  • 输入4 ,'4' - '2' = 2 ,匹配case 2,打印 8,break退出switch。
  • 输入7 ,'7' - '2' = 5 ,没有匹配case,匹配default,打印 9,退出switch
  • 输入3 ,'3' - '2' = 1,匹配case 1,打印 7,没有break,继续case 2,打印 7,break退出switch。
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7605842
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言用switch语句给成绩分等级
  • 同时,你还可以查看手册:c语言-switch 中的内容
  • 除此之外, 这篇博客: C语言中的选择语句和循环语句中的 switch语句 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • swtich(表达式)
    {
    case 常量1:语句1:break;
    case 常量2:语句2:break;
    case 常量3:语句3:break;
    case 常量n:语句n:break;
    defualt: 语句n+1;break;(此处break可有可无)
    }

    说明:
    1、switch后面括号内的表达式必须为整数类型(包括字符)。
    2、case后面的必须为常量或者常量表达式且常量或常量表达式不可以相等。
    (敲黑板)3、case标号只起标记作用,在寻找的匹配的之后,不在进行此检查,既找到标号后,就从此标号开始执行,不在进行表达式和常量表达式的判断。(这也是为什么在case语句后面必须要加break 的原因,在下面的代码中会进行解释)
    break的作用是跳出当前循环,或者switch语句。

    我们可以用上述的两种选择语句做一个简单的四则运算计算器,代码如下

    int ADD_INT(int a, int b)//加法
    {
    	return a + b;
    }
    int DIV_INT(int a, int b)//除法
    {
    	if (0 == b) return false;
    	return a / b;
    }int REC_INT(int a, int b)//减法
    {
    	return a -b;
    }int MUL_INT(int a, int b)//乘法
    {
    	return a * b;
    }
    void main()
    {
    	int a, b, z;
    	char c;
    	printf("请输入你所要进行的操作\n");
    	scanf("%d%c%d",&a,&c,&b);
    	bool tag = 0;//计算成功与否判断标记
    	if (c = '+')
    	{
    		z = ADD_INT(a, b);
    	}
    	else if (c = '-')
    	{
    		z = REC_INT(a, b);
    	}
    	else if (c = '*')
    	{
    		z = MUL_INT(a, b);
    	}
    	else if (c = '/')
    	{
    		z = DIV_INT(a, b);
    		tag = 1;
    	}
    	if (tag = 0)
    	{
    		printf("输入错误");
    	}
    	printf("=%d\n", z);
    }
    

    tag的作用是:如果在程序输入运算符错误时,计算无法进行则z无值,在输出z时编译器会发生错误,无法输出z的值。
    用switch语句实现

    int calc()
    {
    	int a, b; char c;
    	printf("请输入你所要进行的操作\n");
    	scanf("%d%c%d", &a,&c,&b);
    	switch (c)
    	{
    	case '+':printf("计算结果为%d", a + b); break;
    	case '-':printf("计算结果为%d", a - b); break;
    	case '*':printf("计算结果为%d", a * b); break;
    	case '/':if (0 != b)
    		return false;
    			 else
    				 return a / b;
    		break;
    	default:printf("计算失败");
    	}
    	return 0;
    }
    
  • 您还可以看一下 贺利坚老师的C语言及程序设计初步课程中的 用switch语句实现多分支结构小节, 巩固相关知识点