为什么C在double的计算中假设整数类型?

时间:2011-07-27 21:52:02

标签: c

我试图在GNU情节中绘制一个函数,我的情节与文章中的情节不同。在阅读GNU将函数解释为C时,我尝试用C编写函数。同样的问题。

最终我发现这个问题可能会出现问题:

#include <stdio.h>
#include <stdlib.h>

int main()
{
double p = 1.0;
double pMinusOneHalf1 = p - (1.0/2.0);
double pMinusOneHalf2 = p - (1/2);

printf("\nFirst = %lf \n Second = %lf\n\n", pMinusOneHalf1, pMinusOneHalf2);

return 0;
}

给出输出

First = 0.500000 
Second = 1.000000

只是想知道是否有人解释为什么C会假设“1”和“2”作为DOUBLE表达式中的INT。

对于人们来说似乎很容易被抓住。 gcc的-Wall选项甚至没有评论它。

5 个答案:

答案 0 :(得分:9)

/并不特别关心从double中减去其结果。

所有它知道它给了两个整数,所以它给你一个整数。

答案 1 :(得分:1)

他们为什么不这样做?

他们假设编程INT / INT的用户将知道他/她正在做什么,而不是猜测她/他。如果你想要一个整数除法怎么办?您是否要强制用户使用其他表示法?对我来说似乎很容易让表达式根据定义的行为进行本地评估,而不是试图猜测用户想要什么。否则,gcc可能只是猜测你要插入分号的位置,并为你做这些。

答案 2 :(得分:0)

括号在涉及double之前会导致两个整数的除法。删除括号不起作用,因为除法优先于减法。

答案 3 :(得分:0)

表达式按照您告诉它的顺序进行评估。在这种情况下,除法具有比除法更高的优先级(除法之外的括号或不是)。所以得到的等式的第一部分是1/2。如您所知,1/2在整数运算中为0。然后表达式变为(1.0-0),将结果转换为double,但1.0-0的结果为1.0

答案 4 :(得分:0)

整数常量1和2的类型为int(任何十进制整数常量,其值不超过INT_MAX)。

在大多数情况下,C表达式的类型完全由表达式本身决定,而不是由它出现的上下文决定。 (1/2)是int类型的表达式,值为0;从double类型的表达式中减去它的事实不会改变它。

C 可以以不同的方式定义,以便整数子表达式从它们出现的任何表达式继承某种浮点上下文。现有规则虽然可以导致一些看似违反直觉的结果,但实际上更容易理解。 (它们在编译器中实现起来也可能更简单,这在20世纪70年代编写第一批C编译器时非常重要。)