我创建了这个变量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"其中300
为int
。同样,计算是在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
。