【发布时间】:2013-07-01 10:18:48
【问题描述】:
在 C 中,字符串是 char (char *) 的数组,字符通常存储在 char 中。我注意到 libC 中的一些函数将整数而不是字符作为参数。
例如,让我们以函数toupper() 和tolower() 为例,它们都使用int。手册页说:
如果 c 不是无符号字符值或 EOF,则这些值的行为 函数未定义。
我的猜测是,int、toupper 和 tolower 能够处理 unsigned char 和 EOF。但实际上EOF 在实践中是(关于它的值是否有任何规则?)一个可以用char 存储的值,并且由于这些函数不会将EOF 转换为其他东西,我想知道为什么toupper 不简单地将字符作为参数。
无论如何,为什么我们需要接受不是字符的东西(例如EOF)?有人可以给我一个相关的用例吗?
这与fputc 或putchar 类似,它们也采用int,无论如何都会转换为unsigned char。
我正在寻找该选择的确切动机。我想被说服,我不想回答我不知道有一天是否有人问我。
【问题讨论】:
-
我不知道
EOF必须适合char的任何规则,我可以向您保证char不保证被签名,这使您讨论使用@987654343 @ 而不是unsigned char似乎是错误的。你的意思是signed char。 -
你看过这些函数的实现吗?我认为
int参数是出于优化目的,因为它的字节大小非常适合处理器寄存器的大小。反过来,一个字节的char变量必须在幕后转换为int,这个操作需要一些处理器时间来处理。