谁决定了角色的排序

我有一个基于以下程序的查询 –

char ch; ch = 'z'; while(ch >= 'a') { printf("char is %c and the value is %d\n", ch, ch); ch = ch-1; } 

为什么在上述程序中不能保证打印整套小写字母。 如果C对内部forms的字符排序没有多少保证,那么实际上是谁以及如何做?

编译器实现者选择其基础字符集。 关于标准唯一要说的是必须有一定数量的字符,并且数字字符是连续的。

C99执行环境所需的字符是AZaz09 (必须在一起并按顺序),任何一个!"#%&'()*+,-./:;<=>?[\]^_{|}~ ,空格,水平制表符,垂直制表符,换页符,警报,退格键,回车符和新行。这在当前的C1x草案中保持不变,该标准的下一次迭代。

其他一切都取决于实施。

例如,代码如:

 int isUpperAlpha(char c) { return (c >= 'A') && (c <= 'Z'); } 

将在使用EBCDIC的主机上中断,将大写字符分成两个区域。

真正可移植的代码将考虑到这一点。 所有其他代码应记录其依赖项。

您的示例的更便携式实现将是以下内容:

 static char chrs[] = "zyxwvutsrqponmlkjihgfedcba"; char *pCh = chrs; while (*pCh != 0) { printf ("char is %c and the value is %d\n", *pCh, *pCh); pCh++; } 

如果你想要一个真正的可移植解决方案,你应该使用islower()因为只检查拉丁字符的代码将无法移植到(例如)希腊语,使用Unicode作为其基础字符集。

为什么在上述程序中不能保证打印整套小写字母。

因为可以使用带有EBCDIC字符编码的C,其中字母不是连续的。

显然是由你正在使用的C的实现决定的,但更可能由你决定的是它由美国信息交换标准码 ( ASCII )决定。

它由执行字符集决定。

在当今的大多数情况下,这是ASCII字符集,但C不要求使用特定的字符集。

请注意,对执行字符集中的字符排序有一些保证。 例如,保证数字“0”到“9”的每个数值都大于前一个数字的值。

如今,人们四处打电话给你的代码是不便携的,他们正在进行无用的迂腐。 由于传统的EBCDIC大型机拒绝死机,因此支持ASCII不兼容的编码仅保留在C标准中。 现在或将来,您永远不会在任何现代计算机上遇到与ASCII不兼容的字符编码。 给它几十年,你永远不会遇到任何东西,但UTF-8。

回答你关于决定字符编码的问题:虽然它名义上是你的实现(C编译器,库和操作系统)的压缩,但最终由互联网决定,既有现有的做法,也有IETF标准。 据推测,现代系统旨在相互通信和互操作,在ASCII兼容编码和EBCDIC之间来回转换每个协议头,html文件,javascript源,用户名等将是一个巨大的麻烦。其他地方一团糟。

最近,很明显,不仅对于机器解析的文本而且对于自然语言文本的通用编码也是非常期望的。 (自然语言文本交换不像机器解析文本那么基本,但仍然非常常见和重要。)Unicode提供了字符集,并且作为唯一与ASCII兼容的Unicode编码,UTF-8几乎是ASCII的inheritance者通用字符编码。

我回答你的时间太晚了,除了已经说过的内容,我想补充一点。

在第5个转换阶段(预处理器的一部分),源字符集的每个成员被转换为执行字符集的相应字符。 5.1.1.2p5ISO 9899 5.1.1.2p5

  1. 字符常量和字符串文字中的每个源字符集成员和转义序列都将转换为执行字符集的相应成员; 如果没有相应的成员,则将其转换为除null(宽)字符以外的实现定义成员。 7)

源char集不需要与执行char集相同; 正如其他人所说,如果执行字符集是IBM大型机的EBCDIC ,则逻辑与ASCII字符集的情况不同。