文字定数
From cppreference.com
目次 |
[編集] 構文
'c-char ' |
(1) | ||||||||
u8'c-char ' |
(2) | (C23以降) | |||||||
u'c-char ' |
(3) | (C11 以降) | |||||||
U'c-char ' |
(4) | (C11 以降) | |||||||
L'c-char ' |
(5) | ||||||||
'c-char-sequence ' |
(6) | ||||||||
L'c-char-sequence ' |
(7) | ||||||||
u'c-char-sequence ' |
(8) | (C11 以降)(C23 で削除) | |||||||
U'c-char-sequence ' |
(9) | (C11 以降)(C23 で削除) | |||||||
ここで、
- c-char は次のいずれかです:
- シングルクォート (
')、バックスラッシュ (\)、または改行文字を除いた、基本ソース文字セットの文字。 - エスケープシーケンス: 特殊文字エスケープ \' \" \? \\ \a \b \f \n \r \t \v、16 進エスケープ \x...、または 8 進エスケープ \... (エスケープシーケンスで定義)。
- シングルクォート (
|
(C99以降) |
- c-char-sequence は 2 つ以上の c-char のシーケンスです。
1) 単一バイト整数文字定数。例: 'a'、'\n'、または '\13'。このような定数は `int` 型を持ち、実行時文字セットにおける `char` 型の値として表現された c-char の値を `int` 型にマッピングした値に等しくなります。c-char が実行時文字セットで単一バイトとして表現できない場合、値は実装定義です。
2) UTF-8 文字定数。例: u8'a'。このような定数は `char8_t` 型を持ち、ISO 10646 コードポイント値に等しくなります。ただし、コードポイント値が単一の UTF-8 コードユニットで表現できる場合 (つまり、c-char が 0x0~0x7F の範囲にある場合) に限ります。c-char が単一の UTF-8 コードユニットで表現できない場合、プログラムは不正形式となります。
|
3) 16 ビットワイド文字定数。例: u'貓'。ただし、u'🍌' (u'\U0001f34c') は含みません。このような定数は `char16_t` 型を持ち、mbrtoc16 によって生成される 16 ビットエンコーディング (通常は UTF-16) における c-char の値に等しくなります。c-char が表現できない、または 16 ビット文字に複数マッピングされる場合、値は実装定義です。
4) 32 ビットワイド文字定数。例: U'貓' または U'🍌'。このような定数は `char32_t` 型を持ち、mbrtoc32 によって生成される 32 ビットエンコーディング (通常は UTF-32) における c-char の値に等しくなります。c-char が表現できない、または 32 ビット文字に複数マッピングされる場合、値は実装定義です。 |
(C23まで) |
|
3) UTF-16 文字定数。例: u'貓'。ただし、u'🍌' (u'\U0001f34c') は含みません。このような定数は `char16_t` 型を持ち、ISO 10646 コードポイント値に等しくなります。ただし、コードポイント値が単一の UTF-16 コードユニットで表現できる場合 (つまり、c-char が 0x0~0xD7FF または 0xE000~0xFFFF の範囲にある場合) に限ります。c-char が単一の UTF-16 コードユニットで表現できない場合、プログラムは不正形式となります。
4) UTF-32 文字定数。例: U'貓' または U'🍌'。このような定数は `char32_t` 型を持ち、ISO 10646 コードポイント値に等しくなります。ただし、コードポイント値が単一の UTF-32 コードユニットで表現できる場合 (つまり、c-char が 0x0~0xD7FF または 0xE000~0x10FFFF の範囲にある場合) に限ります。c-char が単一の UTF-32 コードユニットで表現できない場合、プログラムは不正形式となります。 |
(C23以降) |
5) ワイド文字定数。例: L'β' または L'貓'。このような定数は `wchar_t` 型を持ち、実行時ワイド文字セットにおける c-char の値 (つまり、mbtowc によって生成される値) に等しくなります。c-char が表現できない、または複数のワイド文字にマッピングされる場合 (例: Windows では `wchar_t` が 16 ビットであるため、BMP 外の値)、値は実装定義です。
6) マルチバイト文字定数。例: 'AB'。`int` 型を持ち、値は実装定義です。
7) ワイドマルチバイト文字定数。例: L'AB'。`wchar_t` 型を持ち、値は実装定義です。
8) 16 ビットマルチバイト文字定数。例: u'CD'。`char16_t` 型を持ち、値は実装定義です。
9) 32 ビットマルチバイト文字定数。例: U'XY'。`char32_t` 型を持ち、値は実装定義です。
[編集] 注釈
マルチバイト文字定数は、C 言語が B プログラミング言語から継承したものです。C 標準では規定されていませんが、ほとんどのコンパイラ (MSVC は著名な例外) は B で指定されたとおりにマルチバイト文字定数を実装しています。定数内の各文字の値は、結果の整数の連続したバイトを初期化します。ビッグエンディアンでゼロパディングされ、右寄せされた順序になります。例えば、'\1' の値は 0x00000001 であり、'\1\2\3\4' の値は 0x01020304 となります。
C++ では、エンコード可能な通常の文字リテラルは `int` 型ではなく `char` 型を持ちます。
整数定数とは異なり、`char` が符号付きの場合、文字定数は負の値を持つことがあります。そのような実装では、'\xFF' は値 -1 を持つ `int` となります。
`#if` または `#elif` の制御式で使用される場合、文字定数はソース文字セット、実行時文字セット、またはその他の実装定義の文字セットの観点から解釈されることがあります。
16/32 ビットマルチバイト文字定数は広くサポートされておらず、C23 で削除されました。一部の一般的な実装 (例: clang) は、これらをまったく受け付けません。
[編集] 例
このコードを実行
#include <stddef.h> #include <stdio.h> #include <uchar.h> int main (void) { printf("constant value \n"); printf("-------- ----------\n"); // integer character constants, int c1='a'; printf("'a':\t %#010x\n", c1); int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // implementation-defined // multicharacter constant int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // implementation-defined // 16-bit wide character constants char16_t uc1 = u'a'; printf("'a':\t %#010x\n", (int)uc1); char16_t uc2 = u'¢'; printf("'¢':\t %#010x\n", (int)uc2); char16_t uc3 = u'猫'; printf("'猫':\t %#010x\n", (int)uc3); // implementation-defined (🍌 maps to two 16-bit characters) char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4); // 32-bit wide character constants char32_t Uc1 = U'a'; printf("'a':\t %#010x\n", (int)Uc1); char32_t Uc2 = U'¢'; printf("'¢':\t %#010x\n", (int)Uc2); char32_t Uc3 = U'猫'; printf("'猫':\t %#010x\n", (int)Uc3); char32_t Uc4 = U'🍌'; printf("'🍌':\t %#010x\n\n", (int)Uc4); // wide character constants wchar_t wc1 = L'a'; printf("'a':\t %#010x\n", (int)wc1); wchar_t wc2 = L'¢'; printf("'¢':\t %#010x\n", (int)wc2); wchar_t wc3 = L'猫'; printf("'猫':\t %#010x\n", (int)wc3); wchar_t wc4 = L'🍌'; printf("'🍌':\t %#010x\n\n", (int)wc4); }
実行結果の例
constant value -------- ---------- 'a': 0x00000061 '🍌': 0xf09f8d8c 'ab': 0x00006162 'a': 0x00000061 '¢': 0x000000a2 '猫': 0x0000732b '🍌': 0x0000df4c 'a': 0x00000061 '¢': 0x000000a2 '猫': 0x0000732b '🍌': 0x0001f34c 'a': 0x00000061 '¢': 0x000000a2 '猫': 0x0000732b '🍌': 0x0001f34c
[編集] 参考文献
- C17標準 (ISO/IEC 9899:2018)
- 6.4.4.4 文字定数 (p: 48-50)
- C11標準 (ISO/IEC 9899:2011)
- 6.4.4.4 文字定数 (p: 67-70)
- C99標準 (ISO/IEC 9899:1999)
- 6.4.4.4 文字定数 (p: 59-61)
- C89/C90標準 (ISO/IEC 9899:1990)
- 3.1.3.4 文字定数
[編集] 関連項目
| C++ ドキュメント (文字リテラル)
|