ゼロからわかる!C言語 基本構文の読み方・書き方入門

2025年4月14日月曜日

C言語

この記事では、プログラミング初心者の方が最初に学ぶC言語の基本構文について、ゼロから丁寧に解説していきます。

C言語のプログラムがどんなルールで書かれているのか、変数って何?どうやって計算させるの?といった疑問を、豊富なコード例とともに解消していきましょう。

プログラミングって聞くと難しそう…と感じるかもしれませんが、大丈夫!基本のルールさえ押さえれば、シンプルなプログラムはすぐに書けるようになりますよ。

さあ、一緒にC言語の世界を探検し、自分でコードを書く楽しさを見つけに行きましょう! きっと新しい発見があるはずです。

この記事で学べること

  • C言語プログラムの基本的な形
  • プログラムを書く上での最低限のルール(セミコロンとかコメントとか)
  • データを入れる箱「変数」とその種類「データ型」の使い方
  • 計算や比較で使う「演算子」の基本
  • 条件で処理を変える「if文」の使い方
  • 繰り返し処理の「for文」「while文」の使い方
  • 処理をまとめる「関数」の基本

C言語の基本構文とは?プログラムの骨組みを知ろう

まず、「構文」というのは、プログラムを書くときの言葉のルール、文法のようなものです。人間が日本語や英語の文法に従って話すように、コンピューターに指示を出すときも、C言語特有の文法ルールに従って書く必要があります。

C言語のプログラムは、いくつかの部品が集まってできています。一番中心になるのが、`main`関数と呼ばれる部分です。プログラムは基本的に、ここから処理を開始します。

まずは、お決まりの「Hello, World!」を表示する、一番シンプルなプログラムを見てみましょう。

#include <stdio.h>

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

いきなり英語が出てきて戸惑うかもしれませんが、一つずつ見ていきましょう。

  • #include <stdio.h>
    これは「おまじない」のようなもので、画面に文字を表示する機能(printf)など、便利な機能を使うために必要です。今は「こういうものなんだな」くらいでOK。
  • int main(void) { ... }
    ここがプログラムの本体、main関数です。{ から } までが一つの塊で、コンピューターに実行してほしい命令をこの中に書きます。
  • printf("Hello, World!\n");
    これが、画面に「Hello, World!」と表示させるための命令文です。printfが「表示しろ!」という命令ですね。
  • return 0;
    プログラムが正常に終わったことを示すお印です。これも今は「お約束」と思っておきましょう。
  • ; (セミコロン)
    文の終わりには、必ずセミコロンを付けます。日本語の句点「。」のような役割ですね。これを忘れるとエラーになります。

難しく考えず、まずは「プログラムってこんな形してるんだ」という全体像をつかむことから始めましょう。

C言語の基本ルール - これだけは覚えたい構文の約束事

C言語のプログラムを書く上で、いくつか守らなければならない基本的なお約束があります。これらを意識するだけで、エラーをぐっと減らせますよ。

  • 文の終わりにはセミコロン(;)が必須
    先ほどの例でも見たように、C言語では命令文(文)の最後に必ずセミコロンを付けます。コンピューターは、セミコロンを見て「あ、ここで一つの命令が終わったんだな」と判断します。
      // OK例
      printf("OK\n");
    
      // NG例 (セミコロンがない)
      // printf("NG\n") 
      
  • 大文字と小文字は区別される
    C言語では、アルファベットの大文字と小文字は、まったく別の文字として扱われます。例えば、mainMainprintfPrintfは違うものだと認識されるので、正確に書く必要があります。
  • コメントの書き方
    プログラムの中に、メモ書き(コメント)を残すことができます。コメントは、プログラムの動作には影響しません。主に、コードの説明や、後で自分が見返したときのための備忘録として使います。
    書き方は2種類あります。
    • // : スラッシュ2つの後ろから、その行の終わりまでがコメントになります。一行だけの短いコメントに便利。
    • /* */ : /**/ で囲まれた範囲が、複数行にわたってもコメントになります。
      // これは一行コメントです
      printf("コメントの練習\n"); // ここにも書けます
    
      /*
       これは複数行にわたる
       コメントの書き方です。
       便利ですね!
      */
      
  • インデント(字下げ)で読みやすく
    プログラムの処理の塊(例えば { } の中)を書くとき、行の先頭を少し右にずらす「インデント(字下げ)」を行う習慣があります。スペース数個分やタブキーで字下げします。
    これはプログラムの動作には直接影響しませんが、コードの構造がわかりやすくなり、格段に読みやすくなります。人間にとっての読みやすさは、バグを見つけやすくするためにも役立ちます。
      // インデントなし (読みにくい…)
      int main(void){
      if(1 < 2){
      printf("インデントなし\n");
      }
      return 0;
      }
    
      // インデントあり (読みやすい!)
      int main(void) {
          if (1 < 2) {
              printf("インデントあり\n");
          }
          return 0;
      }
      

