これを宣言すると:
int i = 0 + 'A';
'A'
考慮されますchar
かint
?
一部の人々は使用するかもしれません:
int i = 0 + (int)'A';
しかし、これは本当に必要ですか?
これを宣言すると:
int i = 0 + 'A';
'A'
考慮されますchar
かint
?
一部の人々は使用するかもしれません:
int i = 0 + (int)'A';
しかし、これは本当に必要ですか?
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
、 (タイプが ) を に昇格させて、同じことを行います。型の式は通常、常にではありませんが、暗黙的に に昇格されます。char
int
char
int
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 int
int
CHAR_BIT >= 16
sizeof (int) == 1
char
CHAR_BIT > 8