はじめに
C++でプログラムを書く際、私たちは様々な「値」を直接コードに記述します。これらの、ソースコード上に直接表現される固定値のことをリテラルと呼びます。
C++には、扱うデータの種類に応じて、様々なリテラルの記述方法が用意されています。この記事では、C++の主要なリテラルの種類と、その正しい書き方を網羅的に解説します。
1. 整数リテラル
整数値を表します。10
(10進数)、0xFF
(16進数)、0b1010
(2進数、C++14以降)のように記述できます。
int decimal_val = 42;
int hex_val = 0x2A; // 16進数 (42)
int octal_val = 052; // 8進数 (42)
int binary_val = 0b101010; // 2進数 (42) (C++14)
// C++14以降、桁区切り文字 (') が使える
long long large_number = 1'000'000'000;
2. 浮動小数点数リテラル
3.14
(double
型)や 1.23f
(float
型)のように、小数点数や指数(6.02e23
)を含む数値を表します。
double pi = 3.14159;
float gravity = 9.8f; // fサフィックスでfloat型
long double avogadro = 6.022e23L; // Lサフィックスでlong double型
3. 文字リテラル
'A'
のように、単一の文字をシングルクォーテーションで囲んで表現します。内部的には整数値として扱われます。
char initial = 'C';
char newline = '\n'; // 改行などの特殊文字(エスケープシーケンス)
4. 文字列リテラル
"Hello"
のように、ダブルクォーテーションで囲まれた文字の並びを表します。
通常の文字列リテラル
const char* message = "Hello, World!\n";
// 隣接する文字列リテラルは、コンパイル時に自動で連結される
const char* long_message = "This is a "
"very long message.";
生文字列リテラル (Raw String Literal)
R"(...)"
という構文で、\
などのエスケープシーケンスを無効にし、書いたままの文字列を表現できます。正規表現やWindowsのパスを記述する際に非常に便利です。
// 通常: "C:\\Users\\Taro"
// Raw: R"(C:\Users\Taro)"
const char* win_path = R"(C:\Users\Taro)";
5. 論理値リテラル
bool
型の値 true
と false
を表します。
bool is_ready = true;
bool has_error = false;
6. ポインタリテラル
NULLポインタを表すためのリテラルです。C++11以降、0
やNULL
マクロの代わりに nullptr
を使うことが強く推奨されます。
int* p1 = nullptr;
char* p2 = nullptr;
7. ユーザー定義リテラル
C++11以降、プログラマが独自のリテラルを定義できるようになりました。数値や文字列リテラルの後ろに、_
で始まるカスタムサフィックスを付けると、対応する演算子オーバーロードが呼び出されます。
サンプルコード
#include <iostream>
// "km" というサフィックスで、メートルに変換するユーザー定義リテラル
constexpr long double operator"" _km(long double val) {
return val * 1000;
}
int main() {
// 10.5_km は、operator"" _km(10.5L) の呼び出しに変換される
long double meters = 10.5_km;
std::cout << "10.5km は " << meters << "メートルです。" << std::endl;
return 0;
}
解説: 10.5_km
という記述が、コンパイル時に operator"" _km(10.5L)
という関数呼び出しに置き換えられます。これにより、単位などをより直感的にコードで表現できます。
まとめ
今回は、C++の主要なリテラルの種類について網羅的に解説しました。これらのリテラルを正しく使い分けることで、意図が明確で、型安全なコードを記述することができます。