2010年1月14日木曜日

【よくわかる!実践Cプログラミング】のお勉強~第1部 Part 1 ~

前回はVisualStudio2008ExpressEdition をインストールしました。今回から少しずつ読んで、書いて、実行していこうと思います。 うすうす気付いていますが、きっとこのC言語の始め方は普通の入り方ではないと思います。しかし、どうしても飽きっぽい自分には、このような非常に面白い本から入れば3日坊主も7日坊主ぐらいになるかと思い、始めてみました。

~はじめてのC言語~「VC++でCプログラムを書く方法」
ホントは、テキストエディタで書いて、コンパイルし、実行の手順でやっていきたいのですが、とりあえず慣れるために IDEとしてVisualStudio、VC++を入れました。そして、C言語として作るには、少し手順があるので復習します。
1.プロジェクトの新規作成で、「Win32 コンソールアプリケーション」を選択し、プロジェクト名を入力する。
2.「Win32 アプリケーションウィザード」の画面で、「追加のオプション」の □空のプロジェクトにチェック☑をつける。
3.ソリューションエクスプローラの「ソースファイル」を右クリックし、「追加」→「新しい項目」を選び、C++テンプレートを選択し、ファイル名の末尾、拡張子を必ず「.c」にし、最後に「追加」をクリックする。
まずは「Hello World」からやりました。なんだか、JAVAでもやった気がします。

#include
int main(void)
{
  printf("Hello World");
  return 0;
}
と、ここがスタートになりました。
これをビルドして、デバッグしてみたのですが、正常に実行されたかわからないw ので、ブレークポイントを入れて、処理が途中で止まるようにしました。また、ステップインで1行ずつ実行できますね。。。

~C言語マイスターズ~「if文は畏怖すべき条件判断の冷徹宰相」
if文の書式 >> if( 条件式 ) 成立時に実行する文 else 不成立時に実行する文
えー、、、条件式に「0」が来たら、「成立」で、それ以外は「不成立」になるってことです。なので、
if( a ) printf("成立") else printf("不成立");
これの「a」に、「0」が入れば、「成立」と出ます。

●関連項目
switch文:複数の条件に分岐できる。
三項演算子:式に限定すれば、if文と同じ機能。   ・・・?

~ライブラリ紳士録~「ニャオ!猫の力で?文字列合体「strcat」
C言語では文字列を小さな整数(char型)の配列として扱う。(なるほど。。。)
puts関数だと、最後に「改行」が入るので、strcat関数で文字列をコピー追加する。
#include
#include
int main(void)
{
char name[19] = "よくわかる!";
char rank[] = "C言語";
strcat(name,rank);
puts(name);
return 0;
}
と、このようになるそうです。連結して全角9文字、18バイトですが、文字列の最後に「¥0」のnullが1バイトつくそうです。なので19バイトです。これは注意ですね。

●関連項目
strcpy関数:文字列を上書き。連結ではない。
strncat関数:追加バイト数を指定できるstrcat関数の派生形。
_mbscat関数:マルチバイト文字(シフトJISなど)の文字列を合体。
wcscat関数:ワイド文字(Unicodeなど)の文字列を合体。

~ライブラリ紳士録~「無駄に太るな,スリムに出力「puts」」
printf関数とputs関数で、似てるようだが違うので、使い分けもそうだし、メモリの消費も気をつけましょうといったことで、
puts関数とは・・・、引数の文字列と改行を標準出力に出力する。書き込みエラー発生時はEOFを返し、そうでない場合は負ではない値(←?)を返す。
と、実にシンプル・・・、負ではない値が気になるけど・・・。
printf関数のように、変数に入った整数を文字列に埋め込んで出力するような複雑な機能はありません・・・なるほど。そんなことができるのね。
puts関数の方が、より高速に処理できる、実行ファイルが小さい、必要メモリが少ない、そうです。実際に、比較してみました。VC++の設定は以下を変更しました。
・ビルドのターゲットをDebug からRelease に。
・構成プロパティを開き、コード生成 の ランタイムライブラリ を「マルチスレッド(/MT)」に。
・リビルドする。
すると、Release というフォルダに実行ファイルが生成されます。これをputs とpringf で書き換えて比較してみました。

●関連項目
fputs関数:fopenで開いたストリームなどに書き込みます。
gets関数:標準入力から1行入力します。

~C言語クイズ~「ifの迷宮」
リスト8から
#include
int main(void)
{
int a = 1, b = 0;
if( a ) if( b ) puts("Alfa") else puts("Bravo");
return 0;
}

これで、アルファとブラヴォのどちらが表示されるのか?
んー、1つ目のif が真で、2番目のif に行くけど、else に入ってBravo か?むむー、もしくは、、、つーか、1つ目と2つ目の見分けってするのか?うーん、疑問だ。

0 件のコメント:

コメントを投稿