トップページ

本棚


両手で1000まで数えられますか?:2進法の話
数値 - 危険物取り扱い注意
100 × 200 =32?:変数のオーバーフローの話
パリティビット
小数の扱いについて
ぽいんた
ぽいんた2
ぽいんた3
ジ・オリジン
ジ・オリジン:補足
かっこつける話
かっこつける話2
文字列のこと
タイミングの話
拡張性の話
取り込む話
staticな話

コンパイルの話1
コンパイルの話2:止まらぬビルド
コンパイルの話3:マシン語に落ちるということ1:メモリの話
コンパイルの話4:マシン語に落ちるということ2:最適化
コンパイルの話5:マシン語に落ちるということ3:変数とスタック
コンパイルの話6:コンパイラはそもそも何をやってくれるのか??
リンクの話
プリプロセッサの話

OS、というもの

オブジェクト指向1
オブジェクト指向:2
オブジェクト指向:3

オブジェクト指向:番外 C言語のソースファイルの話
オブジェクト指向:番外 C言語での「再利用性」と「カプセル化」データ構造とアルゴリズム


抽象的な話

寝込んで布団の中で考えたこと
こんなの、常識??
お仕事プログラミング
ソフトでハードなプログラム
プログラムするということ
お勉強
プログラムを学ぶということの補足
C言語:「学問」と「実務」
統合開発環境
C言語ってポータブルですか?
C言語ってポータブルですか?:2
あなたは、どう読みますか?
ああ勘違い
試してガッテン
低級品
質問をするということ
ポカ
「何もしない」 != 「無駄」
エディタの話
もっと手を抜こう

いまどきの、アセンブラ

VisualStudio2005
VisualStudio2005:2

戦争の防ぎ方、に対する私の考え
身近な差別
改革
地球に優しいなんて大嘘
統計で嘘をつく方法

言葉について
言葉について:2

神が死んだということ
善悪の彼岸から、力への意思を目覚めさせるということ

本を読むということ
本を読むということ:2

絵を描く話
地図
地球儀

オカルトのお話
がんだむさん
RPGソフトウェア
記紀神話の不思議



メニュー

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

C言語は、やたらと括弧を使う。

関数だけでなく、マクロにも、演算子にも、キーワードにも。

特に紛らわしいのは、演算子とキーワード。

sizeof()が、関数だと思って(あるいはそんなことすら考えずに)使ってる人、結構いる。

これは、演算子であって、+とか-とかと同じモノなのだ。

したがって、sizeof()でサイズを取得する処理は、基本的にコンパイラが行う。このレベルで行うからこそ、配列のサイズなんてものが取得できるのだ。前にも書いたように、C言語は「先っぽ」しか知らないのだから。

unsigned char ucaHoge[100]:
unsigned char* ucpPiyo = malloc((size_t)100);

と宣言したとき、どちらも100バイトの領域の「先っぽ」をさしている。

決定的に違うのはucaHogeは100バイトから増えも減りもしない、つまりソースがコンパイルされる時点で大きさが決定しているのに対して、ucpPiyoは処理によってサイズが変わる(領域を確保しなおす)可能性がある。

これらに対してsizeof()でサイズを取得しようとすると、ucaHogeが100を返すのに対してucpPiyoはポインタ型変数のサイズ(32bit環境だと4)を返す。sizeofは「演算子」で、静的な演算はコンパイルの時点で計算され数値に置き換えられるからだ。

sizeofに()がついているのでまるで魔法のようにサイズを取得できそうな関数って感じだけど、そうではないのだ。

ここら辺のことは、まあある程度C言語触った人なら知ってると思うんだけど。

それでも、まだまだ落とし穴はある。

例えば静的な配列でも、サイズを取得できない場合がある。

aaa.c というファイルで
unsigned char ucaHoge[100];
を宣言したとして、bbb.c でも使いたくなった時、
extern unsigned char ucaHoge[];
としてしまうとそのソースコード内ではサイズが判らないため、コンパイラはsizeof(ucaHoge)で「先っぽ」のサイズ(ポインタのサイズ)を返す。意外と、これでハマったりする人を見かける。

また、文字列も中位が必要。

char* cpMoji1 = "Hello!\n";
と宣言したとき、
sizeof(cpMoji1) と sizeof("Hello!\n")は一致しない。
前者はポインタのサイズを返し、後者は文字列のバイト数(NULL文字を含む)を返す。

文字列リテラルはポインタだと思ってる人も多い(これは結構熟練者にも多い)が、実は静的かつconstな配列なのである。

これらのことはsizeof()が演算子だと理解していればそんなにややこしい話ではないのだけれど、なまじ括弧がついてるから騙されやすい。


また、キーワードにつく括弧も要注意。というか、言いたいのはreturnキーワードについてだけと言ってもいいけど(w

関数から帰るとき
return 1;
とする人と
return(1);
とする人がいる。

文法上は、どちらも問題ない。

でも、ミスタイプして
retrun(1);としてしまうとコンパイラはretrunという関数コールだと思ってしまう。この手のミスは、()をつけなければコンパイラがはじいてくれるので見つけやすいんだけれど、そうでないとなかなか見つけにくい。

なので、returnには括弧もつけれるけど、つけない書き方をオススメします。


かっこつけずに、行こう。




| 新しいページ | 編集 | 差分 | 編集履歴 | ページ名変更 | アップロード | 検索 | ページ一覧 | タグ | RSS | ご利用ガイド | 管理者に問合せ |
@wiki - 無料レンタルウィキサービス | プライバシーポリシー