Namespaces
Variants

Escape sequences

From cppreference.net
C++ language
General topics
Keywords
Escape sequences
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

エスケープシーケンスは、 文字列リテラル および 文字リテラル 内の特定の特殊文字を表現するために使用されます。

以下のエスケープシーケンスが利用可能です:

エスケープ
シーケンス
説明 表現
単純エスケープシーケンス
\' シングルクォート ASCIIエンコーディングにおけるバイト 0x27
\" ダブルクォート ASCIIエンコーディングにおけるバイト 0x22
\? 疑問符 ASCIIエンコーディングにおけるバイト 0x3f
\\ バックスラッシュ ASCIIエンコーディングにおけるバイト 0x5c
\a 可聴ベル ASCIIエンコーディングにおけるバイト 0x07
\b バックスペース ASCIIエンコーディングにおけるバイト 0x08
\f フォームフィード - 改ページ ASCIIエンコーディングにおけるバイト 0x0c
\n ラインフィード - 改行 ASCIIエンコーディングにおけるバイト 0x0a
\r キャリッジリターン ASCIIエンコーディングにおけるバイト 0x0d
\t 水平タブ ASCIIエンコーディングにおけるバイト 0x09
\v 垂直タブ ASCIIエンコーディングにおけるバイト 0x0b
数値エスケープシーケンス
\ nnn 任意の8進数値 コードユニット nnn (1~3桁の8進数)
\o{ n... } (C++23以降) コードユニット n... (任意の桁数の8進数)
\x n... 任意の16進数値 コードユニット n... (任意の桁数の16進数)
\x{ n... } (C++23以降)
条件付きエスケープシーケンス [1]
\ c 実装定義 実装定義
ユニバーサル文字名
\u nnnn 任意の Unicode 値;
複数のコードユニットになる可能性あり
コードポイント U+ nnnn (4桁の16進数)
\u{ n... } (C++23以降) コードポイント U+ n... (任意の桁数の16進数)
\U nnnnnnnn コードポイント U+ nnnnnnnn (8桁の16進数)
\N{ NAME } (C++23以降) 任意のUnicode文字 NAME で指定された文字 (詳細は 下記参照 )
  1. 条件付きエスケープシーケンスは条件付きでサポートされる。各条件付きエスケープシーケンス内の文字 c は、 基本ソース文字セット (C++23まで) 基本文字セット (C++23以降) のメンバであり、他のエスケープシーケンスで \ の後に続く文字ではない。

目次

ユニバーサル文字名の範囲

