Loose-Info.com
Last Update 2023/05/01
TOP - 各種テスト - C言語 - 定数

テスト概要

その1
整数定数

その2
整数定数が割り当てられる型階層の確認

その3
浮動小数点定数

その4
文字定数

その5
文字列リテラル


その1

整数定数

sample1.c
#include <stdio.h> #include <stdlib.h> int main(void) { printf("整数定数\n"); unsigned int samp_int1 = 123; /* 10進定数 */ unsigned int samp_int2 = 0x7b; /* 16進定数(0x + 小文字) */ unsigned int samp_int3 = 0x7B; /* 16進定数(0x + 大文字) */ unsigned int samp_int4 = 0X7b; /* 16進定数(0X + 小文字) */ unsigned int samp_int5 = 0X7B; /* 16進定数(0X + 大文字) */ unsigned int samp_int6 = 0173; /* 8進定数(プレフィックス : 0) */ printf("10進定数 %3d\n", samp_int1); printf("16進定数 0x%2x --- %d\n", samp_int2, samp_int2); printf("16進定数 0x%2X --- %d\n", samp_int3, samp_int3); printf("16進定数 0X%2x --- %d\n", samp_int4, samp_int4); printf("16進定数 0X%2X --- %d\n", samp_int5, samp_int5); printf(" 8進定数 0%3o --- %d\n\n", samp_int6, samp_int6); printf("明示的に定数の型を示すサフィックス\n"); printf("unsigned int u または U : %u(123u) %u(123U)\n", 123u, 123U); printf("long l または L : %ld(123l) %ld(123L)\n", 123l, 123L); printf("long long ll または LL : %lld(123ll) %lld(123LL)\n", 123ll, 123LL); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample1.c $ ./a.out 整数定数 10進定数 123 16進定数 0x7b --- 123 16進定数 0x7B --- 123 16進定数 0X7b --- 123 16進定数 0X7B --- 123 8進定数 0173 --- 123 明示的に定数の型を示すサフィックス unsigned int u または U : 123(123u) 123(123U) long l または L : 123(123l) 123(123L) long long ll または LL : 123(123ll) 123(123LL)

その2

整数定数が割り当てられる型階層の確認