これらのルールを守ることで、コンピューターにも、そして未来の自分や他の人にも優しいコードが書けますよ。

データを扱うための基本構文 - 変数とデータ型

プログラムでは、計算したり、文字を表示したりするために、一時的にデータ(数値や文字など)を記憶しておく場所が必要です。

その記憶場所のことを「変数」と呼びます。「データを一時的に入れておく箱」のようなイメージですね。

変数を使うには、まず「こういう名前で、こういう種類のデータを入れる箱を使いますよ!」とコンピューターに宣言する必要があります。書式は以下の通り。

データ型 変数名;

「データ型」というのは、「どんな種類のデータを入れる箱なのか」を指定するものです。C言語にはいくつかのデータ型がありますが、まずは基本となる以下の3つを覚えましょう。

  • int型 : 整数(-1, 0, 100 など、小数点のない数)を入れるための箱。
  • float型 または double型 : 小数(3.14, -0.5 など、小数点のある数)を入れるための箱。doubleの方がより大きな(またはより精密な)小数を扱えます。まずはdoubleを使うことが多いかもしれません。
  • char型 : 1文字('A', 'b', '!' など)を入れるための箱。シングルクォーテーション' 'で囲みます。

変数を使う例を見てみましょう。

#include <stdio.h>

int main(void) {
    // 変数の宣言 (箱の用意)
    int age;          // 整数を入れる age という名前の箱
    double height;    // 小数を入れる height という名前の箱
    char initial;     // 1文字を入れる initial という名前の箱

    // 変数に値を入れる (箱にデータを入れる) - これを「代入」と言います
    age = 30;
    height = 175.5;
    initial = 'T';

    // 変数の中身を表示してみる
    printf("年齢: %d 歳\n", age);      // %d は int型の変数を表示する時の目印
    printf("身長: %f cm\n", height);   // %f は double/float型の変数を表示する時の目印
    printf("イニシャル: %c\n", initial); // %c は char型の変数を表示する時の目印

    return 0;
}

実行結果はこうなります。

年齢: 30 歳
身長: 175.500000 cm
イニシャル: T

変数を宣言するときに、同時に値を入れる(初期化する)こともできます。

int score = 100; // 宣言と同時に 100 を代入 (初期化)

このように、変数とデータ型を使うことで、プログラムの中で様々な情報を扱えるようになります。

変数名の付け方のルール

変数に名前を付けるときにも、いくつかルールがあります。

  • 使える文字: 基本的に半角のアルファベット(大文字・小文字)、数字、アンダースコア_が使えます。
  • 最初の文字: 名前の最初の文字に数字は使えません。2aのような名前はNGです。
  • 予約語は使えない: intdoubleifforなど、C言語の構文として意味が決まっている言葉(予約語)は変数名にできません。
  • 長さ: 長さに制限はありますが、実用上は気にするほどではありません。
  • 大文字・小文字の区別: 先述の通り、ageAgeは別の変数として扱われます。

ルールを守っていればどんな名前でも付けられますが、その変数に何が入っているか、ひと目でわかるような名前を付けるのがおすすめです。例えば、年齢ならage、合計点ならtotal_scoretotalScoreのように。

// 良い例
int user_age = 25;
double average_score = 75.8;
char blood_type = 'A';

// あまり良くない例 (何が入っているかわかりにくい)
int a = 25;
double x = 75.8;
char c = 'A';