ユニバーサル文字名が0x24( $ )、0x40( @ )、0x60( ` )以外で、かつ0xA0未満のコードポイントに対応する場合、プログラムは不適格となる。言い換えると、 基本ソース文字セット のメンバーおよび制御文字(範囲0x0-0x1Fおよび0x7F-0x9F)は、ユニバーサル文字名で表現できない。

(C++11まで)

基本ソース文字セット のメンバーまたは制御文字のコードポイントに対応するユニバーサル文字名が、 文字リテラル または 文字列リテラル の外側に現れた場合、プログラムは不適格となる。

ユニバーサル文字名がサロゲートコードポイント(範囲0xD800-0xDFFF、両端を含む)に対応する場合、プログラムは不適格となる。

UTF-16/32文字列リテラルで使用されるユニバーサル文字名が ISO/IEC 10646 のコードポイント(範囲0x0-0x10FFFF、両端を含む)に対応しない場合、プログラムは不適格となる。

(C++11以降)
(C++20まで)

基本ソース文字セット のメンバーまたは制御文字のコードポイントに対応するユニバーサル文字名が、 文字リテラル または 文字列リテラル の外側に現れた場合、プログラムは不適格となる。

ユニバーサル文字名が ISO/IEC 10646 のコードポイント(範囲0x0-0x10FFFF、両端を含む)に対応しないか、サロゲートコードポイント(範囲0xD800-0xDFFF、両端を含む)に対応する場合、プログラムは不適格となる。

(C++20以降)
(C++23まで)

基本文字セット の文字または制御文字のスカラ値に対応するユニバーサル文字名が、 文字リテラル または 文字列リテラル の外側に現れた場合、プログラムは不適格となる。

ユニバーサル文字名が 翻訳文字セット の文字のスカラ値に対応しない場合、プログラムは不適格となる。

(C++23以降)


名前付きユニバーサル文字エスケープ

\N{ n-char-sequence }
n-char-sequence - 1つ以上の n-char の連続
n-char - 翻訳文字集合 からの文字。ただし右中括弧 } または改行文字を除く

上記の構文のユニバーサル文字名は 名前付きユニバーサル文字 である。これは Unicode Standard ( chapter 4.8 Name ) 内の対応する文字を指定する。ただし n-char-sequence がその文字名または「control」、「correction」、「alternate」タイプの文字名エイリアスのいずれかに等しい場合に限る。それ以外の場合、プログラムは不適格となる。

これらのエイリアスは Unicode Character Database NameAliases.txt にリストされている。これらの名前またはエイリアスのいずれも、先頭または末尾のスペースを持たない。

有効な n-char-sequence は、大文字のラテン文字AからZ、数字、スペース、ハイフンマイナスのみを含まなければならない。他の文字はUnicode文字名に決して現れないため、 n-char-sequence 内でのこれらの文字の出現は常にプログラムを不適格にする。

(C++23以降)

注記

\ 0 は最も一般的に使用される8進数エスケープシーケンスです。これは null終端文字列 の終端null文字を表すためです。

改行文字 \n は、 テキストモードI/O で使用される際に特別な意味を持ちます:OS固有の改行表現(通常は1バイトまたはバイトシーケンス)に変換されます。一部のシステムでは、行の末尾を長さフィールドでマークします。

8進数エスケープシーケンスは最大3桁の8進数を持ちますが、それより早く有効な8進数でない文字が現れた場合、そこで終了します。

16進数エスケープシーケンスには長さ制限がなく、有効な16進数桁ではない最初の文字で終了します。単一の16進数エスケープシーケンスで表される値が、この文字列リテラルで使用される文字型( char char8_t (C++20以降) char16_t char32_t (C++11以降) または wchar_t )が表す値の範囲に収まらない場合、結果は未定義です。

ナロー文字列リテラルまたは16ビット文字列リテラルにおけるユニバーサル文字名は、複数のコード単位にマッピングされる可能性があります。例えば、 \U0001f34c はUTF-8では4つの char コード単位( \xF0\x9F\x8D\x8C )に、UTF-16では2つの char16_t コード単位( \xD83C\xDF4C )になります。

(C++11以降)

疑問符エスケープシーケンス \ ? は、文字列リテラル内での トライグラフ の解釈を防止するために使用されます: "??/" のような文字列は " \" としてコンパイルされますが、2番目の疑問符が "? \? /" のようにエスケープされると、 "??/" となります。 C++からトライグラフが削除されたため、疑問符エスケープシーケンスはもはや必要ありません。これはC++14(および以前のリビジョン)およびCとの互換性のために保持されています。 (C++17以降)

機能テストマクロ 規格 機能
__cpp_named_character_escapes 202207L (C++23) 名前付きユニバーサル文字エスケープ

#include <iostream>
int main()
{
    std::cout << "This\nis\na\ntest\n\n";
    std::cout << "She said, \"Sells she seashells on the seashore?\"\n";
}

出力:

This
is
a
test
She said, "Sells she seashells on the seashore?"

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
CWG 505 C++98 バックスラッシュの後に続く文字が表で指定された
ものではない場合の動作は未定義であった
条件付きサポートに変更
(セマンティクスは実装定義)

関連項目

C documentation for Escape sequence
日本語訳:
C documentation Escape sequence
変更点: - "for" → "の"(英語の前置詞「for」を日本語の助詞「の」に変換) - HTMLタグ、属性、C++用語(Escape sequence)はそのまま保持