C++の文字リテラルと文字列リテラルの違いをわかりやすく解説
C++における文字リテラルと文字列リテラルの基本
C++では、シングルクォート(' ')で囲まれた1文字は「文字リテラル」として扱われ、その型は char になります。例えば 'a' は char 型であり、ASCIIベースのシステムでは整数値 97 を持ちます。
一方、ダブルクォート(" ")で囲まれた1文字または複数文字の並びは「文字列リテラル」として扱われます。その型は const char[] であり、実体は「文字列の長さ + 1」のサイズを持つ配列です。この余分な1文字分は、文字列の終端を示すヌル文字(\0)として確保されています。
具体的な違いのポイント
- 文字リテラル: 原則として1文字のみを格納する(例:
'a')。 - 文字列リテラル: "abcdefg" のように任意の長さを持てる。
出力時の動作の違い
これらを出力する際には、文字列リテラルは文字列中で最初に現れるヌル文字(\0、NULL文字)までが出力されます。これは、C++が文字列の終端をヌル文字で判定しているためです。したがって、終端文字が正しく設定されていない場合、意図しないメモリ領域まで読み込まれる可能性がある点に注意が必要です。
まとめ
| 項目 | 文字リテラル | 文字列リテラル |
|---|---|---|
| 囲み方 | シングルクォート ' ' | ダブルクォート " " |
| 型 | char | const char[] |
| サイズ | 1文字分 | 文字数 + 1(終端の\0含む) |
-
C++における「struct」と「typedef struct」の違いとは?
```html 結論:C++では両者に実質的な違いはない C++において、「struct」を使った宣言と「typedef struct」を使った宣言の間には、実質的な違いがありません。その理由は、C++ではstruct、union、enum、classによるすべての宣言が、暗黙的にtypedefされたものと同じように扱われるためです。ただし、同じ名前を持つ別の宣言によってその名前が隠されている場合を除きます。 なぜ違いが生まれないのか C言語では、構造体を宣言しただけでは型名として直接使えず、「struct タグ名」という形式で記述する必要がありました。そのため、変数宣言のたびにstructキ
-
C++の比較演算子(==)とstd::string::compare()の違いを徹底解説
C++の比較演算子(==)とstd::string::compare()の違いとは? C++で文字列を比較する方法として、比較演算子 == と std::string::compare() の2つがあります。結論から言うと、この2つの違いは戻り値だけです。実際、string::operator==() は内部的に string::compare() を呼び出して実装されています。 戻り値の違い 比較演算子(==)は、2つの文字列が等しいかどうかを示す bool 型の値(true / false)を返します。一方、compare() は、2つの文字列が互いにどのような関係にあるかを示す int