C言語編 第2章 Hello, Worldプログラム

先頭へ戻る

この章の概要

この章の概要です。


Hello, Worldプログラム

「Hello, Worldプログラム」とは、新しいプログラミング言語の学習を始めるときに、ひとまず試してみるお約束のプログラムのことです。画面上に「Hello, World」と表示させてみるという内容であるため、このように呼びます。この章では、C言語による Hello, Worldプログラムを作ってみます。

画面に「表示」という表現を使いましたが、今後のためにも、画面に「出力」という表現を使うことにしましょう。プログラムには、入力出力が付きものです。

入力とは例えば、キーボードから文字を打ち込んだり、Windowsなどでの「ファイル」の情報を読み込んだりすることを指します。また、出力とは、画面に文字や数字を表示したり、「ファイル」に結果を書き出したりすることを指します。

puts関数を使う

では早速、プログラムを作ってみましょう。

#include <stdio.h>

int main(void)
{
    puts( "Hello, World" );

    return 0;
}

実行結果:

Hello, World

前章で見た最小限のプログラムに比べると、いろいろと新しい記述が増えています。順番に説明していきます。

まず、先頭の「#include <stdio.h>」の部分です。これは「シャープ インクルード スタンダードアイオードットエイチ」と読みます。意味の詳細な説明は現時点では難しいのでしませんが、この後すぐに説明する puts関数などのC言語に用意された機能を使うために必要になります。

詳細は第23章で取り上げます。

次に、main関数の部分ですが、前章のサンプルには無かった「int」という文字が加わっています。これは、Hello, Worldプログラムとは直接的には関係ありませんが、書いておくのが一般的です。詳細な説明は、第9章で行います。

次が、最も肝心な部分です。「puts( "Hello, World" );」という記述により、「"Hello, World"」という文字の並びを画面に出力しています。これは puts関数という、C言語に用意されている関数の1つです(このリンクは、リファレンスページへ飛びます。この先でも、言語に用意されている機能については、リファレンスページへ飛ぶリンクを適宜貼っています。ただし、リファレンスは、中級者以上の方にとって特に有用なように作っているので、現時点での完全な理解は難しいと思います)。

前章で書いたように、「関数」とは「複数の処理をまとめたもの」です。puts関数であれば、「画面上に指定された文字の並びを出力するための処理をまとめたもの」ということになります。

puts関数は、指定した文字の並びを出力したうえで、さらに改行も行います。「改行」の説明は、後で登場します。

「"Hello, World"」の部分ですが、このように、2つの " で囲まれた文字の並びのことを、文字列リテラルといいます。「""」のように、中身が何もないことも許されています。

また、単に、文字列といった場合は、"" で囲まれた文字の並び自体のことを指します。文字列をソースコード上に書くために、"" で囲んで表現したものが、文字列リテラルだということになります。

printf関数を使う

画面に文字列を出力する方法は、puts関数だけではありません。よく使われるもう1つの方法として、printf関数があります。

puts関数と比べると、printf関数の方ができることが豊富にあります。そのため、printf関数の使い方さえ知っていれば困ることはありませんが、逆に多機能過ぎるという問題があります。プログラミングの世界では、多機能であることは必ずしも良いことではありません。「理解が大変」になるため、「間違った使い方をしてしまいやすい」ですし、「実行の際には、いろいろな処理を行う必要があり効率が悪くなりやすい」といった問題があります。ですから、シンプルな puts関数にも、それなりの良さがある訳です。

printf関数を使って、先ほどの Hello, Worldプログラムを書き換えると、次のようになります。

#include <stdio.h>

int main(void)
{
    printf( "Hello, World\n" );

    return 0;
}

実行結果:

Hello, World

puts関数を使っていた部分が、printf関数に変わっただけのようですが、よく見ると「"Hello, World"」の末尾に「\n」が追加されています。

