プログラム・プロブレム

第一回 Hello World 解説(C++)


I はじめに

涼(以下S):はじめまして、涼(すず)です。
初(以下H):俺は初(はじめ)だぜ、よろしく。

S:早速ですが、まずはこのコンテンツの意義をちょっと紹介しますね。
H:簡単に言うと、プログラミングの紹介なんだよな。
S:そう、プログラム入門を自分で書いてみたいという作者さんの野望の結晶です。
H:本人もよく分かってないのに、入門なんて書けるのかね?
S:そこはそれ、こんな風に対話調にすることで誤魔化そうという腹みたいですよ。
H:ホントに大丈夫なのか…?こんなノリで。
S:まあ、ちょっとでも誰かの助けになったらいいなという話らしいので。
S:それに、そのへんによくある入門本とかとはちょっと違う視点で書きたいそうです。
H:…ヤツの腹は「詳しい解説は他を参照してください」って事だぞ、たぶん。
S:(慌てて)ま、まあいいんじゃないですか、色んな角度から物事を見るのは大事ですよ。

II ソースコード

H:というわけで、記念すべき第一回は「Hello World解説」だ。基本だな。
S:ええ、基本です。基本は大事なんですよ?
H:でも、いいのか?Hello Worldやったら普通と同じ気がするぞ。
S:なんでも「おまじない」を使わない解説をやりたいらしいです。
H:お、多少は斬新かもしれないな。問題はちゃんと解説できるか、だな。
S:そのへんの判断は読者さんに任せましょう。ちなみに、技術的ツッコミは大歓迎だそうです。
H:文章的ツッコミは見なかったことにするわけか…
S:えーと、作者さんによると「自分の文章力のヘタレ具合は理解している」って話らしいですね。
H:一応は自覚してたのか…
S:そんなわけで、そろそろ始めますね。まずはソースコードです。
H:ちなみに、最初の「xx:」の数字の部分は行番号だ。実際のソースコードには書くなよな。
01:// hello_world.cpp
02:#include <iostream>
03:int main(int argc, char* argv[])
04:{
05:  std::cout << "Hello world!" << std::endl;
06:  return 0;
07:}
H:今さらだが、言語C++ なんだな。
S:ええ。とりあえずは C++ でやっていく予定らしいです。
H:また面倒な言語を選んだな。Ruby とかの方が良かったんじゃないか?
S:えーと、何々?「オブジェクト言語は最初の説明が難しい」ですって。
H:つくづくヘタレだな… 後から後悔しても知らんぞ。
S:それは重複表現ですよ。ってそんな事はいいんです。解説に入らないと…

III 解説

III.a コメント

01:// hello_world.cpp
S:01行目はコメントですね。ここではファイル名がメモしてあります。
H:「//」の後ろがコメントとしてコンピュータには無視される、と。
S:そうですね。ただ、日本語でコメントする場合はコンパイラ文字コードに注意が必要です。
H:対応してないコンパイラに日本語コメントを食わせると問題が起きるわけだ。
S:最近のメジャーなコンパイラは大丈夫みたいですけどね。
H:…そーゆー事はちゃんと調べてから発言すべきじゃないのか?
S:いいんです。読者さんにも自分で調べるクセを付けてもらいたいという作者心です。
H:単に投げっぱなしにして楽してるだけだと思うが…

III.b インクルード

02:#include <iostream>
S:続いて02行目ですが…
H:うわ、無視してるし。
S:…「iostream」っていうファイルを読みなさいという指示です。
H:難しい言葉で言うと「プリプロセッサディレクティブ」の「インクルード」だな。
S:技術者と会話する時はそう言わないと怒られますね。でも今回は内容が分かればいいので。
H:要は「後で使いたい部品の説明が書いてあるファイルはコレ」って意味だ。
S:そうですね。実際には05行目で使うので、それより前に置く必要があります。

ちょっと高度な話

H:ちなみに使う括弧は「<>」と「""」の2種類あるのは覚えとくといいぜ。
S:今回はシステム付属のファイルなので「<>」で囲んであります。
H:自分で書いたファイルを読みたい時は「""」になるからな。
S:違うのはファイルを探す場所なんですが、詳しい事は読者さん自身で調べてください。
H:それもやっぱり作者心か?
S:困った時に調べればいいという事でもあります。一番詳しい参考書は「プログラミング言語 C++」ですね。
H:ああ、仕様の書いてある分厚いアレか。言語設計者自身が書いた本だよな。
S:あの本を読んで、一発で理解できるような人はこんな文章読む必要もありませんが…
H:それは確かにそうだな。

III.c mainエントリポイント

03:int main(int argc, char* argv[])
S:…次に行きましょう。03行目です。これは定型句として覚えてください。
H:03行目は「プログラムはこんな内容になってます」という入口のサインなんだな。
S:そんなわけで、この定型句以降のまとまりがプログラムとして実際に実行されることになります。
S:以下がちょっとした解説ですが、分からない場合は飛ばしちゃっても構いません。

