11

これを宣言すると:

int i = 0 + 'A';

'A'考慮されますcharint

一部の人々は使用するかもしれません:

int i = 0 + (int)'A';

しかし、これは本当に必要ですか?

4

3 に答える 3

14

C では、 などの文字定数'A'の型はintです。C++ では、それらは型charです。

C では、文字定数の型が問題になることはめったにありません。であることが保証されていますintが、言語が に変更された場合char、ほとんどの既存のコードは引き続き適切に動作します。(明示的に参照するコードはsizeof 'A'動作を変更しますが、C と C++ を区別しようとしない限り、それを書いてもあまり意味がありません。それを行うには、より適切で信頼性の高い方法がありますsizeof 'A'。ここでは詳しく説明しません。)

あなたのコードサンプルでは:

int i = 0 + 'A';

0は 型intであり、 の 2 つのオペランドは+、必要に応じて共通の型に昇格されるため、どちらの方法でも動作はまったく同じです。これでも:

char A = 'A';
int i = 0 + A;

A、 (タイプが ) を に昇格させて、同じことを行います。型の式は通常、常にではありませんが、暗黙的に に昇格されます。charintcharint

C++ では、文字定数は型ですcharが、同じ昇格規則が適用されます。Stroustrup が C++ を設計したとき、彼は一貫性を保つために文字定数の型を変更し (型が であることAは確かに少し驚くべきことですint)、より一貫性のあるオーバーロード (C はサポートしていません) を可能にしました。たとえば、C++ 文字定数の型が の場合、次のintようになります。

std::cout << 'A';

(システムが EBCDIC を使用しない限り)65の ASCII 値を出力します。'A'印刷する方が理にかなっていますA

int i = 0 + (int)'A';

C と C++ の両方でキャストは不要です。C では、'A'は既に typeintであるため、変換は効果がありません。C++ では typecharですが、キャストがなければ暗黙的に変換されintます。

C と C++ の両方で、キャストは疑って見る必要があります。どちらの言語も多くのコンテキストで暗黙的な変換を提供し、通常、それらの変換は正しいことを行います。明示的なキャストは、暗黙的な変換をオーバーライドするか、そうでなければ発生しない変換を作成します。多くの場合 (決してすべてではありません)、キャストは、言語が提供する暗黙的な変換を使用するか、宣言を変更して、変換されるものが最初から正しい型になるようにすることで、より適切に解決できる問題を示します。

(Pascal Cuoq がコメントで思い出させてくれるように、plaincharが unsigned幅がintの場合、型の式はではなく にchar昇格されます。これは、実装が 16 ビット以上のバイトを持っている場合にのみ発生します。一部DSPのCコンパイラは.unsigned intintCHAR_BIT >= 16sizeof (int) == 1charCHAR_BIT > 8

于 2013-08-24T20:41:05.177 に答える