C言語プログラミングの初歩

準備

注意:インストール作業には少々時間がかかるので、下記の作業は授業開始時までに各自行っておくこと。

まずやってみよう、話はそれからだ

  1. ホームディレクトリに作業用のディレクトリを作成する。名前は何でもよいが、とりあえずc_langとでもしておこう。
  2. テキストエディタでhello.cという名前でファイルを作成する。
    • VS Codeの場合、まず左上のエクスプローラーアイコンをクリックし(図の1)、出てきたメニューから「フォルダを開く」をクリックして(図の2)作業用ディレクトリを選択しておく。

      ウィンドウ左側に「エクスプローラー」という欄が出るので、先ほど選択したディレクトリ(例ではc_lang)の隣にあるファイルを追加するアイコン(図の3)をクリックする。下にファイル名の入力欄が出るので作りたいファイル名を指定する(図の4、今回はhello.c)。

    • Emacsの場合、C-x C-f でファイル名を指定。作業用ディレクトリも指定する必要があることに注意。例えば~/c_langにhello.cを作成する場合、ファイル名の指定は~/c_lang/hello.cとなる(C-x C-fを押した時点で~/までは自動入力されている)。
  3. 次のプログラムを入力する。\はキーボード上の¥で入力できる。2行目の学生証番号と名前のところは自分の番号と名前にすること。入力モードは英数モードにすること。空白の部分はスペースかTabキーを使う(その他の注意は教科書p.6も参照)。
    なお、エディタの支援機能により、{や(を入力すると対応する}や)が自動入力されたり(VS Codeの場合)、{を入力した次の行の位置が自動的に右にずれる(VS Code, Emacs共通)。気にせず入力を進めればよい。
/*****
      g123456 Mitsuru Minakuchi
*****/
#include <stdio.h> int main() { printf("Hello World!\n"); return 0; }
  1. ファイルを保存する。
  2. ターミナルを開く。
  3. hello.cを作成した作業用ディレクトリに移動する(cdコマンド)。
  4. 次のコマンドを実行する。

gcc -o hello hello.c

  1. 【エラーメッセージが表示された場合】
    3に戻る。ほとんどの場合、hello.cの内容が3.と違っている箇所があることが原因。間違ってないかよく確認しよう。(エラーメッセージが間違いを探すヒントになっていることがある)
    最初は何か間違っていてエラーメッセージが出るのが普通だから気にせず直していこう。

    【何も表示されなかった場合】
    正しくコマンドが実行できたようなので、helloというファイルが出来ていることを確認する(lsコマンド)。また、helloがどのようなファイルかを確認する(fileコマンド)。
  2. 次のコマンドを実行する。Hello World!と表示されたらOK。

./hello

プログラムとは何か

教科書1.1節参照。

プログラミング基本用語 その1

ソースプログラム source program
プログラミング言語で書かれたプログラム。単に「プログラム」と呼ぶと実行できるファイルと区別が付かなくなるので「ソース」を付けて呼ぶ。「ソース」「ソースコード」「ソースファイル」などと呼ばれることもある。
上記の例ではhello.cがソースプログラム。
C言語のソースプログラムは必ず.cの拡張子を付ける。

コーディング coding
ソースプログラムを作成すること。テキストエディタなら何でもよいが、ソースを書くのに便利なEmacsやviがよく使われる。

コンパイル compile
ソースプログラム(=人間が理解できる形式)を実行ファイル(=コンピュータが理解できる形式)に変換すること。
C言語の場合、コンパイル後にリンクという作業が必要だが、これらをまとめて単にコンパイルと言ってしまうことが多い。

コンパイラ compiler
コンパイルするためのプログラム。gccなど。

実行ファイル executable file
コンピュータがそのまま実行することのできるプログラム。ソースプログラムをコンパイルすることで作られる。実行方法は他のコマンドと同じ。
上記の例ではhelloが実行ファイル。

コンパイルエラー compile error
ソースプログラムの不備によりコンパイルできないこと。不備の原因はいろいろあるが、ほとんどがタイプミスである。
コンパイルエラーの場合、コンパイラはエラーメッセージを表示するので、ソースプログラムの不備を特定する参考になる。

コンパイルエラー対処法

心構えとして、ソースプログラムを作成してそのままコンパイルが通ることは奇跡である、くらいに思っておいた方が良い。数行のプログラムを作成すると必ず間違っているという話も昔からある。

プログラムの間違いを直すためにはコンパイラの力を借りるのが良い。文法の間違いはコンパイラが簡単に見つけてくれる。

C言語のコンパイラはあまり役に立つエラーメッセージを出さないことも多いが……
なお、文法の間違いでなく、文法上は間違いではないが実行させると意図したとおりにならないような間違いはコンパイラは発見できないことに注意。

練習
上記のプログラムで、;や"や)を削除したり、printfのスペルを間違えてみたときにどのようなエラーメッセージが表示されるか確認せよ。

コンパイラのエラーメッセージは残念ながら英語であるが、パタンは決まっているので、どのような間違いをしたらどのようなエラーがでるかを注意深く見ておくこと。

一度に沢山のエラーメッセージが出た場合は、まず最初の1個だけ見て、指摘されている行(およびその直前)をチェックし、間違いが見つかったら修正してみる。1つの間違いが沢山のエラーを誘発している場合がある。直してコンパイルして、またエラーが出たら直して、を繰り返せば良い。

プログラミング基本用語 その2

コメント comment (教科書 p.21)
ソースプログラム中で、コンパイラが解釈しないように指定してある部分のこと。つまり人間用のメモ書き。
C言語の場合、/*と*/で囲まれた部分、および//より右側の1行分がコメントとして扱われる。

プリプロセッサ命令 (教科書 p.22〜23)
コンパイルする際に、まずプリプロセッサというプログラムにより前処理が行われる。このプリプロセッサに対して指示を行うための行。C言語ではソースコードの冒頭部に#で始まる行で指定する。#includeは<>内で指定したファイルをここに読み込め、という命令。;が最後に付かないことに注意。
stdio.hは標準入出力(STanDard I/O)を使うためのヘッダファイル(ヘッダファイルの詳細はここでは省略)。

とりあえず現時点ではおまじないとして
#include <stdio.h>
は必ず書いておくもの、と覚えておけば良い。

main関数 (教科書p.17〜18)
プログラムを実行する際のスタート地点となる関数。C言語ではソースコード全体でmain関数は1つだけ存在していなければならない。

mainの後の()は関数であることを示す記法。mainの前のintはmain関数がint型(整数型)の値を返すことを示しているが省略可能。関数の範囲は{から}までとなる。

printf関数 (教科書p.24〜25)
標準出力に文字列を出力(表示)する関数。上記の例では文字列("と"で囲まれた文字)をそのまま表示させている。

練習:表示されるメッセージをHello World!から違うものに変えてみよう。

return文
関数を終了して値を返すことを命令する文。main関数はプログラムの入り口なので、return文が実行されるとプログラムが終了することになる。正常にプログラムが終了したことを通知するために、慣例として0を返す(正常でない場合は別の値を返す)。
return文の代わりに、
exit(0);
と、プログラムを終了させるためのexit関数を使うこともある(この場合はstdlib.hもインクルードする必要がある)。

実行文
プログラムを実行する単位。文の最後には;(セミコロン)を必ず付ける。

関数 function
プログラムの構成単位。プログラムを理解しやすくする、同じ処理を使い回す、などの目的で作られる。printfやexitのように汎用の関数として提供されているものもある。

本演習では自分で関数を作る方法までは扱わない。基礎プログラミング演習IIで扱う予定。

その他

作業用ディレクトリに注意

最初の説明で作業用ディレクトリを作成して、そのディレクトリでソースファイルを作成したりコンパイルするように説明した。作業用ディレクトリを作成する理由は、単にホームディレクトリに沢山のファイルを置くと整理ができなくなって困るからである。

慣れないうちは、作業用ディレクトリの存在を忘れたり、場所を間違うというミスをしてしまいがちである。例えば、Emacsで新しいソースファイルを作成するときに、C-x C-fをタイプすると初期状態としてホームディレクトリ~/を指定してくる。ここで作業用ディレクトリを指定し忘れて、ファイル名だけ入力するとホームディレクトリにファイルを作ることになる。作成し終わってターミナルでコンパイルしようとした時に、カレントディレクトリが作業用ディレクトリになっていると、先ほど作ったはずのソースファイルが存在しないことになる。

この場合、落ち着いてホームディレクトリに作成したソースファイルをカレントディレクトリに移動させればよい(例えば~/foo.cをカレントディレクトリに移動させるには、mv ~/foo.c ./ というコマンドになる)。

なお、プログラミングを続けていくと作業用ディレクトリも1つでは都合が悪くなるので、幾つかにわけていく方がよいかもしれない。以前書いたプログラムを後で開いて参考にすることもよくある。整理方法は人それぞれで絶対よいというやり方はないので、自分なりに探しやすいように工夫してみるとよいだろう。

実行時の./

プログラムを実行させる際に./helloとしているが、これは「カレントディレクトリにあるhello」という意味である(.はカレントディレクトリを表す)。helloだけではダメな理由は、シェルはコマンドを入力すると環境変数PATHに指定してあるディレクトリを探しに行くが、macOSの初期設定ではPATHにカレントディレクトリが含まれていないため(間違いを防ぐため?)。設定でPATHに./を追記すると./と書かなくてもよくなる(方法は自分で調べてください)。

実行ファイル名

gccコマンドの-oオプションは作られる実行ファイル名を指定している。例えば

gcc -o bye hello.c

とすると、コンパイルしてできる実行ファイル名はbyeとなる。また、-oオプションを指定しなければ自動的にa.outとなる。違う名前だったり、どのソースコードでも同じa.outだと混乱してしまうので、原則的にソースコードの拡張子よりも前の名前と同じにしておくのがよいだろう。

大文字と小文字

C言語のソースコードでは大文字と小文字は別物として扱われるので注意。

全角文字

一般的には、C言語のソースコードではいわゆる全角文字は基本的に使えない。コメントと文字列("と"で囲まれた部分)は使うことができる。それ以外の場所に全角文字が書かれているとコンパイルエラーとなる。

表示されない全角スペース、半角英数字と字形が同じ全角英数字は特に注意。

練習:先ほどのプログラムに全角文字を入れてコンパイルし、エラーメッセージを確認しよう。

現在のOS Xのgccは全角スペースは警告 warning を出すだけで、普通のスペースやタブのような空白文字として扱い、コンパイルは通すようになっている。しかし、古いコンパイラではエラー error となってコンパイルが通らないので注意しよう。

現段階では日本語を扱うプログラムを作成する必要は無いので、間違いを減らすためにもプログラミングする際には日本語入力モードに切り替えないようにすればよい。

文字列と\n (教科書p.24〜28)

C言語では文字列を指定するためには"(ダブルクォーテーションマーク)で囲む。
文字列中、\と文字の組み合わせで特殊な指定を行う(エスケープシーケンス escape sequence)。
\nは改行を指定する記法である。他、文字列中で"を使いたい場合は\"のように書く。\自体を使いたい場合は\\と書く。

\と¥

元々は\であった文字コードに日本語環境では¥記号が割り当てられているため、表示環境によっては¥と表示されたり、日本語キーボードでは¥になっている。さらにややこしいことに、Unicodeでは¥という記号が\とは別に用意されていて、これらは別の文字コードになっている。

書籍やWebページなどによっては¥と表記されているものもあるが、英数入力モードで¥キーを押して入る文字、と思っておけば良い。上記のUnicodeの問題のため日本語入力モードで¥と入力したり、\に変換したりすると見た目は同じでも別の文字コードになっている場合があるので注意。

統合開発環境

macOSではプログラムを開発するためのツールとしてXcodeが提供されている。Xcodeは統合開発環境と呼ばれるような、プログラム作成を支援する高度なツールであるが、本演習で扱うような初歩中の初歩的なプログラムを学習する上では強力すぎて「鶏を割くに焉んぞ牛刀を用いん」、つまり、そんなに凄いものを使っても振り回されるだけで本質的な勉強にならないので、プログラミング初心者のうちは使わないことを推奨する。

なお、.cの拡張子のファイルをFinder上でダブルクリックするとXcodeで開いてしまうので、Finderの設定で開くアプリをEmacs(あるいはお気に入りのエディタ)に変更しておくとよい。変更方法は過去の資料の「Finder上でC言語ソースプログラムを開く時の振る舞いの調整」の項を参照のこと。
(とは言えFinderを使っている時点でダメである。ターミナルとテキストエディタだけで作業すれば何も問題ない。)

プログラミングの手順おさらい

  1. ソースプログラムを作成する
  2. コンパイルする
  3. コンパイルエラーが出たら1に戻って修正する
  4. 実行して意図したとおりに実行できるか確認する。意図したとおり実行されない場合は1に戻って修正する
  5. できあがり♪

ソースプログラムを書いただけではプログラムを作成したとは呼べない。意図通り実行できることを確認して初めて完成である。

もちろん、意図していなかった不具合が後からみつかることは日常茶飯事である。

確認課題

実行すると"I am 自分の名前(ローマ字表記でよい)."と表示されるプログラムmyname.cを作成せよ。
例:I am Mitsuru Minakuchi.
多少のアレンジはwelcomeである。

ソースプログラムの冒頭にはコメントで学生証番号と名前を記入しておくこと(こちらもローマ字表記で良い)。

出来上がったら確認してもらうこと。