[迷信] 一重引用符の中には一文字しか書けない
一重引用符 ' で囲まれた文字定数または文字リテラルには、一文字しか書けないと考えている方が少なくないようです。例えば、'abc' のような書き方をすると、コンパイルエラーになるか、未定義の動作になると考えているのでしょう。しかし、実際にはそんなことはありません。
あれこれ説明する前に、標準規格から引用したいと思います。まずは C からです。
6.4.4.4 文字定数
(中略)
補足説明 単純文字定数は, 一重引用符で囲まれた一つ以上の多バイト文字の並びとする(例えば'x')。ワイド文字定数は, 英字Lという接頭語が付いていることを除いて単純文字定数と同一とする。後に詳述する幾つかの例外を除いて, 列の要素はソース文字集合の任意の要素とする。それらは実行文字集合の要素に処理系定義の方法で対応付ける。
(中略)
2文字以上を含む(例えば'ab')又は1バイトの実行文字で表現できない文字若しくは逆斜線表記を含む単純文字定数の値は, 処理系定義とする。単純文字定数が単一の文字又は逆斜線表記を含む場合, その値はその単一の文字又は逆斜線表記の値を持つchar型のオブジェクトをint型に変換したときの結果の値とする。
(中略)
2文字以上の多バイト文字を又は実行拡張文字集合で表現できない多バイト文字若しくは逆斜線表記を含むワイド文字定数の値は, 処理系定義とする。JIS X3010:2003より引用
次は C++ です。
2.13.2 文字リテラル
(中略)
文字リテラルは, 1文字又は複数文字を一重引用符でくくる(例えば,'x')。その前に英字Lを置く(例えば,L'x')こともある。Lを置かない通常の文字リテラルは, ナロー文字リテラルとも呼ばれる。1個の《c 文字》をくくった通常の文字リテラルは,char型をもち, その《c 文字》の実行文字集合での符号数値に等しい値をもつ。2個以上の《c 文字》をくくった通常の文字リテラルを, 多文字リテラル(multicharacter literal)という。多文字リテラルは,int型をもつ。その値は, 処理系定義とする。
文字Lで始まる文字リテラル(例えば'x')を, ワイド文字リテラルという。ワイド文字リテラルは,wchar_t型をもつ。2個以上の《c 文字》をくくったワイド文字リテラルの値は, 処理系定義とする。JIS X3014:2003より引用
表現や個々の用語に違いはありますが、C も C++ も、一重引用符に囲まれた文字定数(または文字リテラル)に複数の文字が記述されることを前提とした仕様になっており、その値は(未定義ではなく)処理系定義です。つまり、移植性に関する問題はあるものの、一重引用符の中に2文字以上書けるということです。
トラックバック
ブックナビゲーション
- 技術情報
- Boost C++ Libraries メモ
- C++と組込み環境
- C++サンプル集
- C++テンプレート集
- C++プログラマのためのC言語入門
- C/C++迷信集
- [迷信] 'A'~'Z' の値は連続している
- [迷信] 0xe-0xe はゼロ
- [迷信] 1 バイトは 8 ビット
- [迷信] 2の累乗による割り算と右シフトは等価
- [迷信] FILE 型は構造体
- [迷信] abs は常に非負の値を返す
- [迷信] argv[0] はプログラム名
- [迷信] char 型は符号付き
- [迷信] double の出力書式は "%lf"
- [迷信] fflush で入力バッファをクリア
- [迷信] free でメモリを開放する
- [迷信] free に NULL を渡すとクラッシュする
- [迷信] gets は単純に fgets に置き換えられる
- [迷信] isalpha 関数の引数は char 型
- [迷信] new に失敗すると NULL が返る。
- [迷信] scanf ではバッファオーバーランを防げない
- [迷信] scanf でキーボードから入力
- [迷信] setjmp マクロの返却値は変数に代入できる
- [迷信] sizeof は定数式
- [迷信] void main(void)
- [迷信] とりあえず memset で初期化
- [迷信] アルゴリズム関数内で関数オブジェクトはコピーされない
- [迷信] オブジェクトの動的生成に失敗するとメモリリークする
- [迷信] コンストラクタから例外を送出してはならない
- [迷信] コンストラクタで自身をゼロクリア
- [迷信] コンパイラはプログラマの心を察してくれる
- [迷信] コンパイルエラーが出るのでアクセス指定子を修正
- [迷信] ソースコード中の即値を全廃せよ
- [迷信] ソースファイルの末尾に }
- [迷信] データ列のソートには qsort 関数を使うべし
- [迷信] プログラムは必ず main から始まる
- [迷信] 一重引用符の中には一文字しか書けない
- [迷信] 今どき int が 16 ビットの処理系なんて無い
- [迷信] 入力データ格納用配列のサイズは BUFSIZ
- [迷信] 割付けたメモリはプログラマが自分で解放しなければならない
- [迷信] 実数型とは浮動小数点型のことである
- [迷信] 引用符で囲んだヘッダ名はカレントディレクトリから探索する
- [迷信] 文字列から整数への変換には atoi
- [迷信] 構造体のタグ名は下線で始める
- [迷信] 構造体はクラスではない
- [迷信] 識別子に使える文字は英数字と下線のみ
- [迷信] 非局所オブジェクトは外部結合
- C言語再入門
- C言語徹底入門
- Drupal メモ
- TOPPERS 情報
- ライブラリ開発入門
- 分割コンパイルをきわめる
- 擬似プロセッサを作る
- 車輪の再発明
- 過去の情報

