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变量产生浮点值而没有错误。是什么让这个有效?并非方程中的所有变量都必须属于同一类型?如果不理解这一点,我会犹豫不决。
答案 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
, printf
是double
中适当的格式说明符,因此没有任何问题。
答案 2 :(得分:0)
在算术表达式中,如果两个操作数具有不同的类型(例如int
和double
),则具有较低精度的操作数将转换为与具有较高精度的操作数相同的类型精确。确切的规则可以在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
}。