Category Archives: C

EOF判定の注意点 | C言語 | プログラミング

C言語を勉強してきた中で私の致命的な思い違いシリーズの第三弾です。

今回は、練習で「標準入力からテキストを読み込んで行数をカウントする」という簡単なプログラムを作成した時のことです。標準入力で受けた内容を1バイトづつ読み込み、読み込んだ値が改行コードの場合はカウントアップして行数をカウントする内容のプログラムです。このプログラムの中で遭遇した初歩的なミスの話です。

続きを読む

暗黙の型変換と符号拡張とは? | C言語 | プログラミング

C言語を勉強してきた中で私の致命的な思い違いシリーズの第二弾です。

今回は、暗黙の型変換と符号拡張についてです。

次のコードの出力結果はどうなるでしょうか?

#include<stdio.h>

int main(){

	char c = -1;

	printf(" c %d,%x,%dn",sizeof(c),c,c);

	return 0;
}

続きを読む

signed と unsigned の違い | C言語 | プログラミング

通常の業務とは別にC言語を少しずつ勉強しています。C言語の鬼門と言われるポインタの動きもある程度理解し、構造体、線形リストやハッシュなどを使った簡単なプログラムを書けるようになりました。しかし、C言語としてかなり初歩的なことにも関わらず、今まであんまり意識せずにいたために致命的な思い違いをしたままだった事が幾つかあります。今回はその中でもかなり初歩的で、C言語を勉強した人の多くは同じような疑問を抱いたのではないかと思うことについて書きます。

皆さんは知ってましたか?C言語では必ずしも 100+100=200にならないって。

C言語の関連記事:

続きを読む

コンパイラの最適化によるデメリット | C言語 | プログラミング

以前C言語で、業務とはまったく関係のないお遊びプログラムを作っている時に、不可解な現象に悩まされました。 とある関数の内部で、呼び出し元の情報を書き換えて、関数を抜け出す時に本来の戻り先とは別の戻り先に制御を移すという、ちょっと変な処理を行うものです。 この時は何か目的があってプログラミングをしていたわけではなく、あまり深く考えもせずに作っていたので、最初はプログラムがバグってるのかな?と思っていました。 しかし、何をやってもコンパイル時に最適化オプションを付けた時だけ発生するので、気になり調査しました。

続きを読む

Linuxで読込中のファイル削除の影響 | C言語 | プログラミング

サーバーアプリケーションでは、特定のファイルに対し、読み書きが同時に発生することがある。同時書き込みを防止するためには書き込みロックを利用したり、書き込み中の読み込みを防止するためには読み込みロックを利用したりする。

しかし、一般的にロックを使用するとロックの取得待ちが発生することになり、環境によってはパフォーマンスの劣化が起きる。パフォーマンス重視の環境なら、できればロックは使用せずにいきたい。

では単純にロックを使用せず、読み込み中にファイルを削除するとどうなるのか?気になったので調べてみた。

続きを読む

NULL文字を含むときはstrcmp/strncmpを使わない | C言語 | プログラミング

弊社製品ラウンドアバウトが先日正式リリースされた。僕はラウンドアバウトの開発メンバーだったから、やっと完成したという大きな達成感がある。

しかし、その開発期間を思い起こしてみると、C言語特有の問題に直面し、実に苦労すること多かった。ラウンドアバウトはApacheモジュールなので開発言語はC言語となる。C言語で書くと実行速度が速くなるメリットもあるけど、文字列の概念がなかったり、ポインタによるアドレス指定が必要だったりと、プログラミングに注意が必要となる箇所も多い。

その内の一つがラウンドアバウトのキャッシュ機能を開発していた時に発見した不具合だ。ほとんどの画像ファイルは正しくキャッシュされるが、一部のファイルだけキャッシュされないという現象が発生。重要な機能だし、何が何でも解決しなければならない・・・。

あれこれ調べた挙句、特定の画像のみ、NULL文字に起因して発生する現象だと分かった。

C言語の関連記事:

続きを読む

コンパイラの最適化とは? | C言語 | プログラミング

最近のCコンパイラは、プログラマが意図して行った最適化よりも賢く、

最適なコードを生成するといいます。

昔「2の倍数で割るなら割り算使うより、シフト演算の方が早いからそう書け!」と言われたことがあります。確かに、div命令とsar命令ではクロック数はdiv命令の方が遥かに多かったと思いますが、実際のところそこまで意識する必要があるのでしょうか?

と、思いつつシフト演算を使っていたんですが、コンパイラの出力するコードを見る事はありませんでした。そこで実際にどの程度のものなのかを実験してみました。

 

続きを読む