我试图在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选项甚至没有评论它。
答案 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编译器时非常重要。)