C中简单赋值语句中的错误

时间:2013-06-04 05:40:30

标签: c

在我分配dearness=(40*basic)/100 or rent=(20*basic)/100时,在以下简单的代码中它工作正常,但是按照以下方式进行,亲属和租金的赋值语句没有效果

请暗示可能的原因。

#include "stdio.h"
#include "conio.h"

int main()
{
    int salary=0,basic=0,dearness=0,rent=0;
    clrscr();
    printf("enter basic salary");
    scanf("%d",&basic);
    dearness=(40/100)*basic; //no effect
    rent=(20/100)*basic;  //no effect
    salary=basic+dearness+rent;
    printf("%d %d",dearness,rent);
    printf("\n%d",salary);
    getch();
    return 0;
}

谢谢。

5 个答案:

答案 0 :(得分:6)

这是因为40/100有一个整数结果(因为两个操作数都是整数),因此是0.您需要使用浮点数代替至少一个操作数,然后将结果转换回来到int

dearness = (int)((40/100.0) * basic);

或只是:

dearness = (0.4 * basic);

你在问题​​中发现自己的另一个选择是最后执行分组。这样你就可以将较大的数字除以100,而不是立即得到0的结果:

dearness = 40 * basic / 100;

当涉及变量时,您还可以进行明确的类型转换:

dearness = ((double)foo / bar) * basic;

请记住,计算中的每个操作数都会被提升为其中的最大类型(简化),因此,如果您有int + doubleint将在执行之前转换为double加成。但是如果所有操作数都在类型中一致,则计算将在该类型中完成,结果也是如此。通常情况下这不是问题,但是对于大多数人而言,它通常与直觉相反,因为在某些情况下它们会突然变为0(正如您所做的那样)。

答案 1 :(得分:2)

double用于结果

double dearness, rent, salary;

dearness=(40.0/100)*basic;
rent=(20.0/100)*basic;
salary=basic+dearness+rent;
...

由于40/100中的所有内容都是整数,因此将0作为整数返回,因此结果为0。你想要0.4

答案 2 :(得分:2)

在语句dearness=(40/100)*basic;中,40/100 = 0,因为它是整数除法。 设为dearness=(40.0/100)*basic

答案 3 :(得分:2)

如果除法运算中的运算符都是整数,则称为整数除法,结果将被截断。

参考:What is the behavior of integer division?

在您的代码中,

dearness=(40/100)*basic; //no effect
rent=(20/100)*basic;  //no effect

由于两个运算符都是整数,结果小于1,因此该分区的输出被截断为0。使其中任何一个或两个浮点都能给你正确的结果。

dearness=(40/100.0)*basic; //effective
rent=(20.0/100)*basic;  //effective

答案 4 :(得分:1)

在整数除法中,40/10020/100都会导致零,因为整数不能介于0和1之间。(实际上,这是整数的定义:它不能在整数之间)

因此,声明:

(40/100)*basic;

归结为:

0*basic;

等于零。


解决方案是在float或double中进行计算,或者如果你仍想使用整数,请确保在乘法后除以:

(40*basic)/100;

注意:有时您确实希望这样做。例如,对于精确的财务计算,使用浮点数或双精度数据是不合适的,因为它们的行为方式与您期望的十进制数字的行为不同。所以你按照上面的方法进行计算(总是最后进行除法)并使用%来找到美分值。信号处理是另一个主要处理整数的区域,只是因为常用的CPU不支持硬件中的浮点运算。