ふ 流浪の日々

日々流されてます

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  72  : 記事  0  : コメント  1353  : トラックバック  34

ニュース




書庫

日記カテゴリ

「どーせ誰も見ないから好き勝手書こう」

とタカをくくってたらたくさんのコメントを頂きびびってます。。。

ありがたやー、ありがたやー。。。

でも、「飽きた」なんて言って放置しないでくださいね・・・放置されても書いちゃいますけど。

今回のお題は「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」編です。

投稿日時 : 2007年2月15日 23:18

コメント

# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 11:29 とっちゃん
先生!しつもーん

/x hexadecimal-digit は、16進数値 となっていますが、利用していい文字「数」に制約はあるんでしょうか?
仮に1文字だとすると、0x0~0xFまでになってしまい、0~15しか表現できません。
\x1b(\033) が表現できないとJISのShift-IN/Shift-Outに8進数しか使えなくて、おいら読めねーっす<おい!

触り始めた昔から、16進数か2進数か10進数かだったんで...w
いまだに8進数は苦手なんですが...w

# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 12:09 fu
>とっちゃんさん

>先生!しつもーん

先生はとっちゃんさんですよ(笑)


>/x hexadecimal-digit は、16進数値 となっていますが、利用していい文字「数」に制約はあるんでしょうか?
>仮に1文字だとすると、0x0~0xFまでになってしまい、0~15しか表現できません。
>\x1b(\033) が表現できないとJISのShift-IN/Shift-Outに8進数しか使えなくて、おいら読めねーっす<おい!

ご指摘のとおりです・・・PDFからコピペしたときに1行漏れてました。。。

(1)\x hexadecimal-digit:\x+16進数値
(2)hexadecimal-escape-sequence hexadecimal-digit: hexadecimal-escape-sequence (\x+16進数値)+16進数値

ですね・・・そりゃそうですね。僕の0x42 0x41 0x4b 0x41 ・・・


推敲なんてしていないことがバレバレですねw


この間違いを元に話をしてしまったために、恥をかいてグレる少年が生まれなければいいのですが。。。


# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 12:22 とっちゃん
いあ、おいらに規格書を読む根性はないので先生にはなれませんwww<おい!

>ご指摘のとおりです・・・PDFからコピペしたときに1行漏れてました。。。
あ、なるほど。納得納得。。。w

>推敲なんて...
おいらも人のことは言えんですよw
#BestPractice の和訳なんて何か所も間違い修正してるしww


# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 13:01
>とっちゃんさん

>>ご指摘のとおりです・・・PDFからコピペしたときに1行漏れてました。。。
>あ、なるほど。納得納得。。。w