「\n」という記述は、画面上で「改行」を行うという指示です。実は、puts関数の場合は \n を付けなくても、自動的に改行が行われます。そのため、まったく同じ実行結果を作り出すには、printf関数の場合は \n を付ける必要があります(puts関数で \n を使うこともできますが、最後に改行する用途としては必要ないはずです)。

多くの場合、1つの文字列を出力することは、1行分の文字の並びを出力するということです。そのため、文字列を出力するたびに、最後に改行するのが普通です。改行を行うことによって、「この行の出力は完了。次に何か出力するなら、行の頭から開始する」と言っていることになります。

printf関数よりも puts関数の方が、手軽な感じがします。しかし、何らかの都合があって、改行したくないという場合には、puts関数では実現できません。

なお、プログラム内で行う最後の出力のときには、末尾で改行を行うことが好ましいといえます。

実行環境によりますが、出力結果が表示される画面上には、次の文字を表示するために使う位置を示すカーソルのようなものがあると思います。プログラムの最後で行う出力の末尾で改行を行わなかった場合、プログラム終了時点でカーソルの位置は行末にあるはずです。この状態で、コマンドを入力したり、ほかのプログラムを実行したりして、何らかの新たな出力が行われると、それは行末のところへ続けて行われることになります。これでは、前のプログラムが出力した結果と混ざり合ってしまって、分かりづらくなってしまいます。
一方、プログラムの最後の出力時に末尾で改行しておけば、カーソルの位置は新しい行の頭に移動します。これなら、次に何か出力されたときには、まっさらな新しい行の頭から使えます。つまり、結果が表示される画面はみんなが共有するものなので、使い終わったときに、中途半端な状態にしないことが好ましいということです。

例えば、次のプログラムは、改行しない printf関数を使っています。

#include <stdio.h>

int main(void)
{
    printf( "Hello, " );
    printf( "World\n" );

    return 0;
}

実行結果:

Hello, World

1つ目の printf関数では、\n を使っていませんから、改行が行われません。そのため、2つ目の printf関数では、同じ行内に続けて出力が行われます。2つ目の printf関数はプログラムの最後の出力になるので、きちんと末尾に改行を伴って、出力を終わらせています。

ちなみに、\n を末尾ではなく、文字列の途中に入れ込むことも可能です。例えば、次のようにできます。

#include <stdio.h>

int main(void)
{
    printf( "Hello,\nWorld\n" );

    return 0;
}

実行結果:

Hello,
World

実行結果を見ればわかるように、確かに \n を書いた位置で改行が行われています。このような書き方もできますが、パッと見で分かりにくいという問題はあります。


練習問題

問題① puts関数を使って、画面に「1行目」「2行目」「3行目」と出力するプログラムを作成してください。 もちろん、それぞれ改行を行って出力します。

問題② 問題①と同じ出力結果になるプログラムを、printf関数を3回使って作成してください。

問題③ 問題①と同じ出力結果になるプログラムを、printf関数を1回だけ使って作成してください。

問題④ どの関数を使っても構わないので、

実行結果:

1行目

3行目

のように、「2行目」の部分が抜けた出力結果になるようなプログラムを作成してください。


解答ページはこちら

参考リンク



更新履歴

'2018/6/15 「エスケープシーケンス」の項を、第8章へ移動。

'2018/5/11 用語を統一(文字列定数 -> 文字列リテラル)

'2018/5/2 最後に行う改行について記述を改めた。また、この段階では難しいのでコラムにした。
エスケープシーケンス」の項を追加。

'2018/4/19 リファレンスページへのリンクについて補足する文書を入れた。

'2018/1/27 全面的に文章を見直し、修正を行った。

'2009/3/2 「この章の概要」を追加。

'2008/8/30 新規作成。



前の章へ (第1章 最小限のC言語プログラム)

次の章へ (第3章 変数)

C言語編のトップページへ

Programming Place Plus のトップページへ


はてなブックマーク Pocket に保存 Twitter でツイート Twitter をフォロー
Facebook でシェア Google+ で共有 LINE で送る rss1.0 取得ボタン RSS
管理者情報 プライバシーポリシー