Igo*_*nko 3 c standards glibc c-standard-library
有谁知道为什么参数类型的putchar(),fputc()而putc()不是char,但参数类型的putwchar(),fputwc()并且putwc()是wchar_t?另请参阅此和此。
答案是“传统”(或“历史”)。在C90标准之前,没有函数原型和所有参数的所有功能都受到默认的促销规则,因此char被自动传递作为int(short晋升为int过,并float至double,同样地,对于无符号类型)。该标准无法破坏现有代码,因此它为这些功能保留了该类型。在实践中几乎没有什么区别。即使您传递的值超出范围,您传递的值也将被视为字符类型。的规格fputc(int c, FILE *stream)说:
该
fputc函数将由c(转换为unsigned char)指定的字符写入到stream… 指向的输出流中。
§6.5.2.2函数调用
¶6如果表示被调用函数的表达式的类型不包括原型,则对每个参数执行整数提升,并将类型为float的参数提升为双精度。这些称为默认参数提升。…
¶7…函数原型声明器中的省略号引起参数类型转换在最后声明的参数之后停止。默认参数提升是对尾随参数执行的。
整数提升在第6.3.1节中定义
¶2在可以使用
int或的表达式中unsigned int可以使用以下代码:
- 一个对象或表达一个整型(除
int或unsigned int),其整数转换秩小于或等于的秩int和unsigned int。- 类型的位字段
_Bool,int,signed int,或unsigned int。如果an
int可以代表原始类型的所有值(受位字段的宽度限制),则该值将转换为anint。否则,它将转换为unsigned int。这些称为整数促销。58)整数促销未更改所有其他类型。¶3整数促销保留包括符号在内的价值。如前所述,是否将“普通”
char视为签名是实现定义的。58)的整数优惠只应用:如通常的算术转换的一部分,某些参数表达式,以一元的操作数
+,-以及~运营商和所述移位运算符的两个操作数,如由它们各自的小节中规定。
整数等级在本节的¶1中定义为10个要点。