読みやすい名前を付ける習慣をつけておくと、後でコードを見返したときに、自分自身が助かりますよ。

計算や比較を行う基本構文 - 演算子

プログラムの醍醐味といえば、やはり計算ですよね。C言語には、計算や比較を行うための記号「演算子」が用意されています。

まずは、よく使う基本的な演算子を見てみましょう。

  • 算術演算子 (計算するための記号)
    • + : 足し算 (例: 5 + 3 → 8)
    • - : 引き算 (例: 5 - 3 → 2)
    • * : 掛け算 (例: 5 * 3 → 15)
    • / : 割り算 (例: 5 / 3 → 1 ※int型同士だと小数点以下は切り捨て)
    • % : 剰余 (割り算の余り) (例: 5 % 3 → 2)
  • 代入演算子 (変数に値を入れるための記号)
    • = : 右側の値を左側の変数に入れる (例: age = 30;)
  • 比較演算子 (2つの値を比べるための記号 - 結果は「正しい(真)」か「間違い(偽)」になる)
    • == : 等しい (例: a == b → aとbが等しければ真) =1つではない点に注意!
    • != : 等しくない (例: a != b → aとbが等しくなければ真)
    • > : より大きい (例: a > b → aがbより大きければ真)
    • < : より小さい (例: a < b → aがbより小さければ真)
    • >= : 以上 (例: a >= b → aがb以上なら真)
    • <= : 以下 (例: a <= b → aがb以下なら真)

実際のコードで使い方を見てみましょう。

#include <stdio.h>

int main(void) {
    int a = 10;
    int b = 3;
    int sum, diff, product, quotient, remainder;
    int is_equal, is_greater;

    // 算術演算
    sum = a + b;      // 足し算
    diff = a - b;     // 引き算
    product = a * b;  // 掛け算
    quotient = a / b; // 割り算 (int同士なので結果は3)
    remainder = a % b; // 剰余 (余り)

    printf("--- 算術演算 ---\n");
    printf("a + b = %d\n", sum);
    printf("a - b = %d\n", diff);
    printf("a * b = %d\n", product);
    printf("a / b = %d\n", quotient);
    printf("a %% b = %d\n", remainder); // %を表示するときは %% と書く

    // 比較演算 (結果は 真なら1, 偽なら0 になることが多い)
    is_equal = (a == b);   // aとbは等しいか? (偽なので0)
    is_greater = (a > b);  // aはbより大きいか? (真なので1)

    printf("\n--- 比較演算 ---\n");
    printf("a == b : %d (0なら偽, 1なら真)\n", is_equal);
    printf("a > b  : %d (0なら偽, 1なら真)\n", is_greater);

    return 0;
}

実行結果:

--- 算術演算 ---
a + b = 13
a - b = 7
a * b = 30
a / b = 3
a % b = 1

--- 比較演算 ---
a == b : 0 (0なら偽, 1なら真)
a > b  : 1 (0なら偽, 1なら真)

掛け算や割り算は、足し算や引き算よりも先に計算される、といった計算の優先順位がありますが、慣れないうちは計算順序をはっきりさせたい部分を括弧 () で囲むのがおすすめです。
例: (a + b) * c

処理の流れを変える基本構文 - 制御文(条件分岐 if)

プログラムは通常、上から下へ順番に処理を実行していきますが、ときには「もし○○だったら、こっちの処理をする」「そうでなければ、あっちの処理をする」というように、条件によって処理の流れを変えたい場合があります。これを「条件分岐」といい、C言語では主に`if`文を使います。

`if`文の基本的な形はこうです。

if (条件式) {
    // 条件式が正しい(真)場合に実行する処理
}

( )の中に比較演算子などを使って条件を書きます。その条件が満たされた(真だった)場合だけ、{ }の中の処理が実行されます。

例えば、点数が60点以上なら「合格」と表示するプログラムはこう書けます。

#include <stdio.h>

int main(void) {
    int score = 75;

    if (score >= 60) {
        printf("合格です!\n");
    }

    // score が 50 の場合は、ifの中は実行されず、何も表示されない

    return 0;
}

実行結果:

合格です!

