为什么C关键字区分大小写?

为什么C关键字区分大小写?,c,case-insensitive,C,Case Insensitive,C关键字是由C编译器预定义的,在C89中是小写的。既然只有32个,为什么不能将它们定义为不区分大小写 因为C是区分大小写的,这些是关键字。使它们不区分大小写会使编译器速度变慢,但真正的原因是它是如何定义的 在60年代,有很多关于书信盒的实验。有一段时间,为了区别用户名,用户名必须是大写,或者是单字母小写。但后来他们改用大写字母(后来又改成小写字母),然后。FORTRAN/FORTRAN也是如此,它通常不区分大小写,但是 因此,当我说“这会使编译器变慢”时,我不是说“因为它是一种较旧的语言,处理器

C关键字是由C编译器预定义的,在C89中是小写的。既然只有32个,为什么不能将它们定义为不区分大小写

因为C是区分大小写的,这些是关键字。使它们不区分大小写会使编译器速度变慢,但真正的原因是它是如何定义的

在60年代,有很多关于书信盒的实验。有一段时间,为了区别用户名,用户名必须是大写,或者是单字母小写。但后来他们改用大写字母(后来又改成小写字母),然后。FORTRAN/FORTRAN也是如此,它通常不区分大小写,但是

因此,当我说“这会使编译器变慢”时,我不是说“因为它是一种较旧的语言,处理器时间更宝贵。”大多数现代语言都区分大小写。许多较旧的语言在其历史和实现中具有不同程度的大小写敏感性。但从根本上讲,区分大小写对于计算机来说更简单。这就是大多数Unix的设计方式,C(最初是B)就是这样。但同样,这只是一个,而不是一些“一定是这样”的深刻选择

但所有这些都只是在为答案辩护。答案是:因为C就是这样定义的。

您可以:

#包括
#包括
#包括
字符常量*常量千瓦[]={
“_Alignas”,
“_of”,
“_原子”,
“自动”,
“_Bool”,
“休息”,
“案件”,
“char”,
“_情结”,
“const”,
“继续”,
“默认”,
“做”,
“双倍”,
“否则”,
“枚举”,
“外人”,
“浮动”,
“为了”,
“_Generic”,
“后藤”,
“如果”,
“_想象”,
“内联”,
“int”,
“长”,
“_Noreturn”,
“注册”,
“限制”,
“返回”,
“短”,
“签署”,
“sizeof”,
“静态”,
“_Static_assert”,
“结构”,
“开关”,
“\u线程\u本地”,
“typedef”,
“联盟”,
“未签名”,
“无效”,
“挥发性”,
“虽然”,
};
静态整型梳(字符*s、整型ix、字符常量*orig){
如果(s[ix]==0){
如果(0!=strcmp(s,orig))
返回-(0>printf(#定义%s%s\n“,s,orig));
返回0;
}
s[ix]=托洛尔(s[ix]);
如果(0>梳(s,ix+1,原点))
返回-1;
s[ix]=toupper(s[ix]);
如果(0>梳(s,ix+1,原点))
返回-1;
返回0;
}
静态整数mk_定义(字符常量*s){
charb[20];
int len=strlen(s);
memcpy(b,s,len+1);
如果(0>comb(b,0,s))
返回-1;
返回0;
}
int main()
{
int n=功率大小(kw)/功率大小(kw[0]);
对于(整数i=0;imk u定义(千瓦[i]))
返回-1;
}
返回0;
}

而且它只定义了29694个(是的!)。

而且C99以后的一些关键词是混合大小写的-
\u Bool
\u Alignof
\u Alignas
\u Complex
\u virtual
\u Noreturn
\u Thread\u local
\u Atomic
\u Static\u assert
。因为它使标记器更简单。这是一个很强的原因,早在内存和程序大小以KB为单位的时候,注意在C11中,有44个关键字,其中10个是大小写混合的。在C99中,添加了两个小写的关键字(
inline
restrict
),再加上三个混合大小写关键字(
\u Bool
\u Complex
\u virtual
)。我有点想知道这会使预处理时间缩短多少。
#include <ctype.h>
#include <string.h>
#include <stdio.h>

char const * const kw[]={
"_Alignas",
"_Alignof",
"_Atomic",
"auto",
"_Bool",
"break",
"case",
"char",
"_Complex",
"const",
"continue",
"default",
"do",
"double",
"else",
"enum",
"extern",
"float",
"for",
"_Generic",
"goto",
"if",
"_Imaginary",
"inline",
"int",
"long",
"_Noreturn",
"register",
"restrict",
"return",
"short",
"signed",
"sizeof",
"static",
"_Static_assert",
"struct",
"switch",
"_Thread_local",
"typedef",
"union",
"unsigned",
"void",
"volatile",
"while",
};


static int comb(char * s, int ix, char const * orig){
    if(s[ix]==0){
        if(0!=strcmp(s,orig))
            return -(0>printf("#define %s %s\n", s, orig));
        return 0;
    }
    s[ix]=tolower(s[ix]);
    if(0>comb(s,ix+1,orig))
        return -1;
    s[ix]=toupper(s[ix]);
    if(0>comb(s,ix+1,orig))
        return -1;
    return 0; 
}
static int mk_defines(char const* s){
    char b[20];
    int len = strlen(s);
    memcpy(b,s,len+1);
    if(0>comb(b,0,s))
        return -1;
    return 0;
}

int main()
{
    int n = sizeof(kw)/sizeof(kw[0]);
    for(int i=0;i<n;i++){
        if(0>mk_defines(kw[i]))
            return -1;
    }
    return 0;
}