C++におけるリテラルとは、ソースコード中に直接記述される値そのものを指します。
変数に代入される以前の段階で、すでに「値」と「型」が決まっている点が特徴です。
C++では、リテラルは単なる数値や文字ではなく、厳密な型を持つ言語要素として扱われます。
この点が、他の言語やC言語と比較した際の大きな違いです。
整数リテラルの基本
整数リテラルは、数値を直接記述したものです。
ただし「サフィックスのない整数リテラルは常に int 型になる」と考えるのは正確ではありません。
10進数で記述された整数リテラルは、値が収まる範囲に応じて int、long、long long のいずれかになります。
一方で、8進数・16進数・2進数といった非10進表記の場合は、unsigned 系の型が選ばれる可能性もあります。
また、負の数に見える表記は、実際には「正の整数リテラルに単項マイナス演算子を適用した式」であり、負の整数リテラルという概念は存在しません。
整数リテラルの基数表記
整数リテラルは、表記方法によって基数が変わります。
10進数のほかに、8進数、16進数、2進数があり、それぞれ決まった接頭表記を持ちます。
特に注意すべきなのは、先頭が 0 で始まる数値が 8進数として解釈される点です。
この仕様は意図しない値を生みやすく、実務上のバグ原因になりやすい部分です。
整数リテラルのサフィックス
整数リテラルには、型を明示するためのサフィックスを付けることができます。
これにより、符号の有無やビット幅を明確に指定できます。
ビット演算、フラグ管理、通信処理、組み込み開発などでは、サフィックスの指定が安全性と可読性の両面で重要になります。
浮動小数点リテラル
浮動小数点リテラルは、小数点を含む数値や指数表記によって表されます。
サフィックスを付けない場合、その型は常に double になります。
float や long double を使用したい場合は、明示的にサフィックスを指定する必要があります。
これを怠ると、暗黙の型変換が発生し、警告や精度低下の原因になることがあります。
文字リテラル
文字リテラルは、単一の文字を表すリテラルです。
通常の文字リテラルの型は char であり、実体としては数値(文字コード)として扱われます。
改行やタブなどはエスケープシーケンスによって表現されます。
また、Unicode対応のために、ワイド文字や UTF 系の文字リテラルも存在します。
文字列リテラル
文字列リテラルは、複数の文字からなる配列として扱われます。
内部的には終端文字を含む配列であり、単なる「文字の集合」ではありません。
文字列リテラルは、標準ライブラリの文字列クラスに暗黙変換されることが多く、日常的なC++コードで頻繁に利用されます。
文字列リテラルと文字コード
C++では、ワイド文字列や UTF-16、UTF-32、UTF-8 に対応した文字列リテラルが用意されています。
特に UTF-8 文字列リテラルは、C++20 以降で型が変更されている点に注意が必要です。
C++11〜C++17 では従来の文字型として扱われていましたが、C++20 以降では専用の文字型が導入されています。
この違いは、API設計やライブラリ間の互換性に影響するため、規格バージョンを意識した設計が重要になります。
Raw文字列リテラル
Raw文字列リテラルは、エスケープ処理を行わずに文字列をそのまま記述できる形式です。
ファイルパス、正規表現、JSON、SQL、HTMLなどを扱う際に非常に有効です。
可読性が高く、保守性にも優れています。
真偽値リテラル
真偽値リテラルには true と false があります。
これらは bool 型であり、整数型とは明確に区別されます。
比較の文脈では整数に変換されることがありますが、型として同一ではありません。
この違いを理解していないと、条件分岐や演算で誤解を招くことがあります。
nullptr リテラル
nullptr は、ポインタ専用のリテラルです。
その型は nullptr 専用の型であり、整数とは完全に区別されます。
従来使われていた NULL に比べて、安全性と可読性が大きく向上しています。
ユーザー定義リテラル
C++では、独自のリテラルを定義することができます。
これにより、単位付きの数値や意味を持った値を、自然な記述で扱えるようになります。
ユーザー定義リテラルは、可読性の向上だけでなく、型安全性の確保にも大きく貢献します。
リテラルと型推論の注意点
型推論を利用する場合、リテラルの書き方がそのまま推論結果に影響します。
意図しない型が選ばれることもあるため、リテラルの指定はより慎重になる必要があります。
暗黙変換と落とし穴
符号付き・符号なしの変換や、異なる数値型間の変換は、規格上定義されているものでも直感に反する結果を生むことがあります。
これは未定義動作ではなく、仕様通りに動作している場合が多いため、原因に気づきにくい点が厄介です。
まとめ
C++におけるリテラルは、単なる値ではありません。
- 型を持つ
- 規格バージョンの影響を受ける
- 暗黙変換に直結する
- API設計や安全性に関与する
「どの値を書くか」ではなく「どのリテラルを書くか」がC++では重要になります。
以上、C++のリテラルについてでした。
最後までお読みいただき、ありがとうございました。
