我很难理解文章Cast the return value of a function that returns a floating point type
(1)在
如果返回表达式具有与函数不同的类型,则转换就好像通过赋值函数的类型一样,但如果返回表达式仅因为广泛的评估而具有更宽的值,则不需要转换。
什么是“广泛评估”?它试图说什么?
(2)在示例中
float f(float x) {
return x * 0.1f;
}
float g(float x) {
return x * 0.1;
}
为什么“允许函数f返回一个比float宽的值,但函数g(使用更大的常量)不是”?
在f()中,x和0.1f都是浮点型,所以我认为x * 0.1f也是浮点型?在g()中,0.1可能被认为是double,因此x * 0.1是double?
(3)这篇文章的道德是什么?
谢谢和问候!
答案 0 :(得分:2)
函数g返回float类型,它是32位值。 0.1被解释为double,表示表达式x * 0.1返回double。 double是64位值,这将导致缩小转换,以便作为float返回。 x可以安全地转换为double,因为这是从float到double的扩展转换。
答案 1 :(得分:1)
(1)在
Conversion as if by assignment to the type of the function is required
如果返回表达式有 不同类型的功能,但 如果返回表达式有一个 更广泛的价值只是因为广泛 评价。
什么是“广泛评估”?是什么 试着说?
如果声明一个字节变量或常量,它实际上可能在32位平台上存储为DWORD。字节算术也可以实现为32位算术(广泛评估)。它不会导致整数类型出现问题。
(2)在示例中
float f(float x){return x * 0.1F; }
float g(float x){return x * 0.1; }
为什么“允许函数f返回a 值比浮点宽,但函数g (使用更宽的常数)是 不是“?
这就是当前的C标准所说的:0.1f可以以更宽的格式存储(而不是浮点数),x * 0.1f也可以以更宽的格式进行评估,并且返回运算符不需要执行转换为float并且可以“按原样”返回结果。使用g函数,返回运算符需要执行从double到float的转换。
在f()中,x和0.1f都是浮点型 所以我认为x * 0.1f也是浮动的 类型?在g()中,可能认为是0.1 为double,所以x * 0.1是double?
是的,这适用于所有32位编译器(至少我认为:))。但是这篇文章正在处理这个问题。
(3)道德的道德是什么 制品
C标准很难学习:)