C言語の基本

【これで分かる】C言語のおまじないって一体なんなの…?

トビタカ
トビタカ
本記事ではC言語で最初に立ちはだかる『おまじない』に関して解説しています。

誰も教えてくれない『C言語のおまじない』とは…?

 

C言語の勉強を始めたんだけど、もう挫折しそう…

 

C言語の勉強を頑張っているそこの『あなた』。

C言語って独特なクセがあるから、分かりづらいですよね。

とび助
とび助
いきなり『おまじない』がでてきて混乱してます…
トビタカ
トビタカ
気を落とさないでください!実は、頭のいい人ほどC言語の『おまじない』でつまづく傾向があるみたいですよ。

C言語を講じる際に,「#includeを記述することはおまじないです」というように本質を隠蔽して教えることがあるが、隠蔽して考えることが納得できない受講者がいるため、得てして指導に失敗する。(経験では、成績上位の受講者ほど、隠蔽された内容に疑問を感じてしまい、混乱を起こしているようである。)

引用:電気学会論文誌C-仮想シングルボードコンピュータx80を用いた学習環境の提案

 

 

混乱を招くきっかけとなる『C言語のおまじない』ですが、もう大丈夫です。

本記事を読めば『C言語のおまじない』の意味が確実にわかります。

おまじないの意味が分かると、C言語のコードが少しずつ書けるようになっていきますので、ぜひ参考にしてみてください。

とび助
とび助
絶対にわかるんですね?
トビタカ
トビタカ
すごいプレッシャーですが、わかっていただけると思います。

 

C言語の『おまじない』ってなんなの?

では、早速『おまじない』の説明でよく使われるプログラムのコードを見てみましょう。

#include<stdio.h>

int main(void){

	printf("ヤバいよ!ヤバいよ!\n");
	return 0;

}

 

とび助
とび助
HelloWorld!じゃないんですね…
トビタカ
トビタカ
なにか問題でも…?

 

このプログラムは画面に『ヤバイよ!ヤバイよ!』と表示させるプログラムです。

このプログラムには3つのおまじないが含まれています。

3つのおまじない
  1. #include<stdio.h>
  2. int main(void)
  3. return 0;

でもこの3つのおまじないって、明確な意味があるコードなんです。

トビタカ
トビタカ
1つずつご説明いたします!

『#include<stdio.h>』ってなに?

まずは『#include<stdio.h>』に関して、ご紹介していきます。

『#include<stdio.h>』の意味を一言にすると次のようになります。

stdio.hという説明書を読んで!

とび助
とび助
説明書ですか…?
トビタカ
トビタカ
はい。コンピュータに説明書を読ませているのです。

 

先ほどの『ヤバイよ!ヤバイよ!』を表示するプログラムのコードを思い出してください。

その中には画面に文字を表示させる『printf』というコードを使って、文字を表示させています。

この『printf』さえあれば、文字の表示ができそうな気がするのですが…

一見関係なさそうに見える『#include<stdio.h>』という文章を消してしまうと、プログラムは動かなくなってしまうのです。

トビタカ
トビタカ
つまり、include <stdio.h>がないと『printf』が使えなくなるんです。
とび助
とび助
えっ?でもさっきは動いていましたよね?
トビタカ
トビタカ
それは説明書を渡していたからなんですよ!

 

『printf』とは画面に文字を表示するコードです。

この1行のコードを書けば、コンピュータがいい感じに文章をディスプレイに表示してくれそうな気がしますよね?

でも、実際にはコンピュータは『printf』を次のようなコードに翻訳してから実行しているのです。(次のコードの内容を理解する必要はありません。)

int __printf (const char *format, ...){
	va_list arg;
	int done;
	va_start (arg, format);
	done = vfprintf (stdout, format, arg);
	va_end (arg);
	return done;
}

引用:GNUより抜粋(外部リンク)

トビタカ
トビタカ
つまり、『printf』は翻訳しないと使えないのです。
とび助
とび助
そうだったんですか…

 

