文法の基礎と関数

超シンプルなC言語のサンプルコード

以下はVisual Studioの導入とテストの説明で使用したサンプルコードです。


#include <stdio.h>

int main()
{
    printf("Hello World");
    getchar();
}
Hello World

このコードを実行すると、コンソール画面(黒い背景に文字だけのウィンドウ)に「Hello World」と表示されます。
この状態で、キーボードのEnterキーを押すとプログラムは終了します。

実際にプログラムの動作を決めているのは5、6行目です。
それ以外の行は今はとりあえず無視してください
もちろん意味はあるのですが、単純にそういう決まりになっていると考えておいてください。

C言語は、基本的に上から順番に処理が実行されます。
このコードでは、まず5行目の処理が実行され、その終了後に6行目の処理が実行されます。
どちらの行でも関数というものを使用しています。

関数

関数(Function)は、特定の処理をひとまとめにしたものです。
C言語では最初から様々な機能を提供する関数が用意されています。

printf関数

5行目は画面に文字を表示する処理を行う行です。
これはprintf関数というものを実行しています。
printf関数はC言語に最初から用意されている関数で、標準入出力に文字を出力する関数です。
標準入出力とはコンソール画面の事です。

int printf(
 const char *format
 [, argument]
)
標準入出力に文字列formatを出力する。

printf関数の仕様と説明を載せましたが、今は理解しなくて構いません。
とりあえず「画面に文字列を表示するにはprintf関数を使う」ということです。

関数の実行と引数


printf("Hello World");

関数を使用するには、まず関数名を書き、すぐ後ろに丸括弧を書きます。
printf関数は文字列を表示するための関数なので、「何を表示するか」を指定する必要があります。
その文字列を丸括弧の中に記述します。

しかしコード中にそのまま文字列を書くと、プログラムを制御するワード(関数名など)と区別ができなくなります。
例えば、printf関数を使用して「printf」という文字列を表示したい場合、「関数名としてのprintfという文字列」なのか「画面に表示する文字列としてのprintfなのか」が区別できません。
その区別をつけるため、出力したい文字列はダブルクォーテーション(")で括ります。
文字列はダブルクォーテーションで括るというのはC言語の決まりです。
この辺のことは後々説明します。


//「printf」という文字列を出力したいとき
printf("printf");

//これはNG
printf(printf);

関数名の直後の丸括弧の中に指定する値を引数と言います。
関数は、引数で指定された値を利用して計算をしたり、画面に値を表示したりといった処理を行います。

今回は引数ひとつだけですが、二つ以上の引数を指定することもあります。
(次のページで説明します)

行の終端

最後に;(セミコロン)を書きます。
セミコロンは、行の終わりを意味します。
セミコロンを書かないと、コードを改行しても連続した行とみなされます。


printf("Hello World")
getchar();

上のコードは、以下のコードと同じ意味になります。


printf("Hello World")getchar();

このような書き方は文法上許されていないので、エラーになります。
反対に、


printf("Hello World");getchar();

このような書き方はOKです。
セミコロンがあるので、「printf」と「getchar」は別の行とみなされるからです。
ただ、見た目が分かりにくくなるので、普通はセミコロンの次は改行しましょう。

getchar関数

サンプルコードではprintf関数の次にgetchar関数を使用しています。

int getchar()
標準入出力から文字を読み取る。

これはコンソール上でキーボード入力された値を受け取る関数です。
この関数が実行されると「ユーザーからのキーの入力待ち」になり、実際にキー入力があるまでプログラムの実行が停止されます。
Enterキーでキー入力が終了し、次の処理に移ります。

実はこの関数は画面に文字を表示するためのプログラムでは必要のない関数です。
しかしこの関数をコードの最後に書いておかないと、プログラムの実行結果を確認することができません。

C言語のプログラムは基本的にコードを上から順に実行していき、コードの末尾に達するとプログラムの終了となります。
プログラムが終了するとコンソール画面(黒いウィンドウ)も閉じてしまうので、今回のように一瞬で処理が終了するようなコードでは画面に出力された文字を確認する暇がありません。

これを回避するためにコードの最後にgetchar関数を記述しておきます。
getchar関数が実行されると「ユーザーの入力待ち」になりプログラムが一時停止されるので、画面を確認できるようになります。

試しにgetchar関数の行を削除してビルドしてみましょう。
一瞬何かが表示されるのは確認できても、まともに文字を読む暇はないと思います。

Visual Studioの設定を変更することで、プログラムを終了しても何かキーを押下するまでウィンドウを閉じないようにすることもできます。
(その場合はgetchar関数は必要なくなります)
このサイトではVisual Studioの設定に関わらずに(あるいはVisual Studio以外の環境でも)プログラムの処理を確認できるように、コードの最後にgetchar関数を使用することにします。

引数のない関数

getchar関数には引数はありません。
しかし引数がないからといって最後の丸括弧を省略することはできません。
関数名直後の丸括弧は、その関数を実行するという意味があります。

getchar関数は、何かキーボードから入力があるとその値を受け取って次の行へと進みます。
今回は「入力待機」のためだけにgetchar関数を利用しており、入力された文字は必要がないので何も処理をしていません。
キーボード入力の受け取り方はまた別の機会に説明します。

このページのまとめ

  • コードは上から順番に実行される
  • 何かしらの命令を実行するには関数を使う
  • 関数は、引数を利用して何らかの処理を行う
  • 引数がない関数もある
  • 行の終わりにはセミコロンを書く
  • このページで説明していない行の意味については今は気にしなくていい

文章で説明すると長くなりますが、一気にすべてを理解しなくても構いません。
とりあえずサンプルコードを打ち込んでみて、動作を確認していくうちになんとなく理解できるようになってきます。