sample2.c
#include <stdio.h> #include <stdlib.h> #include <limits.h> int main(void) { printf("整数定数が割り当てられる型階層の確認(以下、実装依存)\n\n"); printf("各種整数型最大値\n"); printf("INT_MAX=%d\n", INT_MAX); printf("UINT_MAX=%u\n", UINT_MAX); printf("LONG_MAX=%ld\n", LONG_MAX); printf("ULONG_MAX=%lu\n", ULONG_MAX); printf("LLONG_MAX=%lld\n", LLONG_MAX); printf("ULLONG_MAX=%llu\n\n", ULLONG_MAX); printf("実装環境において、long と long long の最大値が同一であるため、\n"); printf("サフィックスLL以外の long long の検証は省略\n\n"); printf("型違いの場合の警告確認用コード\n"); printf("long int (%%u) %u(2147483648)\n\n", 2147483648); printf("10進定数・サフィックス無し\n"); printf("int (%%d) %d(2147483647)\n", 2147483647); printf("long int (%%ld) %ld(2147483648)\n", 2147483648); printf("long int (%%ld) %ld(9223372036854775807)\n\n", 9223372036854775807); printf("16進定数・サフィックス無し\n"); printf("int (%%d) %d(0x7FFFFFFF)\n", 0x7FFFFFFF); printf("unsigned int (%%u) %u(0x80000000)\n", 0x80000000); printf("unsigned int (%%u) %u(0xFFFFFFFF)\n", 0xFFFFFFFF); printf("long int (%%ld) %ld(0x100000000)\n", 0x100000000); printf("long int (%%ld) %ld(0x7FFFFFFFFFFFFFFF)\n", 0x7FFFFFFFFFFFFFFF); printf("unsigned long int (%%lu) %lu(0x8000000000000000)\n", 0x8000000000000000); printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFF)\n\n", 0xFFFFFFFFFFFFFFFF); printf("8進定数・サフィックス無し\n"); printf("int (%%d) %d(017777777777)\n", 017777777777); printf("unsigned int (%%u) %u(020000000000)\n", 020000000000); printf("unsigned int (%%u) %u(037777777777)\n", 037777777777); printf("long int (%%ld) %ld(040000000000)\n", 040000000000); printf("long int (%%ld) %ld(0777777777777777777777)\n", 0777777777777777777777); printf("unsigned long int (%%lu) %lu(01000000000000000000000)\n", 01000000000000000000000); printf("unsigned long int (%%lu) %lu(01777777777777777777777)\n\n", 01777777777777777777777); printf("10進定数・サフィックスU(u)\n"); printf("unsigned int (%%u) %u(4294967295U)\n", 4294967295U); printf("unsigned long int (%%lu) %lu(4294967296U)\n", 4294967296U); printf("unsigned long int (%%lu) %lu(18446744073709551615U)\n\n", 18446744073709551615U); printf("16進定数・サフィックスU(u)\n"); printf("unsigned int (%%u) %u(0xFFFFFFFFU)\n", 0xFFFFFFFFU); printf("unsigned long int (%%lu) %lu(0x100000000U)\n", 0x100000000U); printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFFU)\n\n", 0xFFFFFFFFFFFFFFFFU); printf("8進定数・サフィックスU(u)\n"); printf("unsigned int (%%u) %u(037777777777U)\n", 037777777777U); printf("unsigned long int (%%lu) %lu(040000000000U)\n", 040000000000U); printf("unsigned long int (%%lu) %lu(01777777777777777777777U)\n\n", 01777777777777777777777U); printf("10進定数・サフィックスL(l)\n"); printf("long int (%%ld) %ld(2147483647L)\n", 2147483647L); printf("long int (%%ld) %ld(2147483648L)\n", 2147483648L); printf("long int (%%ld) %ld(9223372036854775807L)\n\n", 9223372036854775807L); printf("16進定数・サフィックスL(l)\n"); printf("long int (%%ld) %ld(0x7FFFFFFFL)\n", 0x7FFFFFFFL); printf("long int (%%ld) %ld(0xFFFFFFFFL)\n", 0xFFFFFFFFL); printf("long int (%%ld) %ld(0x7FFFFFFFFFFFFFFFL)\n", 0x7FFFFFFFFFFFFFFFL); printf("unsigned long int (%%lu) %lu(0x8000000000000000L)\n", 0x8000000000000000L); printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFFL)\n\n", 0xFFFFFFFFFFFFFFFFL); printf("8進定数・サフィックスL(l)\n"); printf("long int (%%ld) %ld(017777777777L)\n", 017777777777L); printf("long int (%%ld) %ld(037777777777L)\n", 037777777777L); printf("long int (%%ld) %ld(0777777777777777777777L)\n", 0777777777777777777777L); printf("unsigned long int (%%lu) %lu(01000000000000000000000L)\n", 01000000000000000000000L); printf("unsigned long int (%%lu) %lu(01777777777777777777777L)\n\n", 01777777777777777777777L); printf("10進定数・サフィックスU(u)L(l)\n"); printf("unsigned long int (%%lu) %lu(4294967295UL)\n", 4294967295UL); printf("unsigned long int (%%lu) %lu(18446744073709551615UL)\n\n", 18446744073709551615UL); printf("16進定数・サフィックスU(u)L(l)\n"); printf("unsigned long int (%%lu) %lu(0xFFFFFFFFUL)\n", 0xFFFFFFFFUL); printf("unsigned long int (%%lu) %lu(0xFFFFFFFFFFFFFFFFUL)\n\n", 0xFFFFFFFFFFFFFFFFUL); printf("8進定数・サフィックスU(u)L(l)\n"); printf("unsigned long int (%%lu) %lu(037777777777UL)\n", 037777777777UL); printf("unsigned long int (%%lu) %lu(01777777777777777777777UL)\n\n", 01777777777777777777777UL); printf("10進定数・サフィックスLL(ll)\n"); printf("long long int (%%lld) %lld(2147483647LL)\n", 2147483647LL); printf("long long int (%%lld) %lld(9223372036854775807LL)\n\n", 9223372036854775807LL); printf("16進定数・サフィックスLL(ll)\n"); printf("long long int (%%lld) %lld(0x7FFFFFFFLL)\n", 0x7FFFFFFFLL); printf("long long int (%%lld) %lld(0x7FFFFFFFFFFFFFFFLL)\n", 0x7FFFFFFFFFFFFFFFLL); printf("unsigned long long int (%%llu) %llu(0x8000000000000000LL)\n", 0x8000000000000000LL); printf("unsigned long long int (%%llu) %llu(0xFFFFFFFFFFFFFFFFLL)\n\n", 0xFFFFFFFFFFFFFFFFLL); printf("8進定数・サフィックスLL(ll)\n"); printf("long long int (%%lld) %lld(017777777777LL)\n", 017777777777LL); printf("long long int (%%lld) %lld(0777777777777777777777LL)\n", 0777777777777777777777LL); printf("unsigned long long int (%%llu) %llu(01000000000000000000000LL)\n", 01000000000000000000000LL); printf("unsigned long long int (%%llu) %llu(01777777777777777777777LL)\n\n", 01777777777777777777777LL); printf("10進定数・サフィックスU(u)LL(ll)\n"); printf("unsigned long long int (%%llu) %llu(4294967295ULL)\n", 4294967295ULL); printf("unsigned long long int (%%llu) %llu(18446744073709551615ULL)\n\n", 18446744073709551615ULL); printf("16進定数・サフィックスU(u)LL(ll)\n"); printf("unsigned long long int (%%llu) %llu(0xFFFFFFFFULL)\n", 0xFFFFFFFFULL); printf("unsigned long long int (%%llu) %llu(0xFFFFFFFFFFFFFFFFULL)\n\n", 0xFFFFFFFFFFFFFFFFULL); printf("8進定数・サフィックスU(u)LL(ll)\n"); printf("unsigned long long int (%%llu) %llu(037777777777ULL)\n", 037777777777ULL); printf("unsigned long long int (%%llu) %llu(01777777777777777777777ULL)\n\n", 01777777777777777777777ULL); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample2.c sample2.c: In function ‘main’: <--- printf関数において型違いの場合に出力される警告 sample2.c:21:33: warning: format ‘%u’ expects argument of type ‘unsigned int’, but argument 2 has type ‘long int’ [-Wformat=] 21 | printf("long int (%%u) %u(2147483648)\n\n", | ~^ | | | unsigned int | %lu 22 | 2147483648); | ~~~~~~~~~~ | | | long int <--- 警告確認用コード以外の警告出力は無し $ ./a.out 整数定数が割り当てられる型階層の確認(以下、実装依存) 各種整数型最大値 INT_MAX=2147483647 UINT_MAX=4294967295 LONG_MAX=9223372036854775807 ULONG_MAX=18446744073709551615 LLONG_MAX=9223372036854775807 ULLONG_MAX=18446744073709551615 実装環境において、long と long long の最大値が同一であるため、 サフィックスLL以外の long long の検証は省略 型違いの場合の警告確認用コード long int (%u) 2147483648(2147483648) 10進定数・サフィックス無し int (%d) 2147483647(2147483647) long int (%ld) 2147483648(2147483648) long int (%ld) 9223372036854775807(9223372036854775807) 16進定数・サフィックス無し int (%d) 2147483647(0x7FFFFFFF) unsigned int (%u) 2147483648(0x80000000) unsigned int (%u) 4294967295(0xFFFFFFFF) long int (%ld) 4294967296(0x100000000) long int (%ld) 9223372036854775807(0x7FFFFFFFFFFFFFFF) unsigned long int (%lu) 9223372036854775808(0x8000000000000000) unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFF) 8進定数・サフィックス無し int (%d) 2147483647(017777777777) unsigned int (%u) 2147483648(020000000000) unsigned int (%u) 4294967295(037777777777) long int (%ld) 4294967296(040000000000) long int (%ld) 9223372036854775807(0777777777777777777777) unsigned long int (%lu) 9223372036854775808(01000000000000000000000) unsigned long int (%lu) 18446744073709551615(01777777777777777777777) 10進定数・サフィックスU(u) unsigned int (%u) 4294967295(4294967295U) unsigned long int (%lu) 4294967296(4294967296U) unsigned long int (%lu) 18446744073709551615(18446744073709551615U) 16進定数・サフィックスU(u) unsigned int (%u) 4294967295(0xFFFFFFFFU) unsigned long int (%lu) 4294967296(0x100000000U) unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFFU) 8進定数・サフィックスU(u) unsigned int (%u) 4294967295(037777777777U) unsigned long int (%lu) 4294967296(040000000000U) unsigned long int (%lu) 18446744073709551615(01777777777777777777777U) 10進定数・サフィックスL(l) long int (%ld) 2147483647(2147483647L) long int (%ld) 2147483648(2147483648L) long int (%ld) 9223372036854775807(9223372036854775807L) 16進定数・サフィックスL(l) long int (%ld) 2147483647(0x7FFFFFFFL) long int (%ld) 4294967295(0xFFFFFFFFL) long int (%ld) 9223372036854775807(0x7FFFFFFFFFFFFFFFL) unsigned long int (%lu) 9223372036854775808(0x8000000000000000L) unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFFL) 8進定数・サフィックスL(l) long int (%ld) 2147483647(017777777777L) long int (%ld) 4294967295(037777777777L) long int (%ld) 9223372036854775807(0777777777777777777777L) unsigned long int (%lu) 9223372036854775808(01000000000000000000000L) unsigned long int (%lu) 18446744073709551615(01777777777777777777777L) 10進定数・サフィックスU(u)L(l) unsigned long int (%lu) 4294967295(4294967295UL) unsigned long int (%lu) 18446744073709551615(18446744073709551615UL) 16進定数・サフィックスU(u)L(l) unsigned long int (%lu) 4294967295(0xFFFFFFFFUL) unsigned long int (%lu) 18446744073709551615(0xFFFFFFFFFFFFFFFFUL) 8進定数・サフィックスU(u)L(l) unsigned long int (%lu) 4294967295(037777777777UL) unsigned long int (%lu) 18446744073709551615(01777777777777777777777UL) 10進定数・サフィックスLL(ll) long long int (%lld) 2147483647(2147483647LL) long long int (%lld) 9223372036854775807(9223372036854775807LL) 16進定数・サフィックスLL(ll) long long int (%lld) 2147483647(0x7FFFFFFFLL) long long int (%lld) 9223372036854775807(0x7FFFFFFFFFFFFFFFLL) unsigned long long int (%llu) 9223372036854775808(0x8000000000000000LL) unsigned long long int (%llu) 18446744073709551615(0xFFFFFFFFFFFFFFFFLL) 8進定数・サフィックスLL(ll) long long int (%lld) 2147483647(017777777777LL) long long int (%lld) 9223372036854775807(0777777777777777777777LL) unsigned long long int (%llu) 9223372036854775808(01000000000000000000000LL) unsigned long long int (%llu) 18446744073709551615(01777777777777777777777LL) 10進定数・サフィックスU(u)LL(ll) unsigned long long int (%llu) 4294967295(4294967295ULL) unsigned long long int (%llu) 18446744073709551615(18446744073709551615ULL) 16進定数・サフィックスU(u)LL(ll) unsigned long long int (%llu) 4294967295(0xFFFFFFFFULL) unsigned long long int (%llu) 18446744073709551615(0xFFFFFFFFFFFFFFFFULL) 8進定数・サフィックスU(u)LL(ll) unsigned long long int (%llu) 4294967295(037777777777ULL) unsigned long long int (%llu) 18446744073709551615(01777777777777777777777ULL)

