「どーせ誰も見ないから好き勝手書こう」
とタカをくくってたらたくさんのコメントを頂きびびってます。。。
ありがたやー、ありがたやー。。。
でも、「飽きた」なんて言って放置しないでくださいね・・・放置されても書いちゃいますけど。
今回のお題は「Literals」@C++の中から「文字リテラル」についてです。
教科書は同じく「ISO/IEC 14882:2003(E)」です。
ではさっそく。
---------------------------------------------------------------
character-literal:
’c-char-sequence’
L’c-char-sequence’
c-char-sequence:
c-char
c-char-sequence c-char
c-char:
any member of the source character set except
the single-quote ’, backslash \, or new-line character
escape-sequence
universal-character-name
escape-sequence:
simple-escape-sequence
octal-escape-sequence
hexadecimal-escape-sequence
simple-escape-sequence: one of
\’ \" \? \\
\a \b \f \n \r \t \v
octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
hexadecimal-escape-sequence:
\x hexadecimal-digit
抜けてました!!!!とっちゃんさんご指摘ありがとうございます!2007/2/16
hexadecimal-escape-sequence hexadecimal-digit
---------------------------------------------------------------
いっこずつ見て行きましょう。
---------------------------------------------------------------
character-literal:
’c-char-sequence’
L’c-char-sequence’
---------------------------------------------------------------
さっそくですが・・・
character-literal(文字リテラル)は
’c-char-sequence’:シングルクォーテーションで囲まれたc-char-sequence(後述)
L’c-char-sequence’:先頭にLのついたシングルクォーテーションで囲まれたc-char-sequence(後述)
になります。
Lのついているほうはいわゆる「ワイド文字」な方ですね。
---------------------------------------------------------------
c-char-sequence:
c-char
c-char-sequence c-char
---------------------------------------------------------------
c-char-sequenceはc-char単体か、c-charが繋がったものです。
(普通の文字は繋がっちゃうと文字リテラルじゃなくなってしまうので、エスケープシーケンス+αのこと?)
そこでc-charはなんぞやというと・・・
---------------------------------------------------------------
c-char:
any member of the source character set except
the single-quote ’, backslash \, or new-line character
escape-sequence
universal-character-name
---------------------------------------------------------------
> any member of the source character set except
> the single-quote ’, backslash \, or new-line character
シングルクオーテーション、バックスラッシュ(\ですが・・・)、改行文字を除いた
文字となっています。
また、エスケープシーケンスは文字リテラル扱いです。
universal-character-nameというのは、ほかで定義されていますがこれらの文字です。
_ a b c d e f g h i j k l m
n o p q r s t u v w x y z
A B C D E F G H I J K L M
N O P Q R S T U V W X Y Z
0 1 2 3 4 5 6 7 8 9
ではescape-sequenceとはなんぞや・・・というと、
---------------------------------------------------------------
escape-sequence:
simple-escape-sequence
octal-escape-sequence
hexadecimal-escape-sequence
---------------------------------------------------------------
・simple-escape-sequence:単純なエスケープシーケンス
・octal-escape-sequence:8進エスケープシーケンス
・hexadecimal-escape-sequence:16進エスケープシーケンス
があるということです。
そういえば10進エスケープって無いですね・・・別にいらないですけど。
---------------------------------------------------------------
simple-escape-sequence: one of
\’ \" \? \\
\a \b \f \n \r \t \v
---------------------------------------------------------------
それで・simple-escape-sequence:単純なエスケープシーケンスはどうなのかというと、
\'(single quote)
\"(double quote)
\?(question mark)
\\(backslash)
\a(alert)
\b(backspace)
\f(form feed)
\n(new-line)
\r(carriage return)
\t(horizontal tab)
\v(vertical tab)
ということになります。
---------------------------------------------------------------
octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
---------------------------------------------------------------
・octal-escape-sequence:8進エスケープシーケンスは、
\ octal-digit:\+8進数値
\ octal-digit octal-digit : \+8進数値+8進数値
\ octal-digit octal-digit octal-digit : \+8進数値+8進数値+8進数値
になります
---------------------------------------------------------------
hexadecimal-escape-sequence:
\x hexadecimal-digit
抜けてました!!!!とっちゃんさんご指摘ありがとうございます!2007/2/16
hexadecimal-escape-sequence hexadecimal-digit
---------------------------------------------------------------
・hexadecimal-escape-sequence:16進エスケープシーケンスは、
\x hexadecimal-digit:\x+16進数値
hexadecimal-escape-sequence hexadecimal-digit: \x+16進数値+16進数値
になります。
ふと思ったんですけど、実際問題char型は
---------------------------------------------------------------
Objects declared as characters (char) shall be large enough to store any member of the implementation’s basic character set.
---------------------------------------------------------------
char型のサイズって「環境次第」なわけですが(「実装における基本的な文字セットが入るサイズ」と定義されているだけで具体的なサイズ指定は無い)、
\ octal-digit octal-digit octal-digit : \+8進数値+8進数値+8進数値
\x hexadecimal-digit:\x+16進数値
までサポートなら、変態文字コード環境(仮定ですが全ての文字が固定で64bitとか)だと、
8進・16進の文字リテラルで入力できない値が・・・
どうせ、わざわざ入力する「制御文字」は文字コードの先頭のほうにあるからいいんですが。。。
(その辺、間違ってたらつっこみよろしくお願いします。。。)
↑その辺のことの顛末はコメント欄に・・・はい、間違ってます、自分。orz
自分で「日記を書くのは30分」縛りを設定しているため、この辺で。。。
ワイド文字あたりはもうちょっと突っ込みたかったですが。。。
それでは次回、「float」編です。