为什么我们可以比较字符常量?
Why can we compare character constants?
在一本 C 语言的书中看到了这个语句,if ((letter >= 'P') && (letter <= 'S'))
它正在尝试检查字母是否落在 P 和 S 之间(包括两者),我很惊讶地看到它起作用了。
- 如何对字母表(字符数据类型)进行 greater-than/lesser-than 类型运算?
- 它是仅 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
会编译,但它会做错事:它不会比较字符串内容,而是会将 a
和 b
转换为指针并比较值的两个指针。那就是 undefined behaviour (),这意味着它不是有效的 C,结果可能是不可预测的,但编译器不一定会告诉你任何错误。
C中的char
实际上是小整数(通常范围是-128..127
)。所有适用于其他整数的运算符也适用于 char
s,这包括 >=
和 <=
.
像 'P'
这样的字符文字是字符的 数字代码 (通常是 ASCII 代码,但标准没有指定编码)。在 ASCII 中,字母的代码是连续的(分别用于 A-Z
和 a-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 标准也没有指定编码集中的字符值需要按字母顺序排列。
另请注意,实现相同比较效果的语法在其他语言中可能完全不同。
在一本 C 语言的书中看到了这个语句,if ((letter >= 'P') && (letter <= 'S'))
它正在尝试检查字母是否落在 P 和 S 之间(包括两者),我很惊讶地看到它起作用了。
- 如何对字母表(字符数据类型)进行 greater-than/lesser-than 类型运算?
- 它是仅 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
会编译,但它会做错事:它不会比较字符串内容,而是会将 a
和 b
转换为指针并比较值的两个指针。那就是 undefined behaviour (
char
实际上是小整数(通常范围是-128..127
)。所有适用于其他整数的运算符也适用于 char
s,这包括 >=
和 <=
.
像 'P'
这样的字符文字是字符的 数字代码 (通常是 ASCII 代码,但标准没有指定编码)。在 ASCII 中,字母的代码是连续的(分别用于 A-Z
和 a-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 标准也没有指定编码集中的字符值需要按字母顺序排列。
另请注意,实现相同比较效果的语法在其他语言中可能完全不同。