C言語入門
最初はちょっと難しい話が続きますが, 実際にプログラムを書いているうちに理解できると思います. 小難しい話は読みたくないという方は,適当に読み流して後で戻ってきてください.
C言語の構成
多くの入門書では,いきなり簡単なプログラムを作成しますが,ここでは少しだけ文法の話をしてみます. すぐに全てが分かる必要はありませんが, 基本的なことですので分からなくなったらここを見るようにしてください.
まず,C言語でプログラムを書く上で重要となる概念を書いておきます.
予約語
予約語とは,C言語の文法で決められている単語で,自分で使う変数や関数名として つかえない単語です. つまり,この予約語を使ってプログラムを書くわけです.
いきなりですが,C言語の全ての予約語を書きます. (抜けてるものがあれば指摘してください)
auto,break,case,char,const,continue,default,do,
double,else,enum,extern,float,for,goto,if,
int,long,register,return,short,signed,sizeof,static,
struct,switch,typedef,union,unsigned,void,volatile,while
たったこれだけです. これがC言語のプログラムで使われる単語の全てです.
変数
変数というのは,数値などのデータを入れておく入れ物です. 数学で出てくる変数だと思ってもらっていいと思います.
変数には英数字で出来た名前を付けられます.先頭は数字ではいけません. 一文字だけでなく,複数文字の長い名前をつけることができます. 「abc」と書いてあれば「abc」ではなくて「abc」という名前の一つの変数です. つまり,掛け算の記号は省略できません.
関数
C言語で扱う関数は数学で扱う関数と違い,数字以外も扱えます. 関数ではなくて「機能(=function)」と言った方がいいかもしれません. 数学の関数が数字しか扱えないといったら,数学者に怒られそうですが… 少なくとも,高校や大学の工学部で出でくる関数は数字を扱うものがほとんどです.
関数が扱うのは,数字はもちろん,文字だったり画像だったりします. すみません.ちょっと嘘を書きました. 本質的には数字しか扱えません.そもそもコンピュータが数字以外を扱えません. 文字も画像も音声も数字で構成されています.
さらに「値を返さない関数」も存在します. そういった関数は,
y=f(x);
というような書き方はしません. ただ単に
f(x);
という書き方をします. 計算結果を返さない関数に何の意味があるのかといえば,そういう関数の多くは コンピュータにつながった機器を制御するものだからです. 画面に文字を表示したり,ファイルにデータを保存したりするのも関数です. ほかにも,特定の場所に保存されたデータを操作する関数も値を返さないかもしれません. あと,一定時間何もしないで待つ関数などもあります.
式
C言語でいう「式」とは,数値,変数,関数等やそれらを演算子で結んだものです.
- 数値 123とか3.141592 (これは説明しなくて大丈夫でしょう)
- 変数 「x」とか「y」とか「abc」等 (複数文字でも一つの変数です)
- 関数 sin(~)やprintf(~) (printfはC言語で使う関数です)
- 演算子 +,-,*,/,=,(~)等 (まだまだたくさんあります)
例:
- a=(b+c)d (b+c)dをaに代入する
- a==b aとbが等しい
- x<y xがyより小さい
- 123 これも「123」という数字そのものを表す式
C言語での「=」は代入演算子です. そのため「x=x+1」というような書き方も可能で, この場合「xを現在のxより1増やす」という動作になります. つまり,xが1だったなら,この式の後ではxは2になっています. 「(,)」も計算順序を決める役割を持った演算子ということになっています.
次の「a==b」や「x<y」は比較演算子を使った例です. 代入演算子と違って,変数の中身が変化するわけではありません. その式の値は「真」もしくは「偽」です. 式が成り立てば「真」,成り立たなければ「偽」というのは,数学でも出てきますね. 学校では少ししかやらないので忘れている人も多いかもしれませんが, これは数学の論理学という分野でプログラムを書く上では重要なものです.
(メモ:実を言うと「真=1,偽=0」なのでx=(a==b)とすれば,xに0か1が代入されます)
「式の値」という言葉が出てきましたが,その式を計算したらどういう値になるかを 言っています.「1+5*3」という式の値は「16」です.
文
基本的には,式の後に「;」(セミコロン)を付けたものが「文」となります.
いくつかの文を「{」~「}」で囲むと「複文」と言って複数の文をまとめることが出来ます. これの使い方は次の制御構造で出てきます.
例:
- a = 1+2+3+4;
- asin(x)+bcos(y);
制御構造
制御構造とは,プログラムの流れを制御するための文です. 処理を繰り返したり,ある条件が成り立つときだけ実行したりするためのものです.
if,else,for,whileなどがあります.
個別の説明は後で説明します.
コメント
「/」で始まって「/」で終わる範囲がC言語のコメントです. コメントはプログラムの動作に影響を与えないので,好きなことが書けます.
本当はC言語ではなくてC++の機能ですが,「//」から始まる行もコメントとみなす コンパイラも多いです.
int a;
/*
ここはコメントなので,色々かけます.
*/
a=10; // aに10を代入
コメントは空白と同一視されます.
空白・インデント
C言語はフリースタイルの言語です. 「フリースタイル」というのは,好きな位置にスペースや改行やコメントを入れられるということです. ただし,一つの単語を分割すると別の単語になってしまうので, 変数名や関数名や予約語などの単語を途中で分割してはいけません.
好きなところにスペースが入れられますが,好き勝手に書くと他の人が読めなくなるので, 他のプログラムを参考にしながら書き方を身に着けましょう. いくつかのメジャーなスタイルが存在します.
プログラムを書いてみる
やっとです. さて,下のプログラムを実行するとどうなるでしょうか.
int main()
{
return 0;
}
このとおりに書いて,コンパイルして実行してください.
何もおきませんね. 実は,何もしないプログラムでした.
最初の「int main()」の行は関数宣言です. プログラムを起動すると「main」という関数が実行されるようになっています. つまり,main関数の動作を決めることが,プログラムを書くということです.
「{」の行から,「}」の行までが関数の中身です. 関数の中身は上の行から順番に実行されていきます. とは言っても,今回は1行しかありませんね.
return文があるとそこで関数が終了します.数字の「0」が付いていますが, その関数が返す値を意味します. main関数が終了した時点でプログラムも終了してしまいますが, ここで返した数字は,他のプログラムからこのプログラムを呼び出した時に, 呼び出した側で使うことができます.
定番のプログラム
何もしないプログラムを書いても面白くなかったかもしれないので, 次は文字を表示してみます.
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
実行してみましょう.「Hello world!」と表示されましたか? 表示されないなら,間違いが無いか確認しましょう.
なにやら色々と増えていますね. 「#include <stdio.h>」というのは,printfという関数を使えるようにするための行です. stdio.hというファイルの中でprintf等の関数が定義されています (C言語というのは,定義されていない関数は使えないのです).
頭が「#」で始まる行は,C言語の文法ではなくて「プリプロセッサ」というものですが, 後で詳しく説明します.ちなみに,includeはファイルをそこに埋め込むという意味です.
で,新しく出てきた関数ですが,printfというのがありますね. これは「画面に文字列を出力する関数」です. もちろん,文字を書き換えれば好きなメッセージを表示することが出来ます.
C言語はフリースタイルだと書きました.ためしに変なところにコメントや 空白や改行を入れてみます.
#include <stdio.h>
/* あああ */ int main(
) // AAAAA
{printf(
"Hello world!\n" /* いいい */); return 0
; }
上のプログラムはこんな風に書いても正常に実行されます. 読みにくいだけですが.
ちょっとした小話
C言語は単純で簡単な部類の言語です. ここでいう「簡単」はプログラミング言語が簡単なのであって, 残念ながらそれで何か作るのが簡単なわけではりません. JavaとかPerlとかもっと高機能な言語を使えば,もっと楽にプログラムが書けたりもします.
ただ,C言語でプログラムが書けると何でもできます. それは,C言語というのは,UNIXというOS(オペレーティングシステム)を開発するために 考え出された言語だからです. OSから普通のアプリケーションまで,多くのプログラムがC言語で作られています.
C言語は1970年代にATA&Tベル研究所のカーニハンとリッチーによって開発されました. K&R(もちろんカーニハン&リッチーのこと)の「The C Programming Language」という本は有名です.
現在使われている多くのプログラミング言語がCから派生して作られました. そのため良く似た文法になっています. C言語さえ理解していれば,他の言語を勉強するのもそれほど大変ではありません.
この文書の履歴
- 2006-04-XX まだ未公開