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

时间:2016-12-18 14:36:14

标签: c case-insensitive

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

2 个答案:

答案 0 :(得分:4)

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

在60年代,有很多关于信件案例的实验。有一段时间,BCPL reserved lowercase words as system keywords要区分用户名,必须是大写或单字母小写。但后来他们切换到大写(后来又回到了小写)和whether it was case sensitive depended on the compiler。 FORTRAN / Fortran也是如此,它通常不区分大小写,但sometimes is in wildly complicated ways

因此,当我说“它会使编译器变慢”时,我并不是说“因为它是一种较旧的语言,处理器时间更加珍贵。”大多数现代语言都区分大小写。许多较旧的语言在其历史和实现方面具有不同的区分大小写。但从根本上说,案例敏感性对于计算机来说更简单。这是Unix的大部分设计,C(最初是B)是built to be the system language for Unix。但同样,这只是一个particular design decision in Unix,而不是一些“必须这样”的深刻选择。

但所有这些只是在谈论并回到正确的答案。答案是:因为这就是C的定义方式。

答案 1 :(得分:0)

你可以:

https://ideone.com/Ebzf5J

#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;
}

它只有 29,694 定义(是啊!)。