その3

浮動小数点定数

sample.c
#include <stdio.h> #include <stdlib.h> #include <math.h> int main(void) { printf("浮動小数点定数\n\n"); double samp_d1 = 123.123; /* 10進浮動小数点定数 */ double samp_d2 = 123.; /* 10進浮動小数点定数(少数部無し) */ double samp_d3 = .123; /* 10進浮動小数点定数(整数部無し) */ double samp_d4 = 1.23e2; /* 10進浮動小数点定数(指数表記) */ double samp_d5 = 1.23E-2; /* 10進浮動小数点定数(指数表記) */ /* 16進浮動小数点定数 */ double samp_d6a = 0xA.8p0; double samp_d6b = (10.0 + 8.0/16.0) * pow(2, 0); double samp_d7a = 0xAF.CDp2; double samp_d7b = (10.0 * 16.0 + 15.0 + 12.0/16 + 13.0/256.0) * pow(2, 2); printf("10進浮動小数点定数 %e\n", samp_d1); printf("10進浮動小数点定数(少数部無し) %e\n", samp_d2); printf("10進浮動小数点定数(整数部無し) %e\n", samp_d3); printf("10進浮動小数点定数(指数表記) %e\n", samp_d4); printf("10進浮動小数点定数(指数表記) %E\n", samp_d5); printf("16進浮動小数点定数 %E %E\n", samp_d6a, samp_d6b); printf("16進浮動小数点定数 %E %E\n\n", samp_d7a, samp_d7b); printf("明示的に定数の型を示すサフィックス\n"); printf("float\n"); printf(" f または F\n"); printf(" %1.10e(1.2345678901F) %1.10e(1.2345678901)\n", 1.2345678901F, 1.2345678901); printf("long double\n"); printf(" l または L\n"); printf(" %1.17Le(1.23456789012345678L) %1.17e(1.23456789012345678)\n", 1.23456789012345678L, 1.23456789012345678); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample.c $ ./a.out 浮動小数点定数 10進浮動小数点定数 1.231230e+02 10進浮動小数点定数(少数部無し) 1.230000e+02 10進浮動小数点定数(整数部無し) 1.230000e-01 10進浮動小数点定数(指数表記) 1.230000e+02 10進浮動小数点定数(指数表記) 1.230000E-02 16進浮動小数点定数 1.050000E+01 1.050000E+01 16進浮動小数点定数 7.032031E+02 7.032031E+02 明示的に定数の型を示すサフィックス float f または F 1.2345678806e+00(1.2345678901F) 1.2345678901e+00(1.2345678901) long double l または L 1.23456789012345678e+00(1.23456789012345678L) 1.23456789012345669e+00(1.23456789012345678)

