Character constant
目次 |
構文
'
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 のシーケンスです。
|
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
型を持ち、値は
c-char
のISO 10646コードポイント値に等しい(ただし、コードポイント値が単一のUTF-16コードユニットで表現可能な場合、すなわち
c-char
が0x0-0xD7FFまたは0xE000-0xFFFFの範囲内の場合)。
c-char
が単一のUTF-16コードユニットで表現不可能な場合、プログラムは不適格である。
4)
UTF-32文字定数、例:
U
'貓'
または
U
'🍌'
。このような定数は
char32_t
型を持ち、値は
c-char
のISO 10646コードポイント値に等しい(ただし、コードポイント値が単一のUTF-32コードユニットで表現可能な場合、すなわち
c-char
が0x0-0xD7FFまたは0xE000-0x10FFFFの範囲内の場合)。
c-char
が単一のUTF-32コードユニットで表現不可能な場合、プログラムは不適格である。
|
(C23以降) |
注記
マルチキャラクター定数は、Bプログラミング言語からC言語に継承されました。C標準では規定されていませんが、ほとんどのコンパイラ(MSVCは顕著な例外)はB言語で規定された通りにマルチキャラクター定数を実装しています:定数内の各charの値が、結果の整数の連続するバイトをビッグエンディアン、ゼロパディング、右詰めの順序で初期化します。例えば、 ' \1 ' の値は 0x00000001 であり、 ' \1 \2 \3 \4 ' の値は 0x01020304 です。
C++では、エンコード可能な通常の文字リテラルの型は char であり、 int ではありません。
整数定数とは異なり、文字定数は integer constants 、 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"); // 整数文字定数 int c1='a'; printf("'a':\t %#010x\n", c1); int c2='🍌'; printf("'🍌':\t %#010x\n\n", c2); // 実装定義 // 複数文字定数 int c3='ab'; printf("'ab':\t %#010x\n\n", c3); // 実装定義 // 16ビットワイド文字定数 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); // 実装定義 (🍌は2つの16ビット文字にマッピング) char16_t uc4 = u'🍌'; printf("'🍌':\t %#010x\n\n", (int)uc4); // 32ビットワイド文字定数 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); // ワイド文字定数 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
参考文献
- C23規格 (ISO/IEC 9899:2024):
-
- 6.4.4.5 文字定数 (p: 63-66)
- 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++ documentation
for
Character literal
|