来自《C 编程语言》第二版:
由于函数调用的参数是表达式,因此当参数传递给函数时也会发生类型转换。如果没有函数原型,char 和short 会变成int,float 会变成double。
通过阅读文本,我得到的印象是,除非您使用强制转换或函数原型显式指定参数类型,否则函数参数将始终以 int 或 double 形式传递。
为了验证我的假设,我编译了以下代码:
#include <stdio.h>
main()
{
unsigned char c = 'Z';
float number = 3.14f;
function_call(c, number);
}
void function_call(char c, float f)
{
}
编译后我收到以下警告:
typeconversion.c:11:警告:“function_call”的类型冲突
typeconversion.c:7:警告:之前的“function_call”隐式声明在这里
我的猜测是 c 和 number 在函数调用时都转换为 int 和 double,然后又转换回 char 和 float。这是真实发生的事情吗?
强制转换是无关紧要的,重要的是(可能是隐式的)原型。
void foo(short s) {
// do something
}
int main(void) {
signed char c = 'a';
foo(c); // c is promoted to short by explicit prototype
bar(c); // c is promoted to int by implicit prototype
}
void bar(int i) {
// do something
}
当书中说“函数调用的参数是表达式”时,这意味着适用相同的类型提升规则。如果您将函数参数视为对函数原型中指定的变量的隐式赋值,可能会更容易理解。例如在通话中foo()
上面有一个隐含的short s = c
.
这就是为什么演员阵容并不重要。考虑以下代码片段:
signed char c = 'a';
int i = (short) c;
这里c的值首先提升为short
(明确地)然后int
(隐含地)。的价值i
将永远是一个int
.
As for char
and short
变得int
and float
变得double
它指的是隐式函数原型的默认类型。当编译器在看到原型或函数定义之前看到对函数的调用时,它会自动生成原型。它默认为int
对于整数值和double
对于浮点值。
如果最终的函数声明与隐式原型不匹配,您将收到警告。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)