『printf』を翻訳するためには、翻訳内容が書かれたファイルが必要になります。

そして、この翻訳内容が書かれているファイルが『stdio.h』というファイルになるんですね。

なので、『#include<stdio.h>』というコードを最初に書くことで、『stdio.h』というファイルをコンピュータに読み込ませます。

その結果、コンピュータは『printf』というコードを見つけたら、『stdio.h』に書かれた通りに翻訳して実行できる状態にしているのです。

とび助
とび助
説明書を読ませていたんですね!
トビタカ
トビタカ
入力や出力をする際には必ず#include <stdio.h>が必要だと覚えてくださいね!

#include<stdio.h>を書く場所はプログラムの先頭になります。

というのも、プログラムは先頭から読み込まれていくので、最初に説明書を渡しておかないと正しく翻訳できないからです。

stdioとはスタジオのことではなく、standard input and outputの略になります。

標準的な入力・出力の翻訳内容が記載されているという意味でとらえればOKです。

他にも説明書はたくさんありますが、だんだん覚えていけば大丈夫ですよ。

『int main(void)』ってなに?

続いてはint main(void)に関してです。

int main(void)を一言でいうと、『一番最初に実行するプログラムの性質』を意味しています。

とび助
とび助
一番最初に実行するプログラムですか…?
トビタカ
トビタカ
はい!では1つ1つご説明していきます。

 

①『main』

実はC言語には、プログラムの実行順序にルールがあります。

次のプログラムのコードをご覧ください。

#include<stdio.h>

int real(void){
	printf("リアルガチ!\n");
	return 0;
}

int main(void){
	printf("ヤバいよ!ヤバいよ!\n");
	return 0;
}

 

こちらのプログラムを実行すると、どうなるのでしょうか?

とび助
とび助
『リアルガチ!』って表示されてから『ヤバイよ!ヤバイよ!』じゃないですかね?
トビタカ
トビタカ
実は『ヤバイよ!ヤバイよ!』しか表示されません!
とび助
とび助
えぇ!マジっすか!?

 

実際にこのプログラムを実行すると『リアルガチ!』は表示されません。

というのも、C言語のプログラムは上から読み込まれていくのですが、上から順番に実行されるわけではないからです。

C言語の場合、最初に実行するプログラムはmainからと決まっています。

そのため、mainに書かれている『ヤバイよ!ヤバイよ!』しか表示されないんです。

このように、おまじないの『main』は最初に実行されるコードの位置を意味しているのです。

とび助
とび助
なるほど!でも、mainより先にあったint real(void)はどうなるんですか?
トビタカ
トビタカ
main関数で使用しない限りスルーされてしまうのです。

mainより前にプログラムを書いても、main関数で呼び出さない限り実行されません。

しかし、読み込まれてはいます。

そのため、『使う準備はできているけど使わなかった』という状態になるのです。

②mainの前にある『int』

続いては、mainの前にある『int』のご説明をいたします。

『int』というのは『integer』の略で整数を意味するのですが、mainなどの関数名の前につくとちょっと意味が変わります。

関数が終わったときに出力する値の種類を表現しているのです。

とび助
とび助
出力する値ですか…?
トビタカ
トビタカ
はい。この場合はmain関数の終了メッセージだと思ってください。

 

先ほどのプログラムを実行すると『ヤバイよ!ヤバイよ!』と表示されます。

このような文字をディスプレイに表示されるプログラムであれば、プログラムが終わったことが分かりやすいのですが。

計算するだけで何も表示しないプログラムだったらどうでしょうか。

とび助
とび助
終わったかどうか分かりにくいですね。
トビタカ
トビタカ
そうですよね。

 

プログラムが終わったことがコンピュータに伝わらないとコンピュータは処理に困ってしまいます。

その場合は、ずっとプログラムを実行することになるので、フリーズなどの異常が発生することがあるのです。

このようなことにならないように、プログラムが終わったことをきちんとコンピュータに伝える必要があります。