さらに、「もし○○だったらAの処理、そうでなければBの処理」のように、条件が満たされなかった場合の処理も書きたいときは、`else`を使います。

if (条件式) {
    // 条件式が正しい(真)場合に実行する処理
} else {
    // 条件式が間違い(偽)場合に実行する処理
}

さっきの例に「不合格」の場合の処理を追加してみましょう。

#include <stdio.h>

int main(void) {
    int score = 45; // 点数を変えてみる

    if (score >= 60) {
        printf("合格です!\n");
    } else {
        printf("残念、不合格です...\n");
    }

    return 0;
}

実行結果:

残念、不合格です...

`if`文の中や`else`の中の処理が1行だけであっても、{ }で囲む癖をつけておくと、後で処理を追加したときに間違いが起こりにくくなります。

複数の条件分岐:else if

条件分岐が、「Aだったら」「そうじゃなくてBだったら」「さらにそうじゃなくてCだったら」「どれでもなかったら」のように、3つ以上の選択肢がある場合は、`else if`を使うと便利です。

if (条件式1) {
    // 条件式1が真の場合の処理
} else if (条件式2) {
    // 条件式1が偽で、条件式2が真の場合の処理
} else if (条件式3) {
    // 条件式1も2も偽で、条件式3が真の場合の処理
} else {
    // 上のどの条件式も偽だった場合の処理
}

else ifはいくつでも繋げることが可能です。条件は上から順番に判定され、最初に真になった箇所の処理だけが実行され、残りのelse ifelseは無視されます。

例えば、点数によって「優」「良」「可」「不可」を判定するプログラムです。

#include <stdio.h>

int main(void) {
    int score = 82;

    if (score >= 90) {
        printf("評価: 優\n");
    } else if (score >= 75) {
        printf("評価: 良\n"); // score=82 なので、ここが実行される
    } else if (score >= 60) {
        printf("評価: 可\n");
    } else {
        printf("評価: 不可\n");
    }

    return 0;
}

実行結果:

評価: 良

ifelse ifelseを使いこなせると、プログラムに様々な判断をさせることができ、ぐっと複雑なことができるようになりますね。

処理を繰り返す基本構文 - 制御文(ループ for, while)

プログラムでは、同じような処理を何度も繰り返したい場面がよくあります。例えば、「"Hello"と10回表示する」とか「1から100までの数字を足し合わせる」とか。こういう繰り返し処理を実現するのが「ループ文」(または繰り返し文)です。C言語では主に`for`文`while`文が使われます。

`for`文は、主に繰り返す回数があらかじめ決まっている場合によく使われます。基本的な形は少し複雑に見えますが、慣れると便利です。

for (初期化処理; 繰り返し条件; 更新処理) {
    // 繰り返したい処理
}
  • 初期化処理: ループが始まる前に一度だけ実行されます。ループ用のカウンター変数を準備することが多いです (例: int i = 0;)。
  • 繰り返し条件: ループを続けるかどうかを毎回チェックする条件式です (例: i < 10;)。条件が真の間、ループは続きます。
  • 更新処理: ループの中の処理が一回終わるたびに実行されます。カウンター変数を増やしたり減らしたりすることが多いです (例: i++ これは i = i + 1 と同じ意味)。

例えば、「Hello!」を5回表示するプログラムです。

#include <stdio.h>

int main(void) {
    int i; // カウンター用の変数

    // iを0から始めて、iが5未満の間(0,1,2,3,4)、処理を繰り返し、
    // 1回終わるごとに i を 1 増やす
    for (i = 0; i < 5; i++) {
        printf("Hello! (%d回目)\n", i + 1); // iは0から始まるので、表示はi+1にする
    }

    return 0;
}

実行結果:

Hello! (1回目)
Hello! (2回目)
Hello! (3回目)
Hello! (4回目)
Hello! (5回目)

一方、`while`文は、特定の条件が満たされている間、処理を繰り返したい場合に使われます。繰り返す回数が事前に決まっていない場合などに便利です。

while (繰り返し条件) {
    // 繰り返したい処理
    // ※ 条件がいつか偽になるように、ループ内で状態を変化させる処理が必要
}

