プログラミング言語といえばC言語といえるほど、Cは有名な言語です。現在では、C言語に「オブジェクト指向」という新しいプログラミングの考え方を取り入れた"C++"という言語もあります。WindowsやMacOS、UNIXなどはほとんどがCかC++で作られているそうです。
なぜそこまでCが一般的かというと、「コンピュータのかゆいところまで手が届く書き方ができる」からだと思います。つまり他の言語に比べ、自由度が高い言語だということです。ただし、その代わり、プログラミング初心者にとっては、なかなか理解しがたい考え方を持っています。なので、僕も最初と、「ポインタ」が出てきたところで苦労しました。まだまだ勉強中ですが、分かる範囲で書こうと思っています。
まず、画面に何か字を出すようなプログラムを作って見ましょう。
たとえば、「penguin factory」とコンソールに表示させて見ましょう。それには、以下のようなソースコードを打ちます。
#include <stdio.h>
int main(void){
printf("penguin factory\n");
return 0;
}
これを、たとえば「test.c」というファイル名のテキストファイルで保存します。(cygwinをお使いの方は、EUCで保存することを忘れずに!!)。
■これをコンパイルして、実行してみましょう!
Visual C++を使ってコンパイルする場合は、まず上記の「test.c」ファイルを作り、それをVisual
C++で開きます。次にメニューの「ビルド」-「コンパイル」(Ctrl+F7)を実行しコンパイルを行います。コンパイルが成功したら、結果が下の「アウトプットウインドウ」に表示されます。

次に、「ビルド」-「実行」(Ctrl+F5)で、リンクが行われ、プログラムが実行されます。実行されると、以下のように実行結果か表示されてきます。(ちなみに、Press any key to continueという表示はプログラムの実行が終了したことを示しています)

