调用 toupper() 和 tolower() 时:转换为无符号字符
虽然 Stack Overflow 上一位信誉良好的评论者建议转换 char-在调用 toupper 或 tolower 之前传递给 unsigned char 的参数,Bjarne 没有明确提到这种必要性Stroustrup 在《C 编程语言》中。这种意见差异引发了一个问题:这样的强制转换是必要的还是疏忽?
类型和表示
char、signed char 和 unsigned char 是不同的类型。虽然 char 通常表示有符号或无符号表示形式,但 toupper 函数需要一个可表示为无符号 char 的 int 参数。如果参数不可表示或等于 EOF,则会发生未定义的行为。
未定义的行为
假设普通 char 是有符号类型。如果 name[0] 表示负值,则使用 toupper(name[0]) 可能会出现未定义的行为。然而,对于 Stroustrup 提供的示例,初始化保证非负值。
不必要的转换
尽管如此,将 char 转换为 (unsigned)char 并不能解决问题,因为由于隐式的原因,它仍然可能导致负 int 值
实际注意事项
虽然可以实现 toupper 来处理负值,但这不是强制性的。此外,这些函数必须接受等于 EOF (-1) 的参数,该参数通常为负值。
结论
尽管 toupper 接受 EOF,但仍需要输入字符可表示为无符号字符,以防止未定义的行为。虽然 Stroustrup 的示例可能并未表明需要进行强制转换,但建议这样做,以确保可移植性和正确的功能,特别是在处理负数或特殊字符时。
以上是对于'toupper()”和'tolower()”:我们必须转换为'unsigned char”吗?的详细内容。更多信息请关注PHP中文网其他相关文章!