Namespaces
Variants

Character constant

From cppreference.net

目次

構文

' 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 型を持ち、その値は実行文字集合における c-char の表現を char 型の値として int にマップした値に等しい。 c-char が実行文字集合で単一バイトとして表現できない場合、その値は実装定義である。
2) UTF-8文字定数、例: u8 'a' 。このような定数は char8_t 型を持ち、その値は c-char の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 型を持ち、値は 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以降)
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 型を持ち、実装定義の値を持つ。

注記

マルチキャラクター定数は、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