このエントリーをはてなブックマークに追加

Hello, World
Copyright (C) 2015 by Nobuhide Tsuda

 

※ イラスト提供:かわいいフリー素材集「いらすとや」様

Hello, World

何もしない寡黙なプログラム

何もしないプログラムは以下のように記述する。

/* 何もしないプログラム */
int main()
{
    return 0;
}

「/*」と「*/」で囲まれた部分はコメントで、コンパイラには無視される。

C/C++ では、最初に main() と書かれた部分の { } の間が実行される。
実は main() は関数で、int、すなわち整数型の値を返す。最後の return 0; は「0」を値として返すという意味である。
まったくの初心者は何を言っているか理解できないかもしれないが、あまり細部にこだわると先に進めなくなるので、 今はこのように書くと無条件に覚えて欲しい。詳細な話はおいおい出てくるので、そのときに原理なり理由なりを理解できるはずだ。

C/C++ では単語と単語の間に自由に改行を入れてよい。
なので、上記のプログラムは、以下のようにも書ける。

/* 何もしないプログラム */ int main() { return 0; }

これでも立派なプログラムで、ちゃんとコンパイルして実行することが出来る。
※ コンパイル とは、人間に分かりやすい言語(CやC++)で書かれたソースコードをCPUが実行できるバイナリに変換すること。
コンパイルの具体的な方法は次の節で説明する。

ちなみに、以前は { の前で改行するのが普通だったが、最近は以下のように改行しない書き方もよく目にするようになった。

int main() {
    return 0;
}

Visual Studio でコンソールプロジェクトを作ると、以下の様なソースが自動生成されるはずだ。

#include "stdafx.h"
int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

最初の「#include」は他のファイルを読み込む指令で、今は深く詮索しない方がよい。

先ほどは「main」という名前だったが、こちらは 「_tmain」という名前になっている。
実は #include "stdafx.h" を書いた場合は、最初に実行される関数は「_tmain」でもよいということになっている。
これも今はあまり気にしない方がよい。

さあ、ビルド・実行してみよう

なにはともあれ、上記ソースコードをビルド・実行してみよう。
「ビルド」とは、C/C++ のソースコードをCPUが理解出来る形式に変換する作業だ。
以前は「コンパイル」と呼んでいたが、リンク作業や場合によってはスクリプトが走る場合などもあるので、最近は「ビルド」と呼ぶことが多いようだ。

Visual Studio(以下、VS と略す)あれば F7 を押すか、ビルド>ソリューションのビルド メニューを実行する。
そうすると、下図のように出力ウィンドウにビルド結果が表示される。

「1 正常終了、0 失敗」と表示されればビルドが成功したことになる。
ソースコードになんらかの間違いがあると、下図のように「0 正常終了、1 失敗」と表示される。

VS で、ビルドしたプログラムを実行するには F5 を押すか、デバッグ>デバッグ開始 メニューを実行する。
もし、ビルドしていない場合は、ビルドを行うかどうかを訪ねてくるので、【はい】を選択する。

このプログラムを実行すると、一瞬コンソールが表示され、直ぐに消えて、出力ウィンドウに以下のように表示される。

最後の「コード 0 (0x0) で終了しました」というのは return の後の数値に対応している。return 123; と書くと「コード 123 (0x7b) で終了しました」に変わる。

Linux 等でコンソールからビルドする場合は、「コンパイラ ソースファイル名」を入力し、Enter キーを押す。
例えば、hello.cpp というソース・ファイルを作り、gcc でコンパイルするときは、「gcc hello.cpp」とする。
そうすると、ソースコードがコンパイルされ「a.out」という実行ファイルが生成される。

a.out を実行する場合は「./a.out」に続けて Enter キーを押す。
このプログラムは何もしないので、直ぐに返ってくるだけだ。

演習問題:

  1. 何もしないプログラムをビルド・実行してみなさい。
  2. ソースコードを適当に書き換え(例:括弧を消したり、増やしたり、単語を書き換えたり)、エラーが発生することを確認しなさい。
  3. return の直後の数値を書き換え実行すると、それが出力ウィンドウに表示されることを確認しなさい。

次は「Hello, World」と表示してみよう

かなり昔から、最初に書くプログラムは画面に「Hello, World.」と表示するプログラムということになっている。
C/C++ コンソールアプリでは、以下のように記述する。

C言語、C++ :

/* printf を使った書き方 */
#include <stdio.h>
int main()
{
    printf("Hello, World.\n");
    return 0;
}

C++ のみ:

//	C++ 風の書き方
#include <iostream>
int main()
{
    std::cout << "Hello, World.\n";
    return 0;
}

文字列を画面に表示するには上記の2種類の書き方がある。
前者の書き方は古くからのもので、後者の書き方は C++ になって導入されたものだ。
C++ ではどちらの書き方も有効だが、C であれば当然前者の書き方しか出来ない。

「//」は行コメントを表す。それ以降の文字列はコンパイラに無視される。

printf() を使う場合、stdio.h をインクルードする。
printf() は組み込み関数で、表示する文字列を printf() へ引数として渡すと、画面に表示される。
※ 「組み込み関数」とはあらかじめ用意されている関数、のような意味だ。あとで出てくるがユーザが自分で関数を作ることも出来る。
表示する文字列はダブルクォート(")で囲って指定する。
文字列内には「\」で特殊文字を指定することができる。「\n」は改行を示す。他にもタブ(\t)などの特殊文字がある。

cout を使う場合は iostream をインクルードする。
表示する文字列を << 演算子を使って cout に渡すと、それが画面に表示される。
※ << は右のものを左に渡すようなイメージがあるでしょ。
文字列中に「\n」と書くか、endl を出力すると出力が改行される。筆者は短く書ける前者が好きだ。
cout、endl は std 名前空間内に定義されているので、std::cout のように毎回名前空間を明示する。
または、プログラムの最初の方で using namespace std; を記述し、デフォルトの名前空間を std にしておくとよい。

#include <iostream>
using namespace std;
int main()
{
    cout << "Hello, World.\n";
    return 0;
}

筆者はずっと printf() に慣れ親しんでいたので、最初 cout の書き方に違和感があったし、 表示幅指定などの表記が面倒(詳しくは後で説明する)なこともあり、C++ でもずっと printf() を使っていた。
が、printf() はフォーマット指定と表示する式の対応に記述間違いを犯す可能性があり、危険性があることを認識し、 ある時から std::cout の方を使用することに心変わりした。
使い慣れてくると std::cout もそんなに悪くはない。慣れの問題のようである。

上記をVSでビルド・実行すると、コンソールウィンドウが現れ、「Hello, World.」と一瞬表示されるのだが、 コンソールが直ぐに閉じてしまい、何が表示されたかを確認できない。
そこで、以下のように return の前に「getchar();」を書いておくと、そこで一旦停止してくれるので、表示を確認できるぞ。

#include <iostream>
int main()
{
    std::cout << "Hello, World.\n";
    getchar();
    return 0;
}

下図は、getchar(); を書いた場合の実行結果。

プログラムを終了させるには、コンソールウィンドウで Enter キーを押すといいぞ。

演習問題:

  • サンプルソースをビルド・実行し、画面に「Hello, World.」と表示されるのを確認しなさい。
  • 表示される文字列を適当に変更して、ビルド・実行してみなさい。

まとめ・参考

  • 「/*」と「*/」で囲まれた部分はコメント
  • 行の「//」以降はコメント
  • main() の部分から実行される
  • printf("文字列"); で文字列を表示出来る
  • cout << "文字列" でも文字列を表示出来る