就编译器类型检查和自动转换而言,printf 的转换说明符是否等同于函数声明?
不会。当您将 a 传递char
给可变参数函数时,您传递的值将被提升为int
。这与您使用的转换说明符无关。C11 标准在 §6.5.2.2p7 中对此进行了描述:
函数原型声明器中的省略号会导致参数类型转换在最后一个声明的参数之后停止。默认参数提升是在尾随参数上执行的。
默认参数提升在 §6.5.2.2p6 中定义为整数提升的超集:
...整数提升在每个参数上执行,并且具有类型的参数float
被提升为double
. 这些被称为默认参数提升。
...和整数促销在 §6.3.1.1p2 中定义:
如果 anint
可以表示原始类型的所有值(受宽度限制,对于位域),则该值将转换为int
; 否则,将其转换为unsigned int
. 这些被称为
整数促销。
为了让我的问题更清楚,举个例子,
无效 f1 (int a){}
int main() { f1('c'); 返回0;}
帮助我理解如果我声明一个带有 int 参数的函数但在调用中传递 char 类型会发生什么。
不,它没有。'c'
实际上是一个int
. 如果你不相信我,你自己看看:
#include <stdio.h>
#ifdef __cplusplus
#error "Don't compile C code with a C++ compiler."
#endif
int main(void) {
printf("sizeof 'c': %zu\n", sizeof 'c');
}