【问题标题】:Why can we compare character constants?为什么我们可以比较字符常量?
【发布时间】:2020-09-19 19:11:07
【问题描述】:

在一本 C 书籍中看到了这句话,if ((letter >= 'P') && (letter <= 'S'))

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

  1. 如何对字母表(字符数据类型)进行大于/小于类型操作?
  2. 这是只有 C 或其他编程语言才有的功能?

【问题讨论】:

  • 没有使用 C 的经验,但如果您将字符视为其 ASCII 表示形式,则通常可以进行操作

标签: c if-statement relational-operators


【解决方案1】:

怎么可能

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

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

这是只有 C 或其他编程语言才有的功能?

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


警告:许多语言将此功能扩展到字符字符串。这种比较称为lexicographical comparison。虽然 C 也支持这一点,例如通过strcmp,请务必注意,C 不允许您使用运算符(<><=>=)比较字符串。 Unfortunate 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标准不要求字母的代码是连续的或匹配字母顺序。
  • @EricPostpischil Whïchålphabét? ;-)(添加。)
【解决方案2】:

C 中的chars 实际上是小整数(通常范围为-128..127)。所有适用于其他整数的运算符也适用于chars,这包括&gt;=&lt;=

'P' 这样的字符文字是字符的数字代码(通常是ASCII 代码,但标准没有指定编码)。在 ASCII 中,字母的代码是连续的(A-Za-z 是分开的),所以 &gt;=&lt;= 做正确的事情。


这是只有 C 或其他编程语言才有的功能?

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

【讨论】:

    【解决方案3】:

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

    因为字符常量指的是数字character encoding f.e.的值。 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 标准也没有规定编码集中的字符值必须按字母顺序排列。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 2012-02-09
      • 1970-01-01
      • 2022-07-26
      相关资源
      最近更新 更多