我有一个基于以下程序的查询-
char ch;
ch = 'z';
while(ch >= 'a')
{
printf("char is %c and the value is %d\n", ch, ch);
ch = ch-1;
}
为什么在上述程序中无法保证整套小写字母的打印。如果C没有对内部形式的字符顺序做出很多保证,那么实际上是谁做的以及如何做呢?
最佳答案
编译器实现者选择其基础字符集。该标准唯一要说的是,必须有一定数量的最小字符,并且数字字符是连续的。
C99执行环境所需的字符是A
到Z
,a
到z
,0
到9
(必须在一起并按顺序排列),!"#%&'()*+,-./:;<=>?[\]^_{|}~
,空格,水平制表符,垂直制表符,换页,警报,退格键,回车和换行。在当前的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/