プログラミング C 02 - Soft Forum P.C. Club

これから, C言語の説明をしていきます. 超退屈なので, すごいつかみだけ.

コンパイル(Compile)

Computerは0と1で動きます. ものすごいつかみどころのない説明ですが, ほんとに動きます. で, 01を人間が書いていたらちょう大変なので, 人間が読みやすい形式で書いて, これをプログラムが翻訳するという形式が取られます. この翻訳前のものがソースコードで, これを翻訳(コンパイル)することで機械語に変換し, 実行できるようにします.

この翻訳前の人間にわかりやすい形式の書き方はプログラミング言語と呼ばれ, この一形式がC言語です. 実際他にもいろいろあります.(C++, D, Golang, Fortran, COBOL, などなど)

プリプロセッサ(preprocessor)

先ほどのHello Worldの解説を行いつつ, C言語の説明を始めていきます.

#include <stdio.h>

int main(int argc, char **argv) {
  printf("Hello World\n");
  return 0;
}

1行目の

#include <stdio.h>

はプリプロセッサというものが解釈します. pre-processor, つまりコンパイラーの前に処理するものです.

例えば, ある日ものすごい時間をかけてすばらしいプログラムの部品を書いたとします. これを使えば一発であれこれできる, めんどくさいことは全部この中で面倒見てくれるみたいなものです. さて別のプログラムを書いているときに, それが使いたくなったらどうするのでしょうか? いちいちコピー&ペーストしますか?

そんな面倒なことをしないように, include 命令があります. include はあるファイルの中身を読み込み, そこに展開します. これによってコピーしてくるような手間をせずプログラムを使うことができます.

さらにすばらしいことに, C言語には歴史があって, ものすごい賢いプログラマが, いろんな問題が起きないように考え抜かれて作られた便利な部品をこのinclude命令で使うことができます.

この場合, Cの標準ライブラリ(このような便利な関数を別の人が使えるようにまとめたものをライブラリといいます. プログラムの図書館ですね)であるstdioを読み込んでいます. Standard Input / Outputの略です. この瞬間から, 自分のプログラムにstdioの便利関数を余すところなく使えるようになります.

文(statement)

プログラムの命令の区切り区切りを文(statement)といいます. ステイトメントっていう人多いですね.

例えば,

printf("Test");

printf("%d\n", 10 * 10);

というふうなものです. 文は必ずセミコロン, ";"で終了します.

コメント(comment)

コメントというのは, プログラム中で無視される部分をさします. 例えばちょっと変更したり, 後で見たらなんで荘やったのか忘れてそうな難しいところに, commmentを書いておくと読みやすくなったりします. 人によっては「コメントを書くのは邪道. 読めばわかるような美しいソースコードを書ければコメントなんてものは...lなんていう肩もいますが, まあ概ねcommentは有用です.

書き方としては一行コメントと, 複数行コメントがC言語には存在します.

#include <stdio.h>

int main(int argc, char **argv) {
  // これが一行コメント
  printf("Hello World\n");

  /*
     これが複数行コメント
  */
  printf("Hello World\n");
  return 0;
}

一行コメントは//が始まってから行末まで, 複数行コメントは/*から*/までがコメントになります.

stdio: printf

print

printf("Hello World\n");

で, stdioの関数であるprintfに文字列を渡して呼び出しています.

関数とは, 数学のアレ由来の名前です. つまり, 引数(parameter)を与えて, 値が帰ってくる(返り値)ものです.

printf は引数に渡された文字を, 端末に印字(print)します.

実はLinuxには詳細を調べる機能がもともと付いています. 以下のコマンドを打ってみてください.

man 3 printf

manはmanualの頭3文字です.

これを使えば, もう自由に文字を端末に表示できるわけです.

format

printするならprint関数でいいじゃんというところがわざわざprintfとfが付いているのは, f = formatだからです. printfはmanコマンドで見ると以下のように定義されています.

int printf(const char *format, ...);

これは関数の形を意味しています. printfはこんな関数ですよというものです. えげつない用語で, 「関数プロトタイプ」といったりします. この場合はconst char *formatと, 何かすき放題引数を取り, intを返してくる関数であるということです.

先ほどの呼び出しでは,

printf("Hello World\n");

ですから, const char* formatが"Hello World\n"で, 返り値のintは無視して捨てています.

format, つまり書式を指定してみましょう.

#include <stdio.h>

int main(int argc, char **argv) {
  printf("%s", "Hello World\n");
  return 0;
}

書式は%記号の後一文字で表します. %sはstring, つまり文字列です. そして, %の出てきた順番に引数の文字が代入されていって整えられ, それが表示されます. この場合は, %sのところに"Hello World\n"が代入され, "Hello World\n"という文字がprintされます.

文字列の豆知識

意外と知られていないのですが, C言語では連続した文字列リテラルは連結されて一つのリテラルになります. リテラルって何だよって思った方,

"Hello World\n"

これが文字列リテラルです. これが面白くて,

printf("%s", "Hello" " " "World" "\n");

は先ほどとまったく同じ意味になります. カンマで区切ってないので文字列リテラルが連続しており, すべて連結されているのです. このため, 上のものは,

printf("%s", "Hello World\n");

とまったく同じ意味です.

これを利用すると, きれいに書けることがあります. ここで急に2年の情報工学の問題をとってきます.

次のような模様を表示するプログラムを作成せよ. % ./a.out
##          ##
#  ##    ##  #
#    ####    #
#    ####    #
#  ##    ##  #
##          ##

をこうかくときれいな感じです.

#include <stdio.h>

int main(int argc, char **argv) {
  printf("%s", "##          ##\n"
               "#  ##    ##  #\n"
               "#    ####    #\n"
               "#    ####    #\n"
               "#  ##    ##  #\n"
               "##          ##\n");
  return 0;
}

その他のformat

man 3 printf

すると下のほうにずらずらずらっとformatがたくさん出てきます. 実際こういうのは今すぐ覚えるほどのものではなく, 使いたいときにどういう風に調べるかがわかっているかが重要です.

とりあえず, %d, %x, %cを紹介しておきます.

#include <stdio.h>

int main(int argc, char **argv) {
  printf("%d : %x : %s : %c\n",
         100, 255, "test", 'A');
  return 0;
}

たくさんのformat指定子(%なんちゃら)を書いておくと, 引数の値が順番に渡されて埋め込まれていきます. ここでは%dに100, %xに255, %sに"test", %cに'A'ですね.

dはdecimalのd, xはhexのx, sはstringのs, cはcharacterのcです.

注意として, "test"はdouble quoteなのに対し, 'A'はsingle quoteなのに注意してください. "なんちゃら"は文字列, 'A'は文字を表します. C言語では文字と文字列は別物です.

制御文字(escape sequence)

すごく適当に

"test\n"

とか書いてしまっていて申し訳ないですが, '\n'はエスケープシーケンスと呼ばれるものです. 制御文字とも言われます. これは, 印字できない文字を表すやり方です.

例えば, '\n'は改行文字です. これが印字(print)されると改行されます. 試しに\nを取り除いてみればなるほどという感じになるかも!!

Soft Forum P.C. Club