2016-12-18 3 views
-2

CキーワードはCコンパイラによってあらかじめ定義されており、C89では小文字です。 32個しかないので、なぜそれらを大文字小文字を区別しないものとして定義できないのですか?なぜCキーワードで大文字と小文字が区別されるのですか?

+2

トークナイザを簡単にするためです。これは、メモリとプログラムサイズがキロバイト単位で測定されたときの大きな理由でした。 – Jens

+1

C11では44個のキーワードがあり、そのうち10個は大文字と小文字が混在しています。 C99では、小文字の2つのキーワード( '_Bool'、' _Complex'、 '_Imaginary')を加えた2つのキーワード(' 'inline''と' 'restrict'')が追加されました。 –

+0

皆さんありがとうございます:) – Kailash

答えて

4

Cは大文字と小文字を区別するため、これらはキーワードです。大文字と小文字を区別しないようにするとコンパイラの処理速度が低下しますが、本当の理由はそれがどのように定義されたのかということです。

60代の大文字小文字の実験がたくさんありました。しばらくの間、ユーザー名と区別するためにBCPL reserved lowercase words as system keywordsを使用してください。ユーザー名は、大文字または小文字の1文字でなければなりません。しかし、その後、大文字に変換され(そして後で小文字に戻る)、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

C99以降では、いくつかのキーワードが混在しています - いくつかのキーワードは大文字と小文字が混在しています - _Alignof、_Alignas、_Complex、_Imaginary、_Noreturn、_Thread_local、_Atomic '、' _Generic'、 '_Static_assert'です。 –

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

そして、それが唯一の定義(いや!)です。

+1

これは、これがどれだけ前処理時間を悲観するのだろうかと思っています。 – PSkocik

関連する問題