[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 メーリングリストの案内