ループの開始前に条件がチェックされ、真であれば{ }の中の処理が実行されます。処理が終わると、再び条件がチェックされ…という流れです。条件が偽になった時点でループは終了します。

例えば、合計が100を超えるまで数値を足し続けるプログラムです。(入力部分は簡略化のため省略し、固定値で例を示します)

#include <stdio.h>

int main(void) {
    int sum = 0;
    int number = 15; // 例として毎回15を足す

    // 合計(sum)が100未満の間、ループを続ける
    while (sum < 100) {
        printf("現在の合計: %d\n", sum);
        sum = sum + number; // sumにnumberを加算
        printf("  %d を足しました。新しい合計: %d\n", number, sum);
    }

    printf("\n最終的な合計: %d (100以上になりました)\n", sum);

    return 0;
}

実行結果:

現在の合計: 0
  15 を足しました。新しい合計: 15
現在の合計: 15
  15 を足しました。新しい合計: 30
現在の合計: 30
  15 を足しました。新しい合計: 45
現在の合計: 45
  15 を足しました。新しい合計: 60
現在の合計: 60
  15 を足しました。新しい合計: 75
現在の合計: 75
  15 を足しました。新しい合計: 90
現在の合計: 90
  15 を足しました。新しい合計: 105

最終的な合計: 105 (100以上になりました)

while文を使うときは、ループ内の処理で、いつか必ず条件が偽になるように気をつけましょう。そうしないと、無限にループし続けてプログラムが終わらなくなってしまいます(無限ループ)。

よく使う処理をまとめる基本構文 - 関数

プログラムを書いていると、「あれ、この計算さっきも書いたな」「この表示処理、いろんな場所で使うな」というように、同じような処理の塊が何度も出てくることがあります。そんなとき、その処理の塊に名前を付けて、ひとまとめにしておくと便利です。この「名前付きの処理の塊」のことを「関数」と呼びます。

実は、皆さんが最初に見た`main`も関数の一種です。プログラムの開始点という特別な役割を持った関数ですね。また、画面に文字を表示するために使った`printf`も、C言語にあらかじめ用意されている便利な関数(ライブラリ関数)の一つです。

関数は自分で作ることもできます。自分で関数を作ることを「関数を定義する」と言います。基本的な形はこうです。

戻り値の型 関数名(引数リスト) {
    // 関数の処理内容
    return 戻り値; // 戻り値がある場合
}
  • 戻り値の型: 関数が処理を終えた後、呼び出し元に返すデータの型を指定します (例: int, double)。何も返さない場合はvoidと書きます。
  • 関数名: 関数の名前です。変数名と同じようなルールで、わかりやすい名前を付けます。
  • 引数リスト: 関数が処理を行うために、呼び出し元から受け取るデータ(情報)を指定します。( )の中にデータ型 仮引数名の形で書きます。複数ある場合はカンマ,で区切ります。何も受け取らない場合は(void)と書きます。
  • 処理内容: { }の中に、この関数が行う具体的な処理を書きます。
  • return 戻り値: 関数が何か値を返す場合、return文を使ってその値を呼び出し元に返します。戻り値の型がvoidの場合はreturn文は不要(またはreturn;と書くことも)です。

例えば、2つの整数を受け取って、その合計を計算して返す関数addを作ってみましょう。

// 関数 add の定義
int add(int a, int b) {
    int result = a + b; // 受け取った a と b を足す
    return result;      // 計算結果を返す
}

作った関数を使う(呼び出す)には、関数名(引数)のように書きます。

#include <stdio.h>

// add関数の定義 (mainより前か、後で定義する場合はmainより前に宣言が必要)
int add(int a, int b) {
    int result = a + b;
    return result;
}

// 挨拶を表示する関数 (戻り値なし、引数なし)
void say_hello(void) {
    printf("こんにちは!\n");
}

int main(void) {
    int num1 = 5;
    int num2 = 10;
    int sum_result;

    // add関数を呼び出して、結果を変数 sum_result に入れる
    sum_result = add(num1, num2);
    printf("%d + %d = %d\n", num1, num2, sum_result);

    // say_hello関数を呼び出す
    say_hello();

    return 0;
}

