我不明白为什么这段代码给了我乘法、除法和减法的错误结果?它给我任何乘法运算的结果是零,任何除法误差的结果,最后减法的结果总是1。
#include <stdio.h>
long operations(char x,int num1 ,int num2 );
int main(void) {
char x;
int num1 , num2;
long result;
setbuf(stdout,NULL);
result=operations(x,num1 ,num2 );
}
long operations(char x,int num1 ,int num2 )
{
printf("please enter your operation sum (1) ,subtrcation(2),mul(3),div(4) :");
scanf("%d",&x);
if (x==(1||2||3||4))
{
printf("please enter the first and second numbers : \n ");
scanf ("%d%d" ,&num1 ,&num2);
}
else
{
printf("error ") ;
}
switch (x)
{
case 1:
{
return printf("the result sum is :%d ",(num1+num2)) ;
}
case 2:
{
return printf("the result of subtraction is :%d ",(num1-num2)) ;
}
case 3:
{
return printf("the result multiblication is :%d ",(num1*num2)) ;
}
case 4:
{
return printf("the result division is :%d ",(num1/num2)) ;
}
}
}发布于 2020-02-26 19:13:12
您不能“重构”您的条件x==(1||2||3||4)
您需要显式地编写x == 1 || x == 2 || x == 3 || x == 4。
编译器理解“如果x等于1,或者x等于2,等等”。
它不理解“如果x等于1、2、3或4”
任何与零不同的数字都被认为是true,因此1||2||3||4与1相同。
如果你愿意,你可以写x >= 1 && x <= 4。您只检查下界和上界。
此外,别忘了检查num2在除法方面是否与0不同。否则,你的程序就会崩溃。
发布于 2020-02-26 19:43:01
正如@chux已经提到的,这个if语句总是正确的,因为true的意思是!= 0。因此,每个不等于0的数字都将匹配该条件。
@Haltarys已经建议的解决方案的另一种方法是另一种switch --这可能会提高可读性:
switch(x)
{
case 1: // fallthrough
case 2: // fallthrough
case 3: // fallthrough
case 4:
printf("please enter the first and second numbers : \n ");
scanf ("%d%d" ,&num1 ,&num2);
break;
default:
printf("error ");
// consider returning here instead of break because you have no return below for this case
break;
}由于这些情况与您的switch中的情况相同,所以可能会考虑将它们组合起来。
关于您的代码的其他一些提示:
x == 5)--然后您将打印错误消息,但是您的switch缺少一个default语句,因此缺少一个return值。你的编译器应该抱怨这一点。(double)num1 / num2%d,这意味着该值将被抛出,您也不会打印小数--而是使用%.2f,例如,在小数点之后获取2位数字,并转换为num1,这样就不会得到int结果:不会返回您的数学操作的结果,而是被调用的printf的返回值,即打印字符的数量。
https://stackoverflow.com/questions/60420723
复制相似问题