在一本C书中遇到过这个陈述,if ((letter >= 'P') && (letter <= 'S'))
它试图检查字母是否介于 P 和 S 之间(包括两者(,我很惊讶地看到它有效。
- 如何对字母表(字符数据类型(执行大于/小于类型操作?
- 它仅在 C 或其他编程语言中具有功能?
怎么可能
颠倒问题,为什么不呢?我们的字母表是自然有序的,字母之间的排序很方便,也很有意义。在 C 的特殊情况下,字符文字只是整数,因此对它们进行排序自然有效。
在更专业的层面上,字符通过某些编码架构(称为字符编码(映射到整数。存在不同的编码,并且使用哪种特定编码不是由 C 标准定义的,对于比较字符并不重要,只要它是一致的。这也意味着 C 不保证此顺序对应于特定的字母表,或者字母是连续的。
它仅在 C 或其他编程语言中具有功能?
实际上,每种现代编程语言都允许字符类型的顺序比较。
警告:许多语言将此功能扩展到字符串。这种比较称为词典比较。虽然 C 也支持这一点,例如通过strcmp
,但重要的是要注意 C 不允许你使用运算符(<
、>
、<=
、>=
(比较字符串。不幸的C会接受你这样做的尝试,而不会抱怨:
char a[] = "hello";
char b[] = "world";
if (a < b) { /* not allowed! */ }
if (strcmp(a, b) < 0) { /* correct way. */ }
第一个if
将编译,但它会做错误的事情:它不是比较字符串内容,而是将a
和b
转换为指针并比较两个指针的值。这是未定义的行为(!(,这意味着它不是有效的C,结果可能是不可预测的,但编译器不一定会告诉你有什么问题。
C 中的char
实际上是小整数(通常范围为-128..127
(。所有处理其他整数的运算符也适用于char
s,这包括>=
和<=
。
像'P'
这样的字符文字是字符的数字代码(通常是 ASCII 代码,但标准不指定编码(。在ASCII中,字母的代码是连续的(分别用于A-Z
和a-z
(,因此>=
和<=
做正确的事情。
它仅在 C 或其他编程语言中具有功能?
至少有一种语言可以:C++基于C,因此它也具有此功能。
">怎么可能对字母表(字符数据类型(进行大于/小于类型的操作?
因为字符常量是指 ASCII、Unicode 或 UTF-8 字符集的数字字符编码值,并且按字符的字母顺序列出。
一些参考资料:
https://en.wikipedia.org/wiki/ASCII
https://en.wikipedia.org/wiki/Unicode
https://en.wikipedia.org/wiki/UTF-8
">它只是C语言或其他编程语言的功能吗?">
如果它们支持数字字符编码集,其中字符按后续的 alpabet 顺序列出,那么是的。
请注意,即使是 C 标准也没有指定编码集中的字符值需要按字母顺序排列。
另请注意,在其他语言中,实现相同比较效果的语法可能完全不同。