実行結果:

5 + 10 = 15
こんにちは!

関数を使うメリットはたくさんあります。

  • コードの再利用: 同じ処理を何度も書かなくて済む。
  • 整理整頓: プログラムを機能ごとに部品分けできるので、構造がわかりやすくなる。
  • 修正が楽: もし処理内容を変更したくなっても、関数の定義部分だけを直せば、その関数を使っている箇所すべてに反映される。

最初は少し難しく感じるかもしれませんが、関数を使いこなせるようになると、より大きなプログラムを効率的に作れるようになりますよ。

C言語の基本構文 - 簡単な実践例

さあ、これまで学んできた基本構文(変数、演算子、if文、printfなど)を組み合わせて、簡単なプログラムを作ってみましょう!

ここでは、「ユーザーに整数を入力してもらい、その数が偶数か奇数かを判定して表示する」プログラムを作成します。偶数か奇数かは、2で割った余りが0かどうかで判断できますね。%演算子が活躍しそうです。

#include <stdio.h>

int main(void) {
    int number; // ユーザーが入力する整数を入れる変数

    // 1. ユーザーに入力を促すメッセージを表示
    printf("整数を入力してください: ");

    // 2. ユーザーが入力した整数を number 変数に読み込む
    // scanf はキーボードからの入力を受け取る関数
    // %d で整数として読み込み、 &number で number 変数の場所を指定
    scanf("%d", &number); // scanfを使うためのお約束として&が必要です

    // 3. 入力された数が偶数か奇数か判定する
    // 2で割った余り(number % 2)が0と等しいか?
    if (number % 2 == 0) {
        // 余りが0なら偶数
        printf("%d は偶数です。\n", number);
    } else {
        // 余りが0でなければ奇数
        printf("%d は奇数です。\n", number);
    }

    return 0;
}

これを実行して、例えば 10 と入力すると…

整数を入力してください: 10
10 は偶数です。

と表示されます。もし 7 と入力すれば…

整数を入力してください: 7
7 は奇数です。

となります。

どうでしょうか? 変数でデータを持ち、scanfで入力を受け取り、%演算子で計算し、if文で条件分岐して、printfで結果を表示する、という流れが見えましたか?

一つ一つの構文はシンプルでも、組み合わせることで意味のある処理が実現できるのが、プログラミングの面白いところです。

【まとめ】C言語 基本構文を理解して次のステップへ

お疲れ様でした! この記事では、C言語プログラミングの第一歩となる基本構文について、駆け足で見てきました。

  • プログラムの基本構造 (main関数、#include{};)
  • 最低限のルール (大文字小文字の区別、コメント)
  • データを入れる箱 (変数とデータ型 int, double, char)
  • 計算や比較 (演算子 +, -, *, /, %, ==, > など)
  • 条件による処理分岐 (if, else if, else)
  • 繰り返しの処理 (for, while)
  • 処理の部品化 (関数)

これらの基本構文は、いわばC言語という言葉の「単語」や「基本的な文法」です。これを理解していれば、簡単なプログラムを読んだり書いたりする基礎ができたと言えるでしょう。

もちろん、C言語には配列、ポインタ、構造体など、もっとたくさんの機能や構文があります。でも、それらを学ぶ上でも、今回学んだ基本構文の知識は絶対に土台となります。

一番の上達のコツは、実際に自分でコードを書いて、動かしてみることです。この記事のサンプルコードを写して(写経して)動かすだけでも、大きな一歩です。

エラーが出ても、めげずに原因を探ってみてください。その試行錯誤が、皆さんを確実に成長させてくれます。

これでC言語の基礎はバッチリ!自信を持って、次のステップに進んでいってくださいね。応援しています!


【関連記事】

>> C言語とは?特徴・できること・学ぶメリット

このブログを検索

  • ()

自己紹介

自分の写真
リモートワークでエンジニア兼Webディレクターとして活動しています。プログラミングやAIなど、日々の業務や学びの中で得た知識や気づきをわかりやすく発信し、これからITスキルを身につけたい人にも役立つ情報をお届けします。 note → https://note.com/yurufuri X → https://x.com/mnao111

QooQ