0

在一本 C 书上看到了这个说法,if ((letter >= 'P') && (letter <= 'S'))

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

  1. 如何对字母表(字符数据类型)进行大于/小于类型的操作?
  2. 它只是 C 或其他编程语言中的一个特性?
4

3 回答 3

3

这怎么可能

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

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

它只是 C 或其他编程语言中的一个特性?

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


警告:许多语言将此功能扩展到字符串。这种比较称为字典比较。虽然 C 也支持这一点,例如 via strcmp,但重要的是要注意 C 不允许您使用运算符 ( <, >, <=, >=) 比较字符串。Unfortunate C 将接受您的尝试,而不会抱怨:

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

第一个if会编译,但会做错事:它不会比较字符串内容,而是将aand转换b为指针并比较两个指针的值。那是未定义的行为),这意味着它不是有效的 C,结果可能无法预测,但编译器不一定会告诉您有什么问题。

于 2020-06-01T13:15:03.100 回答
2

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

类似的字符文字'P'是字符的数字代码(通常是 ASCII 代码,但标准没有指定编码)。在 ASCII 中,字母的代码是连续的(分别代表A-Zand a-z),所以>=and<=做正确的事。


它只是 C 或其他编程语言中的一个特性?

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

于 2020-06-01T13:15:37.133 回答
2

如何对字母表(字符数据类型)进行大于/小于类型的操作?

因为字符常量是指 fe 的 ASCII、Unicode 或 UTF-8 字符集的数字字符编码值,并按字符的字母顺序列出。

一些参考资料:

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

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

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

它只是 C 或其他编程语言中的一个特性?

如果它们支持数字字符编码集,其中字符按随后的字母顺序列出,那么是的。

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

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

于 2020-06-01T13:18:17.850 回答