名前空間
変種
操作

文字リテラル

From cppreference.com
< cpp‎ | language
 
 
C++言語
全般
フロー制御
条件実行文
if
繰り返し文 (ループ)
for
範囲for (C++11)
ジャンプ文
関数
関数宣言
ラムダ式
inline指定子
動的例外仕様 (C++17まで*)
noexcept指定子 (C++11)
例外
名前空間
指定子
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
記憶域期間指定子
初期化
代替表現
リテラル
ブーリアン - 整数 - 浮動小数点数
文字 - 文字列 - nullptr (C++11)
ユーザー定義 (C++11)
ユーティリティ
属性 (C++11)
typedef宣言
型エイリアス宣言 (C++11)
キャスト
メモリ確保
クラス
クラス固有の関数プロパティ
explicit (C++11)
static

特殊メンバ関数
テンプレート
その他
 
 

目次

[編集] 構文

'c-char ' (1)
u8'c-char ' (2) (C++17以降)
u'c-char ' (3) (C++11以降)
U'c-char ' (4) (C++11以降)
L'c-char ' (5)
'c-char-sequence ' (6)
L'c-char-sequence ' (7) (C++23まで)
c-char - のいずれか
basic-c-char - シングルクォート '、バックスラッシュ \、または改行文字を除く、基本ソース文字セット(C++23まで)変換文字セット(C++23以降)の文字。
c-char-sequence - 2つ以上のc-char

[編集] 説明

1) 通常の文字リテラル。例: 'a''\n'、または '\13'。このようなリテラルは char 型であり、その値は 実行文字セットにおけるc-charの表現(C++23まで)通常のリテラルエンコーディングからの対応するコードポイント(C++23以降)に等しい。
2) UTF-8 文字リテラル。例: u8'a'。このようなリテラルは char(C++20まで)char8_t(C++20以降) 型であり、その値は ISO/IEC 10646c-char のコードポイント値に等しい。ただし、コードポイント値が単一のUTF-8コードユニットで表現可能であること(つまり、c-char が0x0〜0x7Fの範囲内であること)。
3) UTF-16 文字リテラル。例: u'猫'(ただし、u'🍌' (u'\U0001f34c') は除く)。このようなリテラルは char16_t 型であり、その値は ISO/IEC 10646c-char のコードポイント値に等しい。ただし、コードポイント値が単一のUTF-16コードユニットで表現可能であること(つまり、c-char が0x0〜0xFFFFの範囲内であること)。
4) UTF-32 文字リテラル。例: U'猫' または U'🍌'。このようなリテラルは char32_t 型であり、その値は ISO/IEC 10646c-char のコードポイント値に等しい。
5) ワイド文字リテラル。例: L'β' または L'猫'。このようなリテラルは wchar_t 型であり、その値は 実行ワイド文字セットにおけるc-charの値(C++23まで)ワイドリテラルエンコーディングからの対応するコードポイント(C++23以降)に等しい。
6) 通常の複数文字リテラル(C++23まで)複数文字リテラル(C++23以降)。例: 'AB'。これは条件付きでサポートされており、int 型で実装定義の値を持つ。
7) ワイド複数文字リテラル。例: L'AB'。これは条件付きでサポートされており、wchar_t 型で実装定義の値を持つ。

[編集] エンコード不可能な文字

1-5) c-char が数値エスケープシーケンスでない場合(下記参照)、c-char がリテラルの関連文字エンコーディングで表現できない場合、またはそのエンコーディングで単一のコードユニットとしてエンコードできない場合(例えば、wchar_t が16ビットであるWindowsにおける非BMP値など)、プログラムは不正である。
6) c-char-sequence 内のいずれかの c-char が、通常のリテラルエンコーディングで単一のコードユニットとしてエンコードできない場合、プログラムは不正である。
7) c-char-sequence 内のいずれかの c-char が、ワイドリテラルエンコーディングで単一のコードユニットとしてエンコードできない場合、プログラムは不正である。
(C++23まで)

[編集] 数値エスケープシーケンス

文字の値を指定するために、数値(八進数および十六進数)エスケープシーケンスを使用できます。

文字リテラルが1つの数値エスケープシーケンスのみを含み、エスケープシーケンスによって指定された値がその型の符号なしバージョンで表現可能である場合、文字リテラルは指定された値と同じ値を持つ(文字型への変換後)。

UTF-N 文字リテラルは、その型で表現可能な任意の値を持ちます。値が有効なUnicodeコードポイントに対応していない場合、または対応するコードポイントがUTF-Nで単一のコードユニットとして表現できない場合でも、数値エスケープシーケンスによって値を指定できます。例えば、u8'\xff' は適正であり、char8_t(0xFF) に等しい。

(C++23から)


通常の文字リテラルまたはワイド文字リテラルで使用される数値エスケープシーケンスによって指定された値が、それぞれ char または wchar_t で表現できない場合、文字リテラルの値は実装定義である。

(C++23まで)

1つの c-char を持つ通常の文字リテラルまたはワイド文字リテラルで使用される数値エスケープシーケンスによって指定された値が、それぞれ char または wchar_t の基底型の符号なしバージョンで表現可能である場合、リテラルの値はその符号なし整数型の整数値であり、指定された値がリテラルの型に変換される。それ以外の場合、プログラムは不正である。

(C++23から)


UTF-N 文字リテラルで使用される数値エスケープシーケンスによって指定された値が、対応する charN_t で表現できない場合、文字リテラルの値は実装定義である(C++17まで)プログラムは不正である(C++17以降)

(C++11以降)

[編集] 注釈

