|
|
在C语言中,当函数声明使用空参数列表(如 `int func();`)时,调用函数时实参会经历“默认参数提升”:
- `char` 和 `short` 类型提升为 `int`
- `float` 类型提升为 `double`
如果函数定义中的参数类型为 `int a`,则提升后的实参类型(例如 `char` 提升为 `int`)与形参类型匹配,因此编译器可能不会报错。但如果函数定义中的参数类型为 `char a`,则提升后的实参类型(`int`)与形参类型(`char`)不匹配,这可能导致编译器报错或未定义行为。
示例:
使用 `int a`(可能不报错):
- #include <stdio.h>
- int old_func(); // 空参数列表声明
- int main() {
- char c = 'A';
- old_func(c); // 实参 c 被提升为 int
- return 0;
- }
- int old_func(int a) { // 定义参数为 int a
- printf("%d\n", a);
- return 0;
- }
复制代码
使用 `char a`(可能报错):
- #include <stdio.h>
- int old_func(); // 空参数列表声明
- int main() {
- char c = 'A';
- old_func(c); // 实参提升为 int
- return 0;
- }
- int old_func(char a) { // 定义参数为 char a
- printf("%c\n", a);
- return 0;
- }
复制代码
原因:
- 默认提升后,实参变为 `int` 类型,与 `int a` 匹配。
- 但提升后的 `int` 传递给 `char a` 时,类型不兼容,编译器可能检测到声明与定义不一致而报错。
建议:始终使用函数原型(如 `int func(int a);`)来明确参数类型,避免此类问题。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|