C:函数调用时传递参数时的类型转换

2024-02-05

来自《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(使用前将#替换为@)

C:函数调用时传递参数时的类型转换 的相关文章

随机推荐