その4

文字定数

sample1.c
#include <stdio.h> #include <stdlib.h> int main(void) { printf("文字定数\n\n"); printf("「%c」 --- 文字コード = %02X\n", 'A', 'A'); printf("「%c」 --- 文字コード = %02X\n", 'z', 'z'); printf("「%c」 --- 文字コード = %02X\n", '{', '{'); printf("\n"); printf("文字コードリスト\n"); for (int c1=0x2; c1<0x8; c1++) { printf("%02X ", c1*0x10); for (int c2=0; c2<0x10; c2++) { printf("%c ", c1*0x10+c2); } printf("\n"); } printf("\n"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample1.c $ ./a.out 文字定数 「A」 --- 文字コード = 41 「z」 --- 文字コード = 7A 「{」 --- 文字コード = 7B 文字コードリスト 20 ! " # $ % & ' ( ) * + , - . / 30 0 1 2 3 4 5 6 7 8 9 : ; < = > ? 40 @ A B C D E F G H I J K L M N O 50 P Q R S T U V W X Y Z [ \ ] ^ _ 60 ` a b c d e f g h i j k l m n o 70 p q r s t u v w x y z { | } ~

sample2.c
#include <stdio.h> #include <stdlib.h> #include <locale.h> #include <wchar.h> #include <uchar.h> /* バイト列表示用関数 */ void byteseq(char *cp, size_t nlen, const wchar_t *tname) { wprintf(L"%ls = ", tname); for (int i=0; i<nlen; i++) { wprintf(L"%02X ", cp[i]); } wprintf(L"\n"); } int main(void) { /* ロケール(LC_CTYPE)をシステムネイティブに設定 */ char *slocale = setlocale(LC_CTYPE, ""); wprintf(L"ロケール名 : %s\n\n", slocale); /* 文字定数によるワイド文字型の初期化 */ wchar_t wct = L'\x3041'; char16_t c16t = u'\x3042'; char32_t c32t = U'\x3043'; /* 各ワイド文字型のサイズ */ wprintf(L"sizeof(wchar_t) = %d\n", sizeof(wchar_t)); wprintf(L"sizeof(char16_t) = %d\n", sizeof(char16_t)); wprintf(L"sizeof(char32_t) = %d\n", sizeof(char32_t)); /* 格納されているワイド文字の表示 */ wprintf(L"wchar_t : %lc\n", wct); wprintf(L"char16_t : %lc\n", c16t); wprintf(L"char32_t : %lc\n", c32t); /* 格納されているワイド文字のバイト並び */ byteseq((char *)&wct, sizeof(wchar_t), L"wchar_t"); byteseq((char *)&c16t, sizeof(char16_t), L"char16_t"); byteseq((char *)&c32t, sizeof(char32_t), L"char32_t"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample2.c $ ./a.out ロケール名 : en_GB.UTF-8 sizeof(wchar_t) = 4 sizeof(char16_t) = 2 sizeof(char32_t) = 4 wchar_t : char16_t : char32_t : wchar_t = 41 30 00 00 char16_t = 42 30 char32_t = 43 30 00 00

