3

我正在阅读The C programming LanguageK&R的书来学习c。它说

由于函数调用的参数是表达式,因此在将参数传递给函数时也会发生类型转换。在没有函数原型的情况下,char 和 short 变成了 int,而 float 变成了 double。

在过去的几天里,我一直在为这条线苦苦挣扎以理解。我认为这是很重要的一点。无论我在做什么假设,它都不会成为现实。任何人都可以帮助我清楚地理解它吗?

4

2 回答 2

4

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

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

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

上面的调用相当于调用

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

这一点很重要,因为调用者和被调用者之间在传递参数方面存在隐式协议:传递参数的方式以及参数的内存占用取决于类型。如果调用者没有以正确的格式将参数放入内存中,则被调用者将无法正确使用参数。这就是为什么两者必须以某种方式就每个参数的类型达成一致。该标准说“协议”以函数原型的形式出现。如果原型缺失,则标准提供“默认协议”,即charand shortbecomeintfloatbecome double

于 2013-07-04T01:38:44.610 回答
3

这里的关键是“在没有函数原型的情况下”,这不是通常的情况。你会看到这种转换的最常见的地方是在一个变量参数列表中到一个函数,比如printf.

于 2013-07-04T01:37:28.037 回答