输入 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
中,可以得到我们期望的结果。
【相关推荐】