はい、ちゃんと「penguin factory」とでましたね。
さて、では「たかが文字を表示するのに、C言語は何でこんなにいろいろ打たなきゃならんのか!!」ということを説明しましょう。
■なぞの呪文「#include」
まず、1行目の「#include <stdio.h>」を説明します。これは、後に使用する、文字(列)を表示する関数であるprintfを利用可能にするものです。具体的には、stdio.h
というヘッダファイルをこのプログラムに取り込んで(インクルードして)、使えるようにしているということです。試しに、これを書かないでコンパイルしてみてください。多分コンパイラが以下のように怒ってきます。
警告: 関数 'printf' は定義されていません。int 型の値を返す外部関数と見なします。 |
つまり、画面に文字を表示する関数 printf
が、どんな働きをするのか、それが stdio.h
には書かれているのです。そいつを指定してやらないと、コンパイラは「なんか
printf
とかいう知らない関数使ってるみたいだけど、何これ??
まあ取り合えず、関数としては認めてやるけど」と考えます。
stdio.h は、そのほかにもいろいろな機能を持っています。なので、「#include <stdio.h>」は、プログラムの最初に書いておくべきものなのです。
■メイン関数「int main(void){}」と、最後の「return 0;」について
C言語において、main関数は必須です。これがないと、絶対動きません。C言語はすべてmain関数から仕事を始めるからです。mainに限らず、Cの関数は、以下のように構成してあります。
[関数の返り値の型] 関数名([関数の引数の型])
{ (この中に、その関数がする仕事を書く)
}
で、main関数は、「関数の返り値の型は int(整数)
型」で、「関数名は main」、「関数の引数の型は今回は使わないので
void」、「{}の中の仕事は、とある文字を表示する」というように説明できます。
ちなみに、関数の返り値というのは、その関数が仕事をし終わった後に、呼び出した「モノ」にどんなものを返すのかということです。mainを呼び出したのは、(あなたではなくて、一応)オペレーティングシステム(Windowsとかね)なので、mainは「ちゃんと正常に仕事をこなしたよ!」って意味で、整数の
0 を返します。これが、最後のほうにある「return 0;」の意味です。
また、関数の引数(ひきすう)とは、関数を呼び出すときに、「こんな値で仕事をしてくれませんか??」という指示の部分です。main関数は、別に特に指示なんかもらう必要はないので、今回は
void (ボイドと読みます)と打っておきます。
というわけで、「int
main(void){}」というように書くことになります。さらに、カッコ{}の中の最後の行には「return 0;」と書かねばならないのです。
(*) 初心者向けの本では、「int
main(void){}」と「return 0;」を簡略化して、「main(){}」だけでよい!としているものもあります(実際動いてしまいます^^)が、あとあと、よく分からなくなりますので、はじめから説明しておきました。
■文字を表示する関数「printf("penguin
factory\n");」と、最後の変な文字「\n」
文字をコマンドラインに表示するには、printf()
という関数を用いますね。で、printf()
に「どんな文字を画面に出して欲しいのか」という要求を突きつけてあげねばなりません。それが、後半のカッコ内「"penguin
factory\n"」です。これは、printf
の引数であります。
printf
に文字を画面に表示させたい渡したい場合は、その文字を
" "(ダブルクオーテーション)
で囲んでやります。
ところで、「"penguin
factory\n"」の最後にある「\n」はなんでしょう??日本円でn円??ではありません。これは改行を指示している制御文字です。
事実、この「\n」を入れないでコンパイルしてみてください。そうすると、プログラムが終了したのに、画面では行が同じままという現象が起きます。これは、あまり美しくはありません。ですので、このように改行を活用して、コマンドラインの画面を見やすく表示させる工夫が必要となってきます。
たとえば、
printf("penguin \n
fac\ntory\n");
などとして実行してみましょう。以下のように、指示通り改行が入っていますね。
他にも、タブを挿入する「\t」などがあります。これらは、実行結果を見やすくするために、使えそうですね。
■気になっていたんだけど、命令の最後に「;」つけるのはナゼ??
命令文(printf とか return
のこと)の最後には、必ず「;」(セミコロン)をつけます。これはC言語の重要な決まりです。
実は、Cのコンパイラは、私達がソースコードに打っている改行とかスペースを、全部無視してプログラムを作っています!!
つまり、私達は自由な場所に改行を入れたり、スペースを入れたりして、見やすいソースコードが書けるのです。しかし、逆にそれらを無視しすぎるあまり、コンパイラは「どこからどこまでが、ひとつの命令なのか分からない」のです。人間なら、どこからどこまでか
printf
の命令なのか、くらいはすぐ分かりますが、コンパイラは律儀な奴なので、ちゃんと「ここでおわりだよ」って意味で「;」を打たなくてはなりません。
面倒ですが、忘れずに打ちましょう。これは、良くあるコンパイルエラーの大きな原因のひとつです。
■ソースコードは、自由な場所に改行を入れたり、スペースを入れたりできる
文字を表示する例題は、こんなソースコードでした。
#include <stdio.h>
int main(void){
printf("penguin factory\n");
return 0;
}
先ほども書いたとおり、Cではかなり自由度の高いソースコードが書けます。つまり、自由な場所に改行を入れたり消したりできます。以下のような例も、ちゃんと動きます。
【例1】
#include <stdio.h>
int main(void)
{
printf("penguin factory\n");
return 0;
}
【例2】
#include <stdio.h>
int main(void){
printf("penguin factory\n");
return 0;
}
【例3】
#include <stdio.h>
int main(void){printf("penguin factory\n");return 0;}
さて、どれが見やすいでしょうか??さすがに、【例3】見たいな書き方をすると、後で直したい場合も分かりにくいし、友達を失うことになるかもしれませんよ・・・。
■コメントを書く
プログラムを書いていくと、「ここでは何をしているのか」とか、後で見たときに思い出しやすいように、コメントを書きたくなります。しかし、そのまま日本語でソースコードに説明を入れたりすると、コンパイラに『変な文字入れるなコラ!』と怒られてしまいます。なので、Cには、ある範囲の文字をコンパイラから無視させる「コメントアウト」という方法があります。この方法は2通りありますので、好きなほうを使ってください。(コメントアウトの部分は緑で示しています)
#include <stdio.h>
int main(void){
/*
この範囲はコメントアウト */
printf("penguin factory\n"); //
ここから改行するまでコメントアウト
return 0;
}
このように、/* 〜 */ で囲んだり、//
以降をコメントアウトすることもできます。これを利用して、プログラムに分かりやすい説明を入れることができます。
/*
文字を表示するプログラム ○月×日
誰が作った */
#include <stdio.h>
// stdio.hをインクルード.
int main(void){
// main関数は「
printf("penguin factory\n"); //
文字を表示
return 0;
// 0
を返す
}
// という仕事をする.
はい、これで見やすいですね。
コメントアウトは、一時的に命令を無効にしたいときにも使えますので、覚えておいてください。