CキーワードはCコンパイラによってあらかじめ定義されており、C89では小文字です。 32個しかないので、なぜそれらを大文字小文字を区別しないものとして定義できないのですか?なぜCキーワードで大文字と小文字が区別されるのですか?
答えて
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が定義されているからです。
C99以降では、いくつかのキーワードが混在しています - いくつかのキーワードは大文字と小文字が混在しています - _Alignof、_Alignas、_Complex、_Imaginary、_Noreturn、_Thread_local、_Atomic '、' _Generic'、 '_Static_assert'です。 –
次のことが可能です。
#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;
}
そして、それが唯一の定義(いや!)です。
これは、これがどれだけ前処理時間を悲観するのだろうかと思っています。 – PSkocik
- 1. ElasticSearch:なぜquery_stringでは大文字と小文字が区別され、ワイルドカードでは大文字と小文字が区別されますか?
- 2. AppleScriptで大文字と小文字が区別される
- 3. 大文字と小文字の区別から大文字小文字を区別しないものへ
- 4. 大文字と小文字の区別
- 5. 大文字と小文字は区別されますか?
- 6. バンドル - 大文字と小文字は区別されますか?
- 7. パスワードをlaravelに入力すると、5.2で大文字と小文字が区別され、大文字と小文字は区別されません。
- 8. nocasematchがオフのときに大文字と小文字が区別されないのはなぜですか?
- 9. boost :: spirit :: lexで大文字と小文字を区別しないキーワード
- 10. 大文字と小文字が区別されない文を確認する
- 11. yii2の国際化モジュールで大文字と小文字が区別されるのはなぜですか?
- 12. Windowsのウィンドウクラスでは大文字と小文字が区別されますか?
- 13. Macではfile_exists()の大文字と小文字が区別されますか?
- 14. javascriptのオブジェクトキーで大文字と小文字が区別されますか?
- 15. 大文字と小文字を区別しないXMLパーサC#
- 16. 大文字と小文字を区別しない解釈C#
- 17. php配列キーで大文字と小文字が区別されるのはなぜですか?
- 18. MariaDB/MySQLクエリーでは大文字と小文字が区別されますか?
- 19. Barementalデバイス名では大文字と小文字が区別されますか?
- 20. Railsチュートリアルで大文字と小文字が区別されない
- 21. なぜicontainsでdjangoをフィルタリングするのは大文字と小文字が区別されますか?
- 22. 大文字小文字の区別SSIS
- 23. indexOf大文字小文字の区別?
- 24. なぜuser.identity.nameの大文字と小文字の区別がC#で変わったのですか?
- 25. キーワード検索の大文字と小文字の区別を無効にする
- 26. Hibernate username password大文字と小文字の区別がOracle11gで
- 27. C++ヘッダーファイルの大文字と小文字の区別
- 28. 大文字と小文字を区別しない文字列の比較C++
- 29. VBA名のプロパティでは大文字と小文字が区別されます
- 30. 大文字と小文字は区別されませんregex.replace?
トークナイザを簡単にするためです。これは、メモリとプログラムサイズがキロバイト単位で測定されたときの大きな理由でした。 – Jens
C11では44個のキーワードがあり、そのうち10個は大文字と小文字が混在しています。 C99では、小文字の2つのキーワード( '_Bool'、' _Complex'、 '_Imaginary')を加えた2つのキーワード(' 'inline''と' 'restrict'')が追加されました。 –
皆さんありがとうございます:) – Kailash