文字定数
提供: cppreference.com
目次 |
[編集] 構文
' c-char '
|
(1) | ||||||||
u' c-char ' (C11以上)
|
(2) | ||||||||
U' c-char ' (C11以上)
|
(3) | ||||||||
L' c-char '
|
(4) | ||||||||
' c-char-sequence '
|
(5) | ||||||||
ただし
- 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 型の値を int にマップした実行文字集合における c-char の表現と等しい値を持ちます。 c-char が実行文字集合においてシングルバイトで表現できない場合、値は処理系定義です。
2) 16ビットワイド文字定数。 u'猫' など。 しかし u'🍌' (u'\U0001f34c') などは含まれません。 このような定数は char16_t 型であり、 mbrtoc16 が生成する16ビットエンコーディング (通常は UTF-16) における c-char の値と等しい値を持ちます。 c-char が表現可能でない、または2個以上の16ビット文字にマップされる場合は、動作は処理系定義です。
3) 32ビットワイド文字定数。 U'猫'、 U'🍌' など。 このような定数は char32_t 型であり、 mbrtoc32 が生成する32ビットエンコーディングにおける c-char の値と等しい値を持ちます。 c-char が表現可能でないまたは2個以上の32ビット文字にマップされる場合は、動作は処理系定義です。
4) ワイド文字定数。 L'β'、 L'猫 など。 このような定数は wchar_t 型であり、実行ワイド文字集合における c-char の値 (つまり mbtowc によって生成される値) と等しい値を持ちます。 c-char が表現可能でないまたは2個以上のワイド文字にマップされる (例えば wchar_t が16ビットである Windows における BMP 外の文字) 場合は、動作は処理系定義です。
5) 多文字定数。 'AB' など。 このような定数は int 型であり、処理系定義の値を持ちます。
[編集] ノート
多文字定数は C が B プログラミング言語から継承したものです。 C 標準では規定されていませんが、ほとんどのコンパイラ (MSVC は主要な例外です) は B で規定されている通りの多文字定数を実装しています。 すなわち、定数内の各文字の値がゼロパディングされた右詰めのビッグエンディアンで結果の整数の連続するバイトを初期化します。 例えば、 '\1' の値は 0x00000001 で、 '\1\2\3\4' の値は 0x01020304 です。
C++ では、普通の文字リテラルは int 型ではなく char 型です。
整数定数と異なり、文字定数は、 char が符号付きの場合は、負の値になることがあります。 そのような処理系では、 '\xFF' は -1 の値を持つ int 型の定数です。
#if または #elif の制御式で使用されたときは、文字定数は、ソース文字集合、実行文字集合、またはその他の何らかの処理系定義の文字集合で解釈されるかもしれません。
[編集] 例
Run this code
#include <stddef.h> #include <stdio.h> #include <uchar.h> int main (void) { printf("constant value \n"); printf("-------- ----------\n"); // 整数文字定数。 int c1='a'; printf("'a': %#010x\n", c1); int c2='🍌'; printf("'🍌': %#010x\n\n", c2); // 処理系定義 // 多文字定数。 int c3='ab'; printf("'ab': %#010x\n\n", c3); // 処理系定義 // 16ビットワイド文字定数。 char16_t uc1 = u'a'; printf("'a': %#010x\n", (int)uc1); char16_t uc2 = u'¢'; printf("'¢': %#010x\n", (int)uc2); char16_t uc3 = u'猫'; printf("'猫': %#010x\n", (int)uc3); // 処理系定義 (🍌 は16ビット文字2個にマップされます) char16_t uc4 = u'🍌'; printf("'🍌': %#010x\n\n", (int)uc4); // 32ビットワイド文字定数。 char32_t Uc1 = U'a'; printf("'a': %#010x\n", (int)Uc1); char32_t Uc2 = U'¢'; printf("'¢': %#010x\n", (int)Uc2); char32_t Uc3 = U'猫'; printf("'猫': %#010x\n", (int)Uc3); char32_t Uc4 = U'🍌'; printf("'🍌': %#010x\n\n", (int)Uc4); // ワイド文字定数。 wchar_t wc1 = L'a'; printf("'a': %#010x\n", (int)wc1); wchar_t wc2 = L'¢'; printf("'¢': %#010x\n", (int)wc2); wchar_t wc3 = L'猫'; printf("'猫': %#010x\n", (int)wc3); wchar_t wc4 = L'🍌'; printf("'🍌': %#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