プログラミング

C言語超入門① 最初のプログラムを書いて動かそう

C言語の基本形、printf、main関数、コメントを使い、最初のプログラムを動かします。

C言語のコードを開いたら、英単語より記号の多さに目が行くかもしれません。#、{ }、;……最初から全部覚えるのは、ちょっと大変ですよね。

この全9回のシリーズでは、まず短いプログラムを動かし、少しずつ道具を増やします。最終回の目標は、名前と点数を入力して結果をまとめる「成績管理プログラム」です。

今回は、画面に2行の文章を表示できれば十分。C言語の経験は必要ありません。

1. 「書く」「変換する」「動かす」は別の作業

プログラミングで書く文章をソースコードと呼びます。C言語では、通常そのコードをコンパイラで実行用の形へ変換してから動かします。変換する作業がコンパイルです。

料理にたとえるなら、コードは作り方、実行ファイルは実際に動かせる形に準備されたもの。ただし、コンパイラが「おいしくなるか」まで判断してくれるわけではありません。文法が正しくても、計算や表示の内容は自分で確認します。

作業は次の順です。

  1. エディターでコードを書く
  2. ファイルを保存する
  3. コンパイルする
  4. できたプログラムを実行する
  5. 表示を見て、必要なら書き直す

保存しただけでは、以前作った実行ファイルは更新されません。「直したのに前と同じ結果だ」というときは、3番を飛ばしていないか確認しましょう。

2. まずは最小のコードを動かそう

C11以降に対応するC言語の環境を使ってください。ブラウザの学習環境なら言語欄を「C」にします。「C++」は名前が似ていますが別の言語です。

#include <stdio.h>

int main(void) {
    printf("Hello, C!\n");
    return 0;
}

期待する表示は次の1行です。

Hello, C!

まだ動かす環境がない場合は、学校の指定環境を優先してください。VS Codeはコードを書くエディターなので、インストールしただけでCのコンパイラまで用意されるとは限りません。

GCCが入っているパソコンで試す場合

コードをhello.cという名前で保存し、そのファイルがあるフォルダーで、次のコマンドを使います。コマンドとは、ターミナルに入力する操作の指示です。

gcc -std=c11 -Wall -Wextra hello.c -o hello

-std=c11は使う言語規格、-Wall -Wextraは間違いの手掛かりになる警告、-o helloは出力名の指定です。GCC公式の出力オプションで役割を確認できます。

成功後、WindowsのPowerShellでは.\hello.exe、macOSやLinuxでは./helloで実行します。gccが見つからないという表示は、コードの間違いではなく、コンパイラや実行場所の設定の問題です。

3. 1行ずつ、役割を分けて読む

stdio.hは入出力の道具を使うための宣言

#include <stdio.h>は、画面への表示などに使う標準ライブラリの宣言を取り込む指示です。標準ライブラリは、C言語の環境が用意する基本的な道具の集まり。今回はprintfを正しく呼び出すために必要です。

この行の最後にはセミコロンを付けません。#から始まる行は、後に出てくる実行中の処理とは書き方が違います。

mainはプログラムの入口

int main(void)のmainは、今回のような普通のプログラムが処理を始める入口です。

関数は、名前を付けた処理のまとまり。mainもprintfも関数です。ただし、mainは自分で中身を書き、printfは用意されたものを使っています。

intは整数を返すこと、かっこの中のvoidは引数を受け取らないことを表します。引数の詳しい話は関数の回で扱うので、今は基本形として使えば大丈夫です。

波かっこは処理のまとまり

{から対応する}までがmainの中身です。内側の行を右へずらすことをインデントと呼びます。見やすくするための字下げで、どの処理がまとまっているかを示します。

printfは文字を出す関数

printf("Hello, C!\n");では、かっこの中の文字列を表示します。文字列は、文字が並んだデータです。半角のダブルクォーテーション"で始め、同じ記号で閉じます。

printf自体も結果の値を返しますが、この例では使っていません。「関数を使うと必ず結果を変数に保存する」という決まりはありません。

return 0で終了する

return 0;は、mainを終わらせ、呼び出した環境へ正常終了を表す0を返します。画面に0を表示する指示ではありません。 表示したいときはprintfが必要です。

4. 改行と、処理の順番を確かめる

最初のコードのprintfを、次の2行に置き換えてみます。

printf("Start\n");
printf("Ready\n");
Start
Ready

上のprintfを実行し、それが終わってから下へ進みます。\nは改行を表すエスケープシーケンスです。2文字の記号をそのまま表示するのではなく、「次の行へ進む」という意味になります。

では、最初の\nだけを外すとどうなるでしょう。

printf("Start");
printf("Ready\n");

答えはStartReadyです。コードを2行に分けても、表示が自動で2行になるわけではないんですね。コードの改行と、出力の改行は別と考えると整理できます。

日本語を表示する場合も、仕組みは同じです。ただし文字化けする場合は、ファイルの保存形式やターミナルの文字コードを確認します。最初に英数字で試すのは、表示設定の問題と文法の問題を分けやすくするためです。

5. セミコロンとコメントを使い分ける

セミコロンは文の終わり

printf(...);やreturn 0;には;が必要です。一方、mainの直後の{や、#includeに機械的に付けるものではありません。「すべての行の最後」とは覚えないようにしましょう。

コメントは自分へのメモ

// 開始したことを表示する
printf("Start\n");

/*
ここは複数行のコメントです。
実行結果には出ません。
*/

//から行末まで、または/*と*/の間がコメントになります。/*をコメントの内側に重ねる書き方は避けてください。

「文字を表示」と書くだけでなく、「何のためにここで表示するのか」を残すと、後から読み直しやすくなります。

6. 動かないときは、3つに分けて考える

起きたこと 最初に見る場所
gccなどのコマンドが見つからない 実行環境・インストール・操作しているフォルダー
コンパイルがエラーになる 指摘された行と、その1行前の引用符や;
実行できたが表示が違う printfの順番、\n、再コンパイルしたか

例えばprintf("Hello\n")は、最後の;がありません。エラーが次のreturnの行を指しても、原因はその前にある場合があります。

半角の"を全角の"へ変えたり、printfをPrintfと書いたりしても別物になります。細かくて面倒ですが、コードの記号はまず半角でそろえるのが近道です。

エラー表示の読み方も、止まったときの手掛かりになります。

7. 練習:2行の自己紹介を表示しよう

名前と好きなものを別々の行に表示してください。個人情報を書く必要はなく、練習用の名前で構いません。

模範解答

#include <stdio.h>

int main(void) {
    printf("Name: Aoi\n");
    printf("Favorite: Music\n");
    return 0;
}

解説

  1. stdio.hでprintfの宣言を使えるようにします。
  2. mainに入り、名前を表示します。
  3. 1つ目の\nで次の行へ移ります。
  4. 好きなものを表示し、もう一度改行します。
  5. return 0で終了します。

結果はName: AoiとFavorite: Musicの2行です。文章を変えても、この順番は変わりません。コード全体を暗記するより、「表示を増やすなら、どこを増やすか」が分かることを目標にしましょう。

次に進む前の確認

自分の文章へ変え、保存し直し、もう一度コンパイルして表示が変われば、この回の目標は達成です。

言語の細かな定義を確認したい場合は、C11公開委員会草案の5.1.2.2.1(main)と7.21.6.3(printf)が一次資料です。規格書なので、初めから通読する必要はありません。

次は数字を保存し、入力された値で計算してみましょう。

次の回:変数と入力 / C言語の記事一覧

← 記事一覧へ戻る