[Armadillo:05019] Re: CON16 (シリアルインターフェース1)のリブート時のメッセージ抑制
Masahiro Hanada
email@hidden
2010年 3月 12日 (金) 13:48:48 JST
花田です。
> ところで、
> char hoge[4] = { 'a', 'b', 'c', '\0' };
> の場合の最後の'\0'は省略できて
> char hoge[4] = { 'a', 'b', 'c' };
> がOKというのは知っていましたが、
>
> 配列数の指定がない
> char hoge[] = { 'a', 'b', 'c' };
> の場合も後ろに'\0'が補われるんですね。
> これもご紹介いただいたページに書いてありました。
> (なんか不安がありますが・・・・)
えぇ、その通りです。
char型を並べた集成体は、要するに文字列リテラルとまったく同一に扱われるわけでして、
特に留意しなくても勝手にNULL補完されるのが原則ということです。
さらに、本当に余談でしかないですが…Cでは原則どおりにならない例がありまして。
char hoge[3] = { 'a', 'b', 'c' };
char hoge[3] = "abc";
この2つはCとして正しくコンパイルが通ります。
NULL補完はされず、プログラマの(多分)期待通りにchar型3つの配列ができあがります。
ところが、これをC++としてコンパイルすると、エラーになります。
C++では文字列は必ずしっかり文字列(ただのchar型配列ではないということ)として
扱われるため、文字列リテラルの時点で必ずNULL補完され、
サイズが3しかないhogeへの初期化要素としてサイズオーバーと判定されるからです。
…CとC++の細かな言語仕様の違いの例として、よく取り上げられるお話でした。
"Yasuhisa Nakamura" <email@hidden> wrote:
> 中村です。
>
> 花田さん、ありがとうございます。
>
> [Armadillo:05017]で花田さんwrote:
> > ここでのconsoleは配列型であって、代入される初期化要素は
> > 集成体型(= { 1, 2, 3 } のような書き方)であってよい、
> > ということがポイントと思います。
> >
> > いい加減に探した中でGoogleキャッシュしか見つからなくて恐縮ですが…
> > ↓の表6-6参照。
> > http://74.125.153.132/search?q=cache:ZOrNzBKf5lcJ:www.imit.chiba-u.ac.jp/new-system/sr/man_hitachi_c/MAN/3000/03C3100D/C310095.HTM
>
> 表の中の
> 集成型 配列型 要素型がchar型
> {定数式,...}※2,
> {整数文字列リテラル}または整数文字列リテラル
> と、
> 少し下にある説明の
> # char型の配列型のオブジェクトは,整数文字列リテラルを
> 初期化指定子とすることで初期化されます。また,整数文字列
> リテラルを囲む波括弧{ }は,省略できます。
> のところがポイントですね。
>
> なるほど・・・私が「普通は・・・・こう書きますよね?」
> という書き方が、実は省略形だったと。。。
>
> > { 'a', 'b', 'c', '\0' } // '\0'は省略もできます
> > の省略形が
> > { "abc" }
> > であって、
> > "abc"
> > と書いて構わないと許した…結果的にどの書き方も正しい、ということだった筈。
>
> てっきり、 { 'a', 'b', 'c', '\0' } と "abc" が同じものと
> 思い込んでおりました。
> char abc[] = { 'a', 'b', 'c', '\0' }; と書くのが面倒なので、
> これを char abc[] = "abc"; と書くことが許されている、と。
>
>
> ところで、
> char hoge[4] = { 'a', 'b', 'c', '\0' };
> の場合の最後の'\0'は省略できて
> char hoge[4] = { 'a', 'b', 'c' };
> がOKというのは知っていましたが、
>
> 配列数の指定がない
> char hoge[] = { 'a', 'b', 'c' };
> の場合も後ろに'\0'が補われるんですね。
> これもご紹介いただいたページに書いてありました。
> (なんか不安がありますが・・・・)
>
>
> # 私が書いた[Armadillo:05016]で、つい仕事上の悪い癖で
> # 元メールを丸ごと長々と引用した無駄に長いメールに
> # なってしまっていました。お許しください。
>
> --
> なかむら
>
> _______________________________________________
> armadillo mailing list
> email@hidden
> http://lists.atmark-techno.com/cgi-bin/mailman/listinfo/armadillo
____________________________________________________
花田 政弘 (はなだ まさひろ)
E-mail: email@hidden
____________________________________________________
armadillo メーリングリストの案内