複数文字リテラルは、CからBプログラミング言語に継承されたものです。CまたはC++標準では明示されていませんが、ほとんどのコンパイラ(MSVCは例外)は、Bで指定されているように複数文字リテラルを実装しています。リテラルの各文字の値は、結果の整数の連続するバイトを、ビッグエンディアンのゼロパディングされた右寄せ順で初期化します。例えば、'\1' の値は 0x00000001 であり、'\1\2\3\4' の値は 0x01020304 です。

Cでは、'a''\n' などの文字定数は、char 型ではなく int 型です。

[編集]

#include <cstdint>
#include <iomanip>
#include <iostream>
#include <string_view>
 
template<typename CharT>
void dump(std::string_view s, const CharT c)
{
    const uint8_t* data{reinterpret_cast<const uint8_t*>(&c)};
 
    std::cout << s << " \t" << std::hex
              << std::uppercase << std::setfill('0');
 
    for (auto i{0U}; i != sizeof(CharT); ++i)
        std::cout << std::setw(2) << static_cast<unsigned>(data[i]) << ' ';
 
    std::cout << '\n';
}
 
void print(std::string_view str = "") { std::cout << str << '\n'; }
 
int main()
{
    print("Ordinary character literals:");
    char c1 = 'a'; dump("'a'", c1);
    char c2 = '\x2a'; dump("'*'", c2);
 
    print("\n" "Ordinary multi-character literals:");
    int mc1 = 'ab'; dump("'ab'", mc1);       // implementation-defined
    int mc2 = 'abc'; dump("'abc'", mc2);     // implementation-defined
 
    print("\n" "UTF-8 character literals:");
    char8_t C1 = u8'a'; dump("u8'a'", C1);
//  char8_t C2 = u8'¢'; dump("u8'¢'", C2);   // error: ¢ maps to two UTF-8 code units
//  char8_t C3 = u8'猫'; dump("u8'猫'", C3); // error: 猫 maps to three UTF-8 code units
//  char8_t C4 = u8'🍌'; dump("u8'🍌'", C4); // error: 🍌 maps to four UTF-8 code units
 
    print("\n" "UTF-16 character literals:");
    char16_t uc1 = u'a'; dump("u'a'", uc1);
    char16_t uc2 = u'¢'; dump("u'¢'", uc2);
    char16_t uc3 = u'猫'; dump("u'猫'", uc3);
//  char16_t uc4 = u'🍌'; dump("u'🍌'", uc4); // error: 🍌 maps to two UTF-16 code units
 
    print("\n" "UTF-32 character literals:");
    char32_t Uc1 = U'a'; dump("U'a'", Uc1);
    char32_t Uc2 = U'¢'; dump("U'¢'", Uc2);
    char32_t Uc3 = U'猫'; dump("U'猫'", Uc3);
    char32_t Uc4 = U'🍌'; dump("U'🍌'", Uc4);
 
    print("\n" "Wide character literals:");
    wchar_t wc1 = L'a'; dump("L'a'", wc1);
    wchar_t wc2 = L'¢'; dump("L'¢'", wc2);
    wchar_t wc3 = L'猫'; dump("L'猫'", wc3);
    wchar_t wc4 = L'🍌'; dump("L'🍌'", wc4);  // unsupported on Windows since C++23
}

実行結果の例

Ordinary character literals:
'a' 	61 
'*' 	2A 
 
Ordinary multi-character literals:
'ab' 	62 61 00 00 
'abc' 	63 62 61 00 
 
UTF-8 character literals:
u8'a' 	61 
 
UTF-16 character literals:
u'a' 	61 00 
u'¢' 	A2 00 
u'猫' 	2B 73 
 
UTF-32 character literals:
U'a' 	61 00 00 00 
U'¢' 	A2 00 00 00 
U'猫' 	2B 73 00 00 
U'🍌' 	4C F3 01 00 
 
Wide character literals:
L'a' 	61 00 00 00 
L'¢' 	A2 00 00 00 
L'猫' 	2B 73 00 00 
L'🍌' 	4C F3 01 00

[編集] 欠陥報告

以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。

DR 適用対象 公開された動作 正しい動作
CWG 912 C++98 エンコードできない通常の文字リテラルは未指定 条件付きでサポートされると指定
CWG 1024 C++98 複数文字リテラルはサポートされる必要があった 条件付きサポートとされた
CWG 1656 C++98 数値エスケープシーケンスの意味
文字リテラルでは不明瞭だった
指定された
P1854R4 C++98 エンコードできない文字リテラルは条件付きでサポートされていた プログラムは不正である

[編集] 参照

  • C++23標準 (ISO/IEC 14882:2024)
  • 5.13.3 文字リテラル [lex.ccon]
  • C++20 standard (ISO/IEC 14882:2020)
  • 5.13.3 文字リテラル [lex.ccon]
  • C++17 standard (ISO/IEC 14882:2017)
  • 5.13.3 文字リテラル [lex.ccon]
  • C++14 standard (ISO/IEC 14882:2014)
  • 2.14.3 文字リテラル [lex.ccon]
  • C++11 standard (ISO/IEC 14882:2011)
  • 2.14.3 文字リテラル [lex.ccon]
  • C++03 標準 (ISO/IEC 14882:2003)
  • 2.13.2 文字リテラル [lex.ccon]
  • C++98 標準 (ISO/IEC 14882:1998)
  • 2.13.2 文字リテラル [lex.ccon]

[編集] 関連項目

ユーザー定義リテラル(C++11) ユーザー定義サフィックス付きリテラル[編集]
Cドキュメント文字定数について)
English 日本語 中文(简体) 中文(繁體)