关于switch()语句的问题,为什么执行的是case‘/’?

img


是因为表达式是o,o是char型所以要有小数所以执行case'/',我这样理解正确吗?求详细解释。

输入 3 5 /
对应x、y、o
o为/
所以走case‘/’
r是double

o 是char型,只占一个字节,取值范围为 -128 ~ +127(-2^7~2^7-1),整型和字符型是互通的,他们是在内存中存储的本质是相同的,只是存储的范围不同而已。
switch(表达式){case 1:......} , switch()括号内的 "表达式" 必须是整数类型或者可以转换为整型的数值类型,题目里的 o 符合这个条件,输入 o = '/' 这个字符,‘/’ 的ASCII 值为 47,所以switch(o) 相当于 switch(47) , case ‘/’ 相当于 case 47 。

题目出错了
应该是
3 5 /
有空格

正确

【以下回答由 GPT 生成】

问题分析: 在这段代码中,字符的输入使用了scanf("%c", &o)来进行输入,而且这句代码放在两个scanf("%f", &y)之后。根据C语言中scanf的工作原理,这会导致输入缓冲区中的换行符或者空格被读取到字符变量o中,而不是我们期望的运算符字符。

解决方案: 1. 解决这个问题最简单的方法是在之前的scanf("%f", &y)之后加上一个额外的getchar()函数调用,将输入缓冲区中的换行符或者空格消耗掉。这样可以确保scanf("%c", &o)能够正常获取我们期望的运算符字符。 2. 另一种方法是修改scanf("%c", &o)scanf(" %c", &o),在格式字符串中添加一个空格。这样可以告诉scanf函数忽略掉输入缓冲区中的换行符或者空格,直接读取下一个非空白字符。

代码修改:

#include<stdio.h>

int main()
{
    float x, y;
    char o;
    double r;
    scanf("%f", &x);
    scanf("%f", &y);
    getchar();          // 消耗输入缓冲区中的换行符或者空格
    scanf("%c", &o);

    switch(o)
    {
        case '+': 
            r = x + y;
            break;
        case '-': 
            r = x - y;
            break;
        case '*': 
            r = x * y;
            break;
        case '/': 
            r = x / y;
            break;
    }

    printf("%f", r);
    return 0;
}

这样修改之后,输入的运算符字符将会被正确地存储在变量o中,可以得到我们期望的结果。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^