我刚开始学习 C,但我很难理解为什么下面的代码能正常工作:
void convertMyNumber (float myValue) {
int myNewValue = floor(myValue * 100);
printf("%d", myNewValue);
}
查看 math.h 的文档,指出 floor()
函数接受一个 double
作为参数,并且还返回一个 double
。到目前为止一切顺利,我只是运行上面的代码并输入 576.73
作为 myValue
变量的值。令我惊讶的是,它在屏幕上准确地打印出 57673
,我发现很难理解它如何能够归因于 floor 的返回值
函数(一个 double
)到 int myNewValue
。
这一行 int myNewValue = floor(myValue * 100);
包含不少于 3 个隐式转换。
在myValue * 100
中,整型常量100
的类型是int
。称为“通常的算术转换” 的隐式转换将int
操作数转换为float
。乘法在 float
上执行,结果类型为 float
。参见 Implicit type promotion rules .
将先前计算的float
结果转换为函数操作数的类型。函数参数被隐式转换“就像通过赋值一样”,将传递的参数转换为参数的类型,在本例中为 double
。
double
的结果通过赋值转换为左操作数 int
的类型。如果 double
包含一个可以用 int
表示的值,则此转换是明确定义的。
这就是它起作用的原因,但是依赖隐式转换通常不是一个好主意,因为意外错误的可能性很大。
我是一名优秀的程序员,十分优秀!