char
会自动作为int
传递(short
也会被提升为int
,float
也会被提升为double
,无符号类型同理)。标准不能破坏现有代码,因此保留了这些函数的类型。实际上几乎没有什么区别。即使传递超出范围的值,您传递的值也将被视为字符类型。 fputc(int c, FILE *stream)
的规范说明如下:
fputc
函数将由c
指定的字符(转换为unsigned char
)写入到由stream
指向的输出流中...
整数提升在§6.3.1中定义。§6.5.2.2 函数调用
¶6 如果表示被调用函数的表达式具有不包括原型的类型,则对每个参数执行整数提升,并将类型为float的参数提升为double。这些被称为默认参数提升。…
¶7 …函数原型声明符中的省略号表示在最后一个声明的参数之后停止参数类型转换。默认参数提升对尾随参数执行。
¶2 下列内容可在表达式中使用,其所属的类型可以是
int
或unsigned int
:
- 一个整型类型(但不是
int
或unsigned int
)的对象或表达式,其整型转换等级小于或等于int
和unsigned int
的等级。_Bool
、int
、signed int
或unsigned int
类型的位域。如果一个
int
类型可以表示原始类型的所有值(对于位域,则由宽度限制),则将该值转换为int
;否则,将其转换为unsigned int
。这被称为整数提升58)。所有其他类型都不受整数提升的影响。¶3 整数提升保留了值,包括符号。如前所述,“普通”的
char
类型是否被视为带符号是由实现定义的。58) 整数提升仅应用于:作为通常算术转换的一部分,某些参数表达式,一元
+
、-
和~
运算符的操作数,以及移位运算符的两个操作数,如各自的子句中所指定的。
整数等级在第10条中的¶1节中定义为10个要点。
putchar(EOF);
输出的是 0xff
。 - Igor Liferenkoputchar(c)
等价于putc(c, stdout)
,而putc(c, stdout)
又非常接近fputc(c, stdout)
。fputc
被指定将其第一个参数转换为unsigned char
。EOF
通常为-1
(尽管这并不保证),将该值转换为unsigned char
则会得到UCHAR_MAX
,通常为0xff
。无论如何,将EOF
传递给putchar()
也没有太多意义。 - Keith Thompsonfputc()
的参数是int
还是signed char
变量,它都会被转换为unsigned char
。我使用EOF
作为负数的角色,因为在我的系统上它被认为是-1
。 - Igor Liferenko我认为Jonathan的回答太简单了。事情稍微有些合理。我认为处理单个字符的库函数没有一个是使用char
(只使用int
)的,因为即使其中一些不使用EOF
,我们也无法将其类型设置为char
,否则会收到类型转换警告。
void f(char c) { ...
...
char x = 't';
f((unsigned char)x);
...
warning: conversion to ‘char’ from ‘unsigned char’ may change the sign of the result
因为人们通常将类型转换为无符号字符以确保代码的可移植性,考虑到 char
的有符号性是未定义的。
所以唯一的选择就是将其设为 int
。
wchar_t
必须能够存储EOF等元值,而char
则不需要。因此,那些原本使用char
的地方需要改用int
,以便传输元值。这在C语言中相当常见。 - LambdaBetawint_t
的引入是因为当传递给printf()
等函数时,wchar_t
可能会受到“默认提升”规则的影响。标准指出,wint_t
可能与wchar_t
是相同类型,但如果wchar_t
是一个(16位)short
,那么wint_t
可能是一个(32位)int
类型。 - Jonathan Lefflerprintf()
等函数时,wchar_t
可能是受'默认提升'规则约束的类型。”请将此内容与示例添加到http://stackoverflow.com/questions/40601645/how-to-change-wchar-h-to-make-wchar-t-the-same-type-as-wint-t中,以便我可以点赞。 - Igor Liferenko