SS-Infra ← ポータルに戻る
← 目次一覧に戻る

【第3回】C言語の配列と演算子:複数のデータ管理と計算の基本を知ろう

1. はじめに:複数のデータをまとめて効率よく扱おう

前回は、C言語におけるデータ型と変数、メモリサイズ、そして文字コードの仕組みについて確認しました。

プログラムを作っていくと、1つの変数に1つの値を入れるだけではなく、「複数のデータをまとめて管理したい」「数値の計算を行いたい」という場面が必ず出てきます。

PHPなどの言語では、配列(Array)は非常に柔軟で様々な型を一つの箱に入れられますが、C言語の配列は「同じデータ型の変数を連続して並べたもの」という厳密なルールを持っています。

今回は、C言語における1次元配列・2次元配列の仕組み、文字列を表現する char 配列の終端文字、そして四則演算やインクリメントなどの各種演算子の使い方を確認していきましょう。

2. 1次元配列と要素数指定・添え字のルール

C言語で複数の同じ型のデータをまとめて扱うために使用するのが配列です。

宣言と初期化の基本

例えば、以下のように直近5日間のサーバーアクセス数を格納する配列を宣言・初期化できます。

int daily_access[5] = {12500, 14200, 9800, 15600, 18900};

宣言時とアクセス時の意味の違い

【注意】配列の範囲外アクセスについて C言語では、宣言した範囲外(例: 存在しない daily_access[5] や daily_access[10] など)にアクセスしても、自動的なエラー(例外)にはなりません。 添え字が定数の場合はコンパイラが警告(-Warray-bounds など)を出してくれることもありますが、あくまで警告であり、コンパイル自体は通って実行できてしまいます。 しかし、これは他のメモリ領域を破壊してしまう重大なバグやセキュリティリスクの原因になるため、添え字の範囲には細心の注意を払う必要があります。

3. 多次元配列(2次元配列)

テーブル(行・列)や、時間帯ごとのサーバー負荷状況のような2次元構造を表現したい場合には、2次元配列を使用します。

以下は「行=時間帯(朝・昼・夜)」「列=サーバー3台(Web1・Web2・DB)」のCPU使用率(%)を格納する例です。

int server_metrics[3][3] = {
    {25, 40, 30},   /* 朝: server_metrics[0][0]=Web1, [0][1]=Web2, [0][2]=DB */
    {65, 80, 75},   /* 昼: server_metrics[1][0]=Web1, [1][1]=Web2, [1][2]=DB */
    {35, 50, 45}    /* 夜: server_metrics[2][0]=Web1, [2][1]=Web2, [2][2]=DB */
};

4. 文字列と char 配列(終端文字 \0)

C言語には、PHPやPythonのような専用の「文字列型」というデータ型が存在しません。その代わり、char 型の配列を使って文字列を表現します。

char hostname[30] = "api-server-01";

5. 四則演算と % 記号の出力表示

C言語でも、一般的なプログラミング言語と同様に四則演算や剰余算(余りを求める計算)を行うことができます。

実装サンプルプログラム

以下のコードを calc.c などのファイルで作成し、動作を確認してみましょう。

#include <stdio.h>

int main(void)
{
    int total_requests = 1050;
    int error_count = 24;

    printf("%d + %d = %d\n", total_requests, error_count, total_requests + error_count);       /* 加算 */
    printf("%d - %d = %d\n", total_requests, error_count, total_requests - error_count);       /* 減算 */
    printf("%d * %d = %d\n", total_requests, error_count, total_requests * error_count);       /* 乗算 */
    printf("%d / %d = %d\n", total_requests, error_count, total_requests / error_count);       /* 除算(整数同士の割り算は小数点以下切り捨て) */
    printf("%d %% %d = %d\n", total_requests, error_count, total_requests % error_count);      /* 剰余算(あまり) */

    return 0;
}

実行すると、除算の結果は 43 と表示されます。本来 1050 ÷ 24 は 43.75 ですが、int 型同士の割り算では小数点以下が切り捨てられるためです。そして切り捨てられた分の余りが、剰余算の結果である 18 に相当します。

printf 内での % 記号の表示

printf の書式文字列の中で % 自体を画面に表示したい場合は、%% と2つ重ねて記述する必要があります(\% ではない点に注意してください)。上記のサンプルコードでも %% を使って余りの計算式を表示しています。

6. インクリメント・デクリメント演算子と複合代入演算子

プログラムでは、変数に「1を足す」「指定した値を足す」といった処理を頻繁に行います。

インクリメント・デクリメント演算子

種類 記述 実行タイミングと評価値
後置インクリメント a++ 式を評価・使用した後に a を 1 増やす
前置インクリメント ++a a を 1 増やした後に式を評価・使用する
後置デクリメント a-- 式を評価・使用した後に a を 1 減らす
前置デクリメント --a a を 1 減らした後に式を評価・使用する

複合代入演算子

演算と代入をまとめて記述する記法です(PHPやJavaなど他の多くの言語と同等のルールです)。

7. まとめと次回予告

今回は、複数のデータをまとめて管理する「1次元配列・2次元配列」、文字列の裏側を支える char 配列と終端文字 \0、そして計算を行う各種演算子の仕組みを確認しました。

今回学んだ内容を整理すると、次のとおりです。

今回の内容を通して、変数を複数扱う方法や計算の基本が把握できたかと思います。

次回は、プログラムの流れを分岐するための「条件分岐(if文・switch文)」について学びます。実際のコードを動かしながら、より動的なプログラムの書き方を確認していきましょう。

【お役立ちツールのご案内】

C言語やPHPの学習を進める中で、ご自身の書いたコードや既存のプロジェクトにセキュリティ上のリスクや古い書き方(非推奨関数など)が混ざっていないか気になった際は、安全な字句解析(token_get_all())で一括スキャンできる当サイトの PHPレガシーコードスキャナー もぜひご活用ください。