我正在阅读K&撰写的The C programming Language
一书。 R学习c。它说
由于函数调用的参数是表达式,因此键入转换 当参数传递给函数时也会发生。在里面 没有函数原型,char和short变成int,并且浮动 变得双倍。
过去几天我在这条线上苦苦挣扎才明白。我认为这是重要的一点。无论我做出什么样的假设,它都不会成真。有人能帮我清楚地理解吗?
答案 0 :(得分:3)
在ANSI-C之前,通常没有原型的函数。在这种情况下,仅发生默认类型促销。
当有原型时,每个参数表达式都会转换为函数所期望的类型,就好像有一个演员:
// Declaration
void callMe(char x, int y);
...
// Call
callMe(50, 'x');
上述调用相当于调用
callMe((char)50, (int)'x');
这很重要,因为调用者和被调用者之间在传递参数时存在隐式协议:参数的传递方式以及参数的内存占用量取决于类型。如果调用者没有以正确的格式在内存中放置参数,则被调用者将无法正确使用这些参数。这就是为什么两者必须以某种方式就每个参数的类型达成一致。该标准表示“协议”以功能原型的形式出现。如果缺少原型,标准会提供“默认协议”,即char
和short
变为int
,float
变为double
。
答案 1 :(得分:2)
这里的关键是“在没有功能原型的情况下”,这不是通常的情况。您将看到这种转换的最常见位置是在printf
之类的函数的变量参数列表中。