「hello, world!」徹底解説

こんにちは、めのんです!

前回予告した通り、今回からいよいよCでソースコードを書いていきます。
最初ですので定番の「hello, world!」と出力する簡単なプログラムから始めますね。
とにかくCのソースコードを貼ってみます。

/* hello.c */
#include <stdio.h>

int main(void)
{
  puts("hello, world!");
  return 0;
}

普段使っているプログラミング言語は違っても、プログラミング経験がある方なら何をやっているのかおおよその見当がつくのではないでしょうか。
具体的な解説をする前に、このプログラムにできるだけ近い内容をPHPで書けばどうなるのか、ちょっとやってみたいと思います。

<?php
// hello.php
require_once 'stdio.inc';

function main(): int
{
  puts('hello, world!');
  return 0;
}

exit(main());
<?php
// stdio.inc
define('EOF', -1);

function puts(string $s): int
{
  try
  {
    echo $s . PHP_EOL;
  }
  catch (Throwable $ex)
  {
    return EOF;
  }
  return 0;
}

上のhello.phpをコマンドライン版のPHPで実行すれば、標準出力に「hello, world!」と出力されるはずです。
stdio.incはhello.phpからrequire_onceで取り込まれることを想定しています。
もしコマンドライン版のPHPをまだ使ったことがないようでしたら、ぜひこの機会に挑戦してみてくださいね。

では、再び最初のCのソースコードに戻ります。
念のためもう一度掲載しておきます。

/* hello.c */
#include <stdio.h>

int main(void)
{
  puts("hello, world!");
  return 0;
}

このソースコードを順に追ってみましょう。

1行目の /* hello.c */ の部分はコメントです。
CもPHPと同じで、/* から */ までのブロックコメントと、// から行末までの行コメントを使うことができます。

2行目の #inclue <stdio.h> の部分は、「stdio.h」という名前のヘッダーを取り込んでいます。
ヘッダーについてはまた別の機会に詳しく解説しますが、ライブラリ関数などを使えるようにするための宣言や定義が行われています。
上のPHPの例では、「stdio.h」を(必要最小限ですが)真似てputs関数とその中で必要なEOFを定義しました。
まったく同じではないですが、こんな感じでライブラリ関数を使えるようにしているぐらいに今のところは思っておいてください。

4行目から最後までは「main」という名前の関数を定義しています。
main関数は引数を受け取らず、int型の値を返す関数ということになります。
PHPでは関数はfunctionから始めましたが、Cではこのように返す値の型から始めます。

関数の中身に関しては今のところPHPと変わりませんね。
puts関数“hello, world!”という文字列を引数として呼び出しています。
puts関数は引数で指定した文字列を標準出力に書き込んでから改行します。

標準出力については大丈夫ですよね?
PHPでも標準出力は普通に使っていると思います。
Webアプリケーションの場合は標準出力がHTTPのレスポンスになりますし、ob_startを使えばバッファリングもできますね(このあたりは私よりみなさんの方が詳しいと思います)。
コマンドラインでは標準出力に書き込んだ内容が画面に表示されます。

main関数の最後は return 0; で関数の呼び出しもとに0を返しています。
PHPの例を見ればおわかりいただけるかと思いますが、main関数から返された値を終了ステータスとしてプログラムを終了します。
PHP同様、終了ステータスが0の場合は正常終了を意味します。

ところで、PHPでは関数を定義しなくてもいきなり処理を書くことができますが、Cの場合は必ず関数が必要になります。
そしてプログラムの最初に呼び出される関数の名前は「main」と決められています。
ここはPHPと大きく違っていますので注意してください。

今回は以上となります。
PHPが使える方であれば、そんなに違和感がなかったんじゃないでしょうか?

次回はCのバージョンについて解説しようと思います。
PHPほどではないですがCにもいくつかのバージョンがあります。
ここを正しく把握しておかないと話がかみ合わなくなりますので。

それでは次回をお楽しみに!