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



在一本C书中遇到过这个陈述,if ((letter >= 'P') && (letter <= 'S'))

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

  1. 如何对字母表(字符数据类型(执行大于/小于类型操作?
  2. 它仅在 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将编译,但它会做错误的事情:它不是比较字符串内容,而是将ab转换为指针并比较两个指针的值。这是未定义的行为(!(,这意味着它不是有效的C,结果可能是不可预测的,但编译器不一定会告诉你有什么问题。

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

'P'这样的字符文字是字符的数字代码(通常是 ASCII 代码,但标准不指定编码(。在ASCII中,字母的代码是连续的(分别用于A-Za-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 标准也没有指定编码集中的字符值需要按字母顺序排列。

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

相关内容

  • 没有找到相关文章

最新更新