失礼しました ヽ(=´Д`=)ノ


そこでふと疑問が。

8進はあからさまに
\ octal-digit octal-digit octal-digit : \+8進数値+8進数値+8進数値
と3桁までで謳っていて、

16進は、
hexadecimal-escape-sequence:
\x hexadecimal-digit
hexadecimal-escape-sequence hexadecimal-digit

(1)hexadecimal-escape-sequence->(\x1とか)
(2)hexadecimal-escape-sequence hexadecimal-digit : \x12とか
(3)hexadecimal-escape-sequence hexadecimal-digitがまたhexadecimal-escape-sequenceに入って\x123・・・
再帰で考えると0xfffff・・・いくらでも指定できます。


ためしに手元のVC2005ExpressEdition(仕事はVC6.0ですがw)で確認してみると、
int main(int argc, char* argv[])
{
char a = 0xfff;
char b = 077777;

return 0;
}

warning C4309: '初期化中' : 定数値が切り捨てられました。

値が切り捨てられるのはわかりますが、コンパイルエラーにはなりませんね。。。

16進はOKですが、8進は規格外?うーん。家に帰ったら他のコンパイラでも試してみます。

# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 13:06
↑本文内の下部については(変態文字コードうんぬんのあたり)16進なら0xffff・・・いくらでも繋げられるから入っちゃいますね。。。帰宅したら修正します。。。

問題は8進。。。

# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 16:03 とっちゃん
>再帰で考えると
できます。というかできないと困るわけでww<LでUNICODE文字を指定できない!

8進数の方はおそらく歴史的な経緯があるのではないかとw

で、確認ソースが右辺がリテラル数値で、文字になってないです。

ここは、’’でくくってあげないとw


# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 19:27
>とっちゃんさん

>で、確認ソースが右辺がリテラル数値で、文字になってないです。
>ここは、’’でくくってあげないとw

わぁぁぁorz

一番最初に自分で言ってるのに・・・

目の前のディスプレイ上での間違いならもみ消しますが、世間様の前で間違えると・・・orz


いやいや、こうやって直接指摘してもらえるのってすごくありがたいわけで・・・精進します。



>>再帰で考えると
>できます。というかできないと困るわけでww<LでUNICODE文字を指定できない!

毎日とっちゃんさんに添削されてるような気分ですw



いやー、人前でち〇こ出すほうが恥ずかしくないかもw


# re: 【C++】Literals(その2:文字リテラル) 2007/02/16 20:58
追試です。


int main(int argc, char* argv[])
{
char a = '\xfff';
char b = '\7777';

return 0;
}

error C2022: '4095' : 文字として大きすぎます。
error C2022: '511' : 文字として大きすぎます。


おっけーです!(エラー出して喜ぶのもなんですが。。。)
16進のほうは今回のテストではchar=8bitだからいいんですけど、8進のほうは「文字として大きすぎます」より「規格だとoctalは3桁までだよーん」のほうが嬉しいです。。。

別にcl.exeが「規格準拠に命かけてます」ってわけではないでしょうが。。。


>とっちゃんさん

ありがとうございました!



8進(8進はそもそもあまり使わないけど・・・)16進を文字リテラルで入れることってあまりないので・・・思わずクォーテーション抜けちゃいました。←それを理解が浅いと言う。。。




さて、照れ隠しに「ちんこ音頭」でも。。。
http://www2.ocn.ne.jp/~e-kay/nani/chinko.htm

# 【C++】Literals(その5:真理値リテラル) 2007/04/04 20:07 ふ 流浪の日々
【C++】Literals(その5:真理値リテラル)

# 【C++】C++が語る「お腹いっぱい」 2008/07/03 6:29 ふ 流浪の日々
【C++】C++が語る「お腹いっぱい」

# iLIOngJLhXiqnYNpw 2011/09/29 6:19 http://oemfinder.com
l7CBD6 Comrade kill yourself.

# DTaYmhhWpKLKZn 2011/10/11 2:52 http://www.best-software.net/
The Author is crazy..!

# uoFhSGndwsPFmg 2011/10/18 17:28 http://www.best-software.net/vend-name/adobe
Last a few years has been to Ibiza, so met a person there whose style of presentation is very similar to yours. But, unfortunately, that person is too far from the Internet!...

# JVklAwSRvQoBp 2011/10/18 18:56 http://www.zexersoft.com/download/oem-Adobe-Photos
Current blog, fresh information, I read it from time to time!!...

# JWWRlwCsVYDhoi 2011/11/02 5:20 http://www.pharmaciecambier.com/
Yeah, now it's clear !... And firstly I did not understand very much where there was the link with the title itself !!...

# blluXfTkWjkRDVP 2011/11/02 6:13 http://optclinic.com/
Left on my site a link to this post. I think many people will be interested in it..!

# FBKZebAlQRH 2011/11/02 8:34 http://papillomasfree.com/
Thanks for the news! Just was thinking about it! By the way Happy New Year to all of you:D

# bFTijSHcOQqDkl 2011/11/08 16:44 http://www.farmaciaunica.com/
It's straight to the point! You could not tell in other words! :D

# dGTHiZucQcoPF 2011/11/08 16:59 http://www.buyclomid.biz
Pleased to read intelligent thoughts in Russian. I`ve been living in England for already 5 years!...

# DERDqQSyfCvFP 2011/11/15 3:45 http://www.pharmaciedelange.com/
I read online (computer problems) positive feedback about your resource. Didnt even believe it, and now saw myself. It turned out that I was not fooled!...

# ZoEijIMeWfPnNWd 2011/11/16 3:27 http://www.hansensurf.com/Boardshorts.html
I`m so grateful that you enlightened me and the most important thing that it happened in time. Just think, I have been using the internet for six years already but it`s the first time I`ve ever heard about it!...

# XFSofIjvUlISYxikUhc 2011/11/16 3:52 http://www.laurenslinens.com/juvbed.html
Every time I come back here again and don`t get disappointed..!

Post Feedback

タイトル
名前
Url:
コメント