这个东西俺怎么就是搞不明白啊(哭)

题目内容:
下面代码的功能是将百分制成绩转换为5分制成绩, 具体功能是:如果用户输入的是非法字符或者不在合理区间内的数据(例如输入的是a,或者102,或-45等),则程序输出 Input error!,否则将其转换为5分制输出。
因为我不会处理输入‘a'输出 Input error!的情况 就去搜了一下代码

#include 
int main()
{
    printf("Please input score:\n");
    int score,s;
    char grade;
    scanf("%d",&score);
    s=score/10;
    switch(s)
    {
        case 10:
        case 9: grade='A';    printf("grade: %c\n",grade);break;
        case 8: grade='B';     printf("grade: %c\n",grade);break;
        case 7: grade='C';    printf("grade: %c\n",grade);break;
        case 6: grade='D';    printf("grade: %c\n",grade);break;
        case 5:
        case 4:
        case 3:
        case 2:
        case 1:grade='E';printf("grade: %c\n",grade);break;
        default:printf("Input error!\n");
    }
    return 0;
}

然后这个代码运行输入’a'结果是对的
但是我有点不明白的是 为什么这个能运行的对呀 然后我就找它结果对的关键在哪里
找了下我就又发现一个点 删掉在case中进行的操作(如下代码)结果又不对了呀 这到底是为啥呀(悲)

#include 
int main()
{
    printf("Please input score:\n");
    int score,s;
    char grade;
    scanf("%d",&score);
    s=score/10;
    switch(s)
    {
        case 10:
        case 9: break;
        case 8: break;
        case 7: break;
        case 6: break;
        case 5:
        case 4:
        case 3:
        case 2:
        case 1:break;
        default:printf("Input error!\n");
    }
    return 0;
}

原因就是score没有初值
当你输入a,它不能转换成数字,那么score就没有被赋值
正常它就应该是0,那么会进入default
但是因为没有初值,它是个随机内存,万一它本来就是5呢,肯定就不对了呀
你改了代码重新编译,IDE就会换块内存来执行,score的初值就会改变
如果你老老实实的让输入数字就输入数字也不会有这种问题,没初值而又不输入数字,可不就出问题了吗

在 C 语言中,scanf 函数读入的值会存在一个变量中,这个变量的类型就是它的实际类型。所以在这个程序中,当输入字符'a'时,scanf 函数会将它存储在 int 型变量 score 中,这时 score 中的值就是字符'a'在 ASCII 码表中对应的整数值。然后就将 score 赋值给 s。 然后在 switch 语句中对 s 做匹配,所以在 default情况打印"Input error!”

第二个代码,当输入字符'a'时,scanf 函数会将它存储在 int 型变量 score 中,这时 score 中的值就是字符'a'在 ASCII 码表中对应的整数值。然后就将 score 赋值给 s。 然后在 switch 语句中对 s 做匹配,因为 s 没有在 case 语句中匹配到,所以 default情况不会被执行,所以程序不会输出任何东西。
仅供参考,望采纳,谢谢。