2010-02-15 89 views
2

我很难理解的文章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允许比浮子返回一个值更宽,但函数g(它使用更宽的常数)不为”?

在f(),x和0.1f都是浮点型,所以我认为x * 0.1f也是浮点型?在g()中,0.1可能被认为是double,所以x * 0.1是双精度型?什么是文章的道德?

感谢和问候!

+0

气味像功课 – JonH 2010-02-15 20:42:05

+1

@JonH:我很怀疑安全编码的限制正在做功课....听起来就像是试图跟上进度找工作。 – 2010-02-15 20:43:28

+0

这听起来不像功课。谁在正确的思想在教室里教C语言的疯狂特性?这是真实的世界! – 2010-02-15 20:44:24

回答

2

函数g返回类型float,它是一个32位的值。 0.1被解释为double,这意味着x * 0.1表达式返回一个double。 double是一个64位的值,它会导致缩小的转换以便作为浮点返回。 x可以安全地转换为double,因为这是从float到double的扩展转换。

1

(1)在

Conversion as if by assignment to the type of the function is required 

如果返回表达具有 不同的类型的功能,但不 如果返回表达具有 更宽值不仅是因为宽 评价。

什么是“广泛评估”?它试图说什么 ?

如果声明一个字节变量或常量,它实际上可能会作为DWORD存储在32位平台上。字节算术也可以实现为32位算术(广泛评估)。它不会导致整数类型的问题。

(2)在本例中

浮子F(浮动x)的{返回X * 0.1F;}

浮子克(浮X){返回X * 0.1; }

为什么“函数f允许比浮子返回一个 值更宽,但函数g (它使用更宽的常数)是 不是”?

这就是现在的C标准所说的:0.1f可以以更宽的格式(比浮点)存储,x * 0。1f也可以以更宽的格式进行评估,并且返回运算符不需要执行转换为浮点运算,并且可以返回“原样”结果。使用g函数,返回运算符需要执行从double到float的转换。

在F(),x和0.1F都是float类型 所以我认为X * 0.1F也漂浮 类型?在g()中,0.1可能被认为是 的两倍,所以x * 0.1是双倍的?

是的,这是适合所有的32位编译器(至少我认为是这样:))。但文章总的来说就是处理这个问题。

(3) 文章的道德是什么?

C标准是学习一个很难的事情:)