もうちょっと詳しく

H:03から07行目までは、いわゆる「関数定義」ってヤツだ。
H:ちなみにこの「関数」ってのは「仕事のまとまり」だと思えばいい。
S:はい。04行目から07行目までのまとまりに名前を付けています。この場合は「main」です。
H:「仕事をするための手順書」が中身に書いてあるわけだ。今回だと05と06行目だな。
S:名前(関数名)が「main」で、その仕事内容が下の行に続くわけですね。

H:03行目の前の「int」と後ろの「(int argc, char* argv[])」は「(関数の)シグネチャ」と呼ばれる。
H:人によっては「関数の型」と呼ぶ場合もあるな。同じ名前で違うシグネチャの関数を作れるんで、ちょっと紛らわしい。
S:「int」は簡単に言うと「数字」の事です。「char*」は…「文字列」だと思ってもらっていいです。
H:後ろの「(…)」の部分は、何を教えてもらって仕事を始めるかを示している。
S:上の場合は数字1個を「argc」という名前で、文字列の並びを「argv」という名前で使うという意味です。
H:補足すると、argvの後ろの「[]」の部分が「…の並び(集まり)」っていう意味だ。
S:そして、03行目の最初の「int」は、数字を結果として返すという事を表しています。

まとめ

H:だいぶゴチャゴチャしてるな…
S:まとめると「何をもらって何を返すか」と「そのまとまりの名前」を書いてあるのが03行目です。
H:そして、さっきも言ったが、そのまとまりの中身が04から07行目にかけてということだ。

III.d ブロック区切り

04:{
07:}
H:04行目と07行目は、まとまりの開始と終了のマーク… ってのは見れば分かるな。

III.e 出力

05:  std::cout << "Hello world!" << std::endl;
S:そして05行目がいよいよ今回の目玉です。
H:やっと本題に入るのか、長かったな。
S:実行する内容は「Hello world!」という文字列を表示するというものですね。

リテラル

H:表示したい文字列は「"Hello world!"」というように「""」で囲まれているな。
S:こんな風にプログラムに直接値を書き込んだモノを「リテラル」と呼びます。これは「文字列リテラル」ですね。
H:文字列リテラルは「""」で囲んで書く。一方、数値リテラルは「5」とか「3.14」とか数字表現をそのまま書けばいい。
S:注意点としては「''」でも文字列リテラルを書ける言語がありますが、C++ ではダメだと言う事です。
H:PerlとかRubyも使ってる人は要注意だな。作者もこの文章を書きながら間違ってたのは内緒だ。

表示

S:そして、この文字列を前にある「std::cout」に「<<」演算します。
H:「a + b」が「a」に「b」を「+」演算するような感じだな。記号がちょっと変な「<<」なだけだ。
S:「std::cout」は「標準出力」と呼ばれ、「<<」演算したモノを画面に表示します。
H:これで今回だと「Hello world!」が表示されるわけだ。
S:どうしてこうなるかは、std::cout の内容がそういうものだからということで勘弁してください。
H:ちなみに、この std::cout の中身は03行目で読み込んだ iostream というファイルに書かれているぞ。

改行マーク

S:次の「std::endl」は「行の終わり」を表すモノです。これで表示が改行されます。
H:ここまでで文字列の表示ができたわけだ。お疲れさん。
S:ちょっと待ってください。最後の「;」も重要なので忘れちゃダメです。
H:ああ、そうか、C++では命令の区切りごとに「;」が必要なんだったな。
S:非常に重要です。初心者はよく忘れてコンパイラに分かりにくい表現で怒られます。
H:コンパイラも「;がありません」って言えばいいのに、無駄に複雑に言うんだよな…
S:精進するとLispの括弧みたいに、空気のように有って当たり前の存在になっちゃうみたいですが。
H:作者がそこまで到達できるのは、いつの日になることやら。

III.f return

06:  return 0;
S:ちょっと話題が逸れました。本当の最後に06行目ですが、これは「0を返して終了」という意味です。
H:03行目で、返す値が数字だって言ってたのを思い出してほしいね。
S:この「main」というまとまりを終了して、返す値は「0」にするのが「return 0;」の役目ですね。
H:プログラムが正常に終了する場合には 0、問題がある場合は 0以外とするのが慣習だな。
S:そうですね。main から return する場合はそうするのが普通です。

IV 終わり

S:といった感じで Hello world 解説を駆け足で行ったわけですが、どうでしたか?
H:速過ぎて分かんねーって人は、もっと詳しい解説を探してくれ。
S:「おまじない」抜きで一通り解説してみましたが、やっぱり難しいですね。
H:とは言え、いきなり「データ型には int とか…があって…」って教えられても眠くなるだけだしな。
S:次回はその「データ型」と「入力」についての予定です。
H:不評で打ち切りにならなければな…
S:そ、それは考えない方向で。それでは、またお会いしましょう。さようなら。
H:じゃあな。

第一回 終了


一覧に戻る