sample3.c
エスケープシーケンス
#include <stdio.h> #include <stdlib.h> int main(void) { /* エスケープシーケンス */ char c01 = '\''; /* 一重引用符 */ char c02 = '\"'; /* 二重引用符 */ char c03 = '\?'; /* 疑問符 */ char c04 = '\\'; /* バックスラッシュ */ char c05 = '\a'; /* アラート(ベル) */ char c06 = '\b'; /* 後退(バックスペース) */ char c07 = '\f'; /* 改ページ */ char c08 = '\n'; /* 改行 */ char c09 = '\r'; /* 復帰 */ char c10 = '\t'; /* 水平タブ */ char c11 = '\v'; /* 垂直タブ */ char c12 = '\101'; /* 8進整数文字定数 */ char c13 = '\x41'; /* 16進整数文字定数 */ printf("一重引用符 「%c」\n", c01); printf("二重引用符 「%c」\n", c02); printf("疑問符 「%c」\n", c03); printf("バックスラッシュ 「%c」\n", c04); printf("アラート >>> [Enterキー]"); getchar(); printf("%c\n", c05); printf("後退(バックスペース) 「a%c」\n", c06); printf("改ページ 「%c」\n", c07); printf("改行 「%c」\n", c08); printf("復帰 「%c」\n", c09); printf("水平タブ(2連) 「%c%c」\n", c10, c10); printf("垂直タブ(2連) 「%c%c」\n", c11, c11); printf("8進整数文字定数 「%c」\n", c12); printf("16進整数文字定数 「%c」\n", c13); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample3.c $ ./a.out 一重引用符 「'」 二重引用符 「"」 疑問符 「?」 バックスラッシュ 「\」 アラート >>> [Enterキー] <--- Enterキー押し下げでベル(画面フラッシュ)発生 後退(バックスペース) 「」 <--- 1文字手前の「a」を削除 改ページ 「 」 改行 「 」 <--- 出力位置が行頭に移動 水平タブ(2連) 「 」 垂直タブ(2連) 「 」 8進整数文字定数 「A」 16進整数文字定数 「A」

sample4.c
エスケープシーケンス(ユニバーサル文字)
#include <stdio.h> #include <stdlib.h> #include <locale.h> #include <wchar.h> int main(void) { /* ロケール(LC_CTYPE)をシステムネイティブに設定 */ setlocale(LC_CTYPE, ""); /* エスケープシーケンス */ /* ユニバーサル文字名 */ wchar_t wct = L'\u3042'; wprintf(L"wchar_t : %lc\n", wct); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample4.c $ ./a.out wchar_t : あ

その5

文字列リテラル

sample1.c
UTF-8で符号化されたマルチバイト文字を含む場合
#include <stdio.h> #include <stdlib.h> #include <string.h> /* バイト列表示用関数 */ void byteseq(const char *cp, size_t nlen, const char *tname) { printf("%s = ", tname); for (int i=0; i<nlen; i++) { printf("%02X ", (unsigned char)cp[i]); } printf("\n"); } int main(void) { printf("文字列リテラル\n"); /* 文字列リテラル */ const char samp1[] = "あいうえお\n"; /* 文字列リテラル(接頭辞u8 : UTF-8) */ const char samp2[] = u8"あいうえお\n"; printf("samp1 = %s", samp1); printf("samp2 = %s", samp2); byteseq(samp1, strlen(samp1), "接頭辞無し"); byteseq(samp2, strlen(samp2), "接頭辞(u8)"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample1.c $ ./a.out 文字列リテラル samp1 = あいうえお samp2 = あいうえお 接頭辞無し = E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A 0A 接頭辞(u8) = E3 81 82 E3 81 84 E3 81 86 E3 81 88 E3 81 8A 0A

sample2.c
ワイド文字列リテラルを含む場合
#include <stdio.h> #include <stdlib.h> #include <locale.h> #include <wchar.h> #include <uchar.h> /* バイト列表示用関数 */ void byteseq(char *cp, size_t nlen, const wchar_t *tname) { wprintf(L"%ls = ", tname); for (int i=0; i<nlen; i++) { wprintf(L"%02X ", cp[i]); } wprintf(L"\n"); } int main(void) { /* ロケール(LC_CTYPE)をシステムネイティブに設定 */ char *slocale = setlocale(LC_CTYPE, ""); wprintf(L"ロケール名 : %s\n\n", slocale); /* 文字列リテラル(wchar_t) */ const wchar_t samp_wct[] = L"あいうえお"; /* 文字列リテラル(char16_t・終端用\0付加) */ const char16_t samp_c16t[] = u"あいうえお\0\0\0"; /* 文字列リテラル(char32_t) */ const char32_t samp_c32t[] = U"あいうえお"; /* 関数wprintfによるwchar_t型文字列リテラルの出力 */ wprintf(L"wchar_t samp_wct = %ls\n", samp_wct); /* 関数wprintfによるchar16_t型文字列リテラルの出力 */ wprintf(L"char16_t(文字列定数) samp_c16t = %ls\n", samp_c16t); /* 関数wprintfによるchar16_t型文字定数の個別出力 */ wprintf(L"char16_t(文字定数個別) samp_c16t = %lc%lc%lc%lc%lc\n", samp_c16t[0], samp_c16t[1], samp_c16t[2], samp_c16t[3], samp_c16t[4]); /* 関数wprintfによるchar32_t型文字列リテラルの出力 */ wprintf(L"char32_t samp_c32t = %ls\n\n", samp_c32t); byteseq((char *)samp_wct, 5 * sizeof(wchar_t), L"wchar_t"); byteseq((char *)samp_c16t, 5 * sizeof(char16_t), L"char16_t"); byteseq((char *)samp_c32t, 5 * sizeof(char32_t), L"char32_t"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample2.c $ ./a.out ロケール名 : en_GB.UTF-8 wchar_t samp_wct = あいうえお char16_t(文字列定数) samp_c16t = ????????????お <--- 文字化け発生 char16_t(文字定数個別) samp_c16t = あいうえお char32_t samp_c32t = あいうえお wchar_t = 42 30 00 00 44 30 00 00 46 30 00 00 48 30 00 00 4A 30 00 00 char16_t = 42 30 44 30 46 30 48 30 4A 30 <--- char16_t型は2バイト単位 char32_t = 42 30 00 00 44 30 00 00 46 30 00 00 48 30 00 00 4A 30 00 00

