使用'a'-'A'而不是“32”或空格字符背后的逻辑是什么?
这是“ The C Programming Language ”一书中的代码,它将单个字符映射到 ASCII 字符集的小写,如果字符不是大写字母,则返回不变:
int lower(int c)
{
if (c >= 'A' && c <= 'Z')
return c + 'a' - 'A';
else
return c;
}
我不明白背后的逻辑return c + 'a' - 'A';。
他们为什么不简单地输入' '或 数字32而不是'a' - 'A'?
回答
在ASCII字符集'a' - 'A'恰好有一个值的32。这是完全无关的ASCII空格字符' '还具有32的值,所以它是没有意义的替换'a' - 'A'用' '。
Using'a' - 'A'比 更有意义和更容易理解32,并且也不会将实现与使用特定字符集联系起来(尽管a-z它A-Z需要连续才能工作,但并非所有字符集都如此)。
- 需要明确的是,`c + 'a' - 'A'` 的字母不需要连续,即可将大写字母转换为小写字母。这也适用于 EBCDIC,即使那里的字母不连续。它只需要相应字符之间的均匀距离。`c >= 'A' && c <= 'Z'` 的字母需要连续才能正确检测大写字母。