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