sample3.c
文字列リテラルの連結
#include <stdio.h> #include <stdlib.h> #include <locale.h> #include <wchar.h> /* バイト列表示用関数 */ void byteseq(char *cp, size_t nlen, const wchar_t *tname) { wprintf(L"%ls = ", tname); for (int i=0; i<nlen; i++) { wprintf(L"%02X ", cp[i]); } wprintf(L"\n"); } int main(void) { setlocale(LC_CTYPE, ""); /* シングルバイト文字列 */ const char samp1[] = "ab"; /* シングルバイト文字列 シングルバイト文字列 */ const char samp2[] = "ab" "cd"; /* ワイド文字列 */ const wchar_t samp3[] = L"ab"; /* シングルバイト文字 ワイド文字列 */ const wchar_t samp4[] = "ab" L"cd"; /* ワイド文字列 ワイド文字列 */ const wchar_t samp5[] = L"ab" L"cd"; /* シングルバイト文字 シングルバイト文字 シングルバイト文字 */ const char samp6[] = "ab" "cd" "ef"; /* ワイド文字列 シングルバイト文字 ワイド文字列 */ const wchar_t samp7[] = L"ab" "cd" L"ef"; wprintf(L"samp1 = %s\n", samp1); wprintf(L"samp2 = %s\n", samp2); wprintf(L"samp3 = %ls\n", samp3); wprintf(L"samp4 = %ls\n", samp4); wprintf(L"samp5 = %ls\n", samp5); wprintf(L"samp6 = %s\n", samp6); wprintf(L"samp7 = %ls\n", samp7); wprintf(L"\n"); byteseq((char *)samp1, 2 * sizeof(char), L"samp1"); byteseq((char *)samp2, 4 * sizeof(char), L"samp2"); byteseq((char *)samp3, 2 * sizeof(wchar_t), L"samp3"); byteseq((char *)samp4, 4 * sizeof(wchar_t), L"samp4"); byteseq((char *)samp5, 4 * sizeof(wchar_t), L"samp5"); byteseq((char *)samp6, 6 * sizeof(char), L"samp6"); byteseq((char *)samp7, 6 * sizeof(wchar_t), L"samp7"); return EXIT_SUCCESS; }

実行結果
$ gcc -Wall sample3.c $ ./a.out samp1 = ab samp2 = abcd samp3 = ab samp4 = abcd samp5 = abcd samp6 = abcdef samp7 = abcdef samp1 = 61 62 samp2 = 61 62 63 64 samp3 = 61 00 00 00 62 00 00 00 samp4 = 61 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00 samp5 = 61 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00 samp6 = 61 62 63 64 65 66 samp7 = 61 00 00 00 62 00 00 00 63 00 00 00 64 00 00 00 65 00 00 00 66 00 00 00

実行環境

GNU bash, version 5.1.16
GCC-12.2.0
GNU C Library 2.36
GNU Binutils 2.39


コード例・出力内容中の表記

・実行例中の太字表記部分は、コマンドなどの入力された文字列を示します。
・「」や「...」の着色省略表記は、 実際のソースコードや出力内容などを省略加工した部分を示します。