では、どうやって伝えればいいのでしょうか?

とび助
とび助
もしかして、何らかの情報を出力しているんですか…?
トビタカ
トビタカ
その通りです!

 

関数が終了したことをコンピュータに伝えるために、関数は情報を出力しています。

代表的な方法としては、関数の終了時に整数を出力することでしょう。

しかし、このような方法を実践するためには、事前にコンピュータに『どのような情報で関数の終了を伝えるか』を知らせておかなければいけないのです。

この役割を担うのが、関数名の前にある『int』になります。

mainの前に『int』を付けることで、『main関数が終わったら整数を出力するよ』とコンピュータに予告しているのです。

とび助
とび助
意味がわかってきました!
トビタカ
トビタカ
その調子です!

③『(void)』

続いて(void)の部分です。

このカッコの部分を簡単に説明すると『mainへのプレゼント』を意味しています。

とび助
とび助
プレゼントですか?
トビタカ
トビタカ
はい。そう考えるのが分かりやすいと思います。

 

プレゼントといっても、そんな華やかなものではありません。

計算や処理に使うデータのことなのです。

例えば家計簿プログラムに今月の貯金額を計算してほしいときは、収入と出費のデータを渡しますよね?

この収入と出費のデータがプレゼントになるのです。

トビタカ
トビタカ
ちなみに、このプレゼントを引数(ひきすう)といいますよ。
とび助
とび助
なるほど。でもvoidの意味が分かりません。

 

先ほどのmainの引数にはvoidと書かれていたと思います。

voidとは『空っぽ』を意味する英単語なので、引数にvoidがあるということはプレゼントがないという意味になります。

つまり、『(void)』の部分は『mainは何もデータを渡さなくても処理が行われるプログラムですよ』と言うことを意味しているのです。

とび助
とび助
main関数の引数は必ずvoidなんですか?
トビタカ
トビタカ
コマンドライン引数というものを使わない限りvoidという認識でOKですよ!

『return 0;』ってなに?

残るおまじないは『return 0;』になります。

これは、『プログラムを終了させてメッセージを発信する』ということを意味しています。

とび助
とび助
これは、もしかしてさっきの…
トビタカ
トビタカ
はい!プログラムを終了させて、終了したことをコンピュータに伝えているのです!

 

先ほど『プログラムが終わったときは整数を出力してコンピュータに終わったことを伝える』と説明しました。

『return 0;』がその整数の出力に当てはまるのです。

言い換えれば、『return 0;』はプログラムを終了させて『0』というメッセージをコンピュータに送っていることになります。

コンピュータはmainから『0』を受け取ると、プログラムの実行時に使っていたメモリのデータなどを消去したり、次の命令を受け付ける準備をしたりするのです。

とび助
とび助
returnの整数は0じゃなきゃいけないんですか?
トビタカ
トビタカ
intの場合は整数ならなんでもOKですよ。

int main(void)の場合、基本的にreturnに使用する値は整数であればなんでもOKです。

ただし慣習的に正常終了なら0、異常終了なら0以外にする傾向があります。




まとめ

以上がC言語で最初に立ちはだかる『おまじない』の正体になります。

おまじないの正体を掴んでいただけたのではないでしょうか?

このような『おまじない』が必要な理由は、考えなくてもOKです。

だって、C言語はそういうプログラミング言語だから。

英語などの言葉と同じで、C言語のプログラムを実行するために必要なものと決められているのです。

だから、おまじないの意味を知ったら、細かいことは気にせずにプログラムの作成に移っていきましょう。

C言語のおまじないのまとめ
とび助
とび助
おまじないの意味が分かりました!これで、次のステップに移れそうです!
トビタカ
トビタカ
それはよかったです!次はC言語の5つのルールを確認するのがオススメです!
【簡単】コードを書くために知っておきたい『C言語を書く時の5つのルール』とは…?本記事では、C言語のプログラムを書くために必要な5つのルールをご紹介しています。その5つのルールとは…?...

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA