K& R C章练习int浮动?

时间:2016-01-07 17:18:35

标签: c variables for-loop types type-conversion

Kernighan和Ritchie的1.3节使用以下温度转换程序来引入For语句:

#include <stdio.h>

/* print Fahrenheit-Celsius table */

int main(){

        int fahr;
        for (fahr = 0; fahr <= 300; fahr = fahr + 20)
            printf("%3d %6.1f\n", fahr, (5.0/9.0)*(fahr-32));
}

它没有解释的是这个程序如何利用int变量产生浮点值而没有错误。是什么让这个有效?并非方程中的所有变量都必须属于同一类型?如果不理解这一点,我会犹豫不决。

4 个答案:

答案 0 :(得分:4)

转换是隐式的,但启用警告应该会给出一条消息,说明int正在转换为double。

这里(5.0/9.0)*(fahr-32)),一个double乘以一个int,并使用通常的算术转换将int转换为double。

算术中的类型不一定必须匹配。 C有一整章致力于转换:6.3转换,6.3.1算术操作数。

答案 1 :(得分:0)

实际上它并不是:select right, group_id, score from (select t.*, dense_rank() over (partition by groupid order by score desc) as seqnum from t ) t where seqnum <= 3 order by groupid; (5.0/9.0)*(fahr-32)类型的表达式,不是 a double

原因是5.0和9.0是float文字而且(fahr - 32)在乘法发生之前被提升到该类型。

如果您真的想要double,请使用float。注意数字上的后缀(5.0f/9.0f)*(fahr-32)(你需要后缀两个)。

对于f%f

printfdouble中适当的格式说明符,因此没有任何问题。

答案 2 :(得分:0)

在算术表达式中,如果两个操作数具有不同的类型(例如intdouble),则具有较低精度的操作数将转换为与具有较高精度的操作数相同的类型精确。确切的规则可以在online C 2011 standard的第6.3.1.8节中找到。

请注意,这仅适用于算术(整数和浮点)类型,不适用于指针或聚合类型。

答案 3 :(得分:0)

T.super可以毫无问题地升级为int的原因 - 假设double表示32位整数,int表示64位IEEE浮点数,这是常见的 - double具有53位精度,因此它可以毫无困难地表示32位整数。任何警告都只是信息而不是引起关注,不像32位整数被强制转换为double时,它只有24位精度,因此最多可能丢失8位(签名为7位)演员的精确度float}。