为什么我们可以比较字符常量?

Why can we compare character constants?

在一本 C 语言的书中看到了这个语句,if ((letter >= 'P') && (letter <= 'S'))

它正在尝试检查字母是否落在 P 和 S 之间(包括两者),我很惊讶地看到它起作用了。

  1. 如何对字母表(字符数据类型)进行 greater-than/lesser-than 类型运算?
  2. 它是仅 C 语言或其他编程语言中的特性吗?

How is it possible

反过来问,为什么不呢?我们的字母表是自然排序的,字母之间的排序很方便,也很有意义。在 C 的特殊情况下,字符文字只是整数,因此对它们进行排序自然有效。

在更技术层面上,字符通过某种编码模式映射到整数,称为 character encoding。存在不同的编码,使用哪种特定编码没有由 C 标准定义,并且对于比较字符并不重要,只要它是一致的。这也意味着 C 不保证此顺序对应于特定的字母表,或者字母是连续的。

It is a feature in only C or in other programming languages as well?

几乎每一种现代编程语言都允许字符类型的顺序比较。


警告: 许多语言将此功能扩展到字符 字符串 。这样的比较称为 lexicographical comparison. While C also supports this, e.g. via strcmp,重要的是要注意 C 不允许您使用运算符比较字符串(<><=>= ).不幸的 C 会毫无怨言地接受你的尝试:

char a[] = "hello";
char b[] = "world";
if (a < b) { /* not allowed! */ }
if (strcmp(a, b) < 0) { /* correct way. */ }

第一个 if 会编译,但它会做错事:它不会比较字符串内容,而是会将 ab 转换为指针并比较值的两个指针。那就是 undefined behaviour (),这意味着它不是有效的 C,结果可能是不可预测的,但编译器不一定会告诉你任何错误。

C中的

char实际上是小整数(通常范围是-128..127)。所有适用于其他整数的运算符也适用于 chars,这包括 >=<=.

'P' 这样的字符文字是字符的 数字代码 (通常是 ASCII 代码,但标准没有指定编码)。在 ASCII 中,字母的代码是连续的(分别用于 A-Za-z),因此 >=<= 做正确的事情。


It is a feature in only C or in other programming languages as well?

至少有一种语言是这样的:C++是基于C的,所以也有这个特性。

"How is it possible to do greater-than/lesser-than type operations on alphabets (character data type)?"

因为 字符常量 引用 f.e 的数字 character encoding 值。 ASCII、Unicode 或 UTF-8 字符集,并按字符的字母顺序列出。

部分参考资料:

https://en.wikipedia.org/wiki/ASCII

https://en.wikipedia.org/wiki/Unicode

https://en.wikipedia.org/wiki/UTF-8

"It is a feature in only C or in other programming languages as well?"

如果它们支持数字字符编码集,其中字符按后续字母顺序列出,则支持。

请注意,即使是 C 标准也没有指定编码集中的字符值需要按字母顺序排列。

另请注意,实现相同比较效果的语法在其他语言中可能完全不同。