FC2ブログ
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

--/--|スポンサー広告||TOP↑
Cにおいて

0
'\0'
は結局(int)0になる。(ならなくてもよかった気がするけど、NULを0以外に割り当てる変態、変則コードだけでしょ。)

NULLはたいていただの0を定義するマクロだ。
#define NULL 0
(ただし、処理系によっては文法チェック上は(void*)にすることがある。
というか、VCだと上記の定義なのに警告でるんだが。予約語扱いか)

L'\0'
これは型はwchar_tになるが、結局0だ。

さらに、興味深いことに変数の初期化では
int a = {0};
としても0で初期化される。

また、ポインタの初期化、および代入で0を使用すると、勝手にヌルポインタを割り当てる。
ヌルポインタは内部表現で整数の0と異なってもよいが、コンパイラが調整してくれる。
(また、0と比較して等しくなる)

配列を[0}で初期化すると、すべての要素を0で初期化したときと同様に初期化される。
構造体で{0}を使うと、すべてのメンバ変数は0を代入したときと同様に初期化する。

また、両者ともにそれぞれのルールを再帰的に適用する。


以上から、{0}はすべての初期化式において0初期化できることがわかる。
0
NULL
'\0'
L'\0'
"\0" #これはただしくないがよく見る
""
L""
memset(p, 0, size) #これで構造体を初期化しちゃだめ。(特定処理系向けで、移植性がないのを理解しているか、絶対に他の処理系で仕事しないならいいけど)

これらを使い分けられない人は
{0}
で初期化してしまおう。


char *str = '\0';
char buf[512] = {"",};

とか、分けのわからないコードを見てそう思った。(上記の説明の通り、これで初期化できるのはわかるんだけど、なぜそう書いたのか理解できない。)
スポンサーサイト

04/28|プログラムコメント(0)トラックバック(0)TOP↑
この記事にコメント
名前:
コメントタイトル:
メールアドレス:
URL:
コメント:

パスワード:
管理人だけに表示:
管理者にだけ表示を許可
この記事にトラックバック
プロフィール

G.U.Nex

Author:G.U.Nex
職業:プログラマ
趣味:ゲーム(PC、コンシューマ)、ネットサーフィン、ニコニコ動画視聴、プログラミング、鉄道全般
PHP, C, C++, VB(系), Java, JavaScriptを使える。
最近はRubyにはまってる。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブロとも申請フォーム
ブログ内検索
RSSフィード
リンク
フリーエリア
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。