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

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

为什么在上述程序中无法保证整套小写字母的打印。如果C没有对内部形式的字符顺序做出很多保证,那么实际上是谁做的以及如何做呢?

最佳答案

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

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作为其基础字符集的希腊语。

关于c - 谁决定字符的顺序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3332142/

10-14 16:33
查看更多