考虑以下代码:
void function (char arg)
{
// function's content
}
int main(void)
{
long double x = 1.23456;
function(x);
}
我给这个函数一个不应该得到的参数。为什么它不会导致错误?
它是隐式转换的。
在赋值、参数传递、return
语句和其他语句的上下文中,如果目标类型也是算术类型,则任何算术类型的表达式都会隐式转换为目标的类型。在这种情况下,double
参数被隐式转换为char
。(这种特殊的转换很少有意义,但就语言而言,它是有效的。(
请注意,这种隐式转换不是对可变参数(例如格式字符串后的print
参数(执行的,因为编译器不知道目标类型是什么。printf("%dn", 1.5)
不会将1.5
从double
转换为int
;相反,它具有未定义的行为。
对于使用不同类型的运算符计算表达式,也有一些规则。我不会在这里讨论所有的细节,但举个例子:
int n = 42;
double x = 123.4;
如果写入n + x
,则在执行加法之前,n
的值将从int
提升(隐式转换(为double
。
在您的示例中,double
类型被隐式转换为char
。