算术运算不适用于变量



我创建了这个变量float avg_perc,并执行了一些算术运算来找到平均百分比。输出是意外的,即对于marks1, mark2, marks3的任何值都是0。

#include <stdio.h>
int main(){
int marks1, marks2, marks3;
printf("Enter your marks in all 3 subjects : ");
scanf("%d %d %d", &marks1, &marks2, &marks3);
float avg_perc = ((marks1+marks2+marks3)/300)*100;    //problem part
printf("%f n", avg_perc);
if(avg_perc>=40 &&marks1>=33 && marks2>=33 && marks3>=33){
printf("Pass.");
}
else{
printf("Fail.");
}
return 0;
}

是否使用float avg_perc = ...来存储结果并不重要,因为该类型并不影响用于计算的类型。

在C语言中,表达式中的每个操作数和整型常量都有一个类型。根据操作数的类型,每个操作都在一个特定的类型上执行,然后该类型也成为(子)表达式的结果类型。

在这种情况下,类型如下面的注释所示:

float avg_perc = ((marks1 + marks2 + marks3) / 300) * 100;
//        float        int    + int    + int     / int  * int

操作符优先级决定哪个操作数属于哪个操作符。在这种情况下,()括号具有最高优先级,然后是*/,然后是+,最后是=

子表达式(marks1 + marks2 + marks3)将在int类型上进行所有计算,因为+的所有操作数都是int。然后结果将形成一个新的表达式"result/300"其中300int。同样,计算是在int上进行的。最后,* 100也是一样。

当以上所有的计算都在int上完成后,赋值会最后进行,因为=具有最低的优先级。在赋值过程中,有一个特殊的转换规则,规定将右操作数的值转换为左操作数的类型。因此,当所有其他计算都已经在int上完成时,最后才将结果转换为float

在你的代码中

((marks1+marks2+marks3)/300)*100; 

是整数算术。您需要确保参与的参数中至少有一个是浮点型(或强制转换为浮点型或双精度型),以确保浮点运算。就像

(((float)marks1+marks2+marks3)/300)*100;

您需要通过将.0添加到除数中使除数成为double类型,以避免整数除法,这正是您遇到这个奇怪问题的原因。

改变:

(marks1 + marks2 + marks3) / 300

为:

(marks1 + marks2 + marks3) / 300.0

注意,如果你放一个浮点前缀,例如300.0f,那么你会看到一个错误的计算。例如,在程序中输入30 30 30后,得到30.000002

相关内容

最新更新