c中函数调用期间的类型转换

时间:2013-07-04 01:34:52

标签: c function arguments type-conversion

我正在阅读K&撰写的The C programming Language一书。 R学习c。它说

  

由于函数调用的参数是表达式,因此键入转换   当参数传递给函数时也会发生。在里面   没有函数原型,char和short变成int,并且浮动   变得双倍。

过去几天我在这条线上苦苦挣扎才明白。我认为这是重要的一点。无论我做出什么样的假设,它都不会成真。有人能帮我清楚地理解吗?

2 个答案:

答案 0 :(得分:3)

在ANSI-C之前,通常没有原型的函数。在这种情况下,仅发生默认类型促销。

当有原型时,每个参数表达式都会转换为函数所期望的类型,就好像有一个演员:

// Declaration
void callMe(char x, int y);
...
// Call
callMe(50, 'x');

上述调用相当于调用

callMe((char)50, (int)'x');

这很重要,因为调用者和被调用者之间在传递参数时存在隐式协议:参数的传递方式以及参数的内存占用量取决于类型。如果调用者没有以正确的格式在内存中放置参数,则被调用者将无法正确使用这些参数。这就是为什么两者必须以某种方式就每个参数的类型达成一致。该标准表示“协议”以功能原型的形式出现。如果缺少原型,标准会提供“默认协议”,即charshort变为intfloat变为double

答案 1 :(得分:2)

这里的关键是“在没有功能原型的情况下”,这不是通常的情况。您将看到这种转换的最常见位置是在printf之类的函数的变量参数列表中。