Cの文字リテラルがcharではなくintなのはなぜですか?

同じ主題に関するディスカッション


元の質問は「なぜ?」です

その理由は、既存のコードとの下位互換性を維持しようとしながら、リテラル文字の定義が進化および変更されたためです。

初期の C の暗い時代には、タイプはまったくありませんでした。私が C でのプログラミングを初めて学んだ頃には、型は導入されていましたが、関数には呼び出し元に引数の型を伝えるためのプロトタイプがありませんでした。代わりに、パラメーターとして渡されるすべてのものが int のサイズ (これにはすべてのポインターが含まれます) であるか、double であることが標準化されました。

これは、関数を記述しているときに、double ではないすべてのパラメーターが、どのように宣言したかに関係なく、スタックに int として格納され、コンパイラーがこれを処理するコードを関数に入れたことを意味します。

これは物事に多少の一貫性を持たせなかったので、K&R が有名な本を書いたとき、文字リテラルは関数パラメーターだけでなく、あらゆる式で常に int に昇格されるというルールを導入しました。

ANSI 委員会が最初に C を標準化したとき、文字リテラルが単に int になるようにこの規則を変更しました。これは、同じことを達成するためのより簡単な方法と思われるからです。

C++ が設計されていたとき、すべての関数は完全なプロトタイプを持つ必要がありました (これは C ではまだ必要ではありませんが、良い習慣として広く受け入れられています)。このため、文字リテラルを char に格納できることが決定されました。 C++ でのこの利点は、char パラメーターを持つ関数と int パラメーターを持つ関数のシグネチャが異なることです。この利点は C には当てはまりません。

これが、それらが異なる理由です。進化...


C の文字リテラルが int 型である具体的な理由はわかりません。しかし、C++ では、そのようにしない十分な理由があります。これを考慮してください:

void print(int);
void print(char);

print('a');

print の呼び出しで、char を受け取る 2 番目のバージョンが選択されることが予想されます。文字リテラルが int であることは、それを不可能にします。 C++ では、複数の文字を持つリテラルの型は int のままですが、それらの値は実装で定義されていることに注意してください。だから、 'ab' タイプ int を持っています 、 'a' の間 タイプ char を持っています .