Cプログラミング
 Computer >> コンピューター >  >> プログラミング >> Cプログラミング

C言語における配列の前置インクリメントと後置インクリメントの違いを解説

問題の概要

C言語のサンプルプログラムを通じて、配列に対する後置インクリメント(post-increment)前置インクリメント(pre-increment)の概念をわかりやすく解説します。

解決策:インクリメント演算子(++)とは

インクリメント演算子(++)は、変数の値を1だけ増加させるための演算子です。主な特徴は以下のとおりです。

  • 変数の値を1増やす目的で使用されます。
  • 「前置インクリメント」と「後置インクリメント」の2種類があります。
  • 前置インクリメント:演算子をオペランドの前に記述します。先に値が1増やされ、その新しい値に対して処理が行われます。
例:z = ++a;
  a = a + 1;  // 先に a を1増やす
  z = a;      // 増やした後の値を z に代入
  • 後置インクリメント:演算子をオペランドの後に記述します。まず現在の値で処理を行い、その後で値が1増やされます。
例:z = a++;
  z = a;      // 先に現在の a の値を z に代入
  a = a + 1;  // その後で a を1増やす

それでは、前置・後置インクリメントを使って、メモリ上の配列の特定の要素へアクセスする具体的な例を見てみましょう。

サイズ5のint型配列を宣言してコンパイル時に初期化し、その後、前置インクリメントした値を変数「a」に代入してみます。

a = ++arr[1];  // 先に arr[1] = arr[1] + 1 を実行してから a に代入
b = arr[1]++;  // 先に現在の arr[1] の値を b に代入してから arr[1] = arr[1] + 1

例1

#include<stdio.h>
int main(){
    int a, b, c;
    int arr[5] = {1, 2, 3, 25, 7};
    a = ++arr[1];
    b = arr[1]++;
    c = arr[a++];
    printf("%d--%d--%d", a, b, c);
    return 0;
}

出力

4--3--25

解説

a = ++arr[1];
→ 前置インクリメントのため、arr[1] が 2 から 3 に増え、a には 3 が代入される。

b = arr[1]++;
→ 後置インクリメントのため、b には増加前の値 3 が代入され、その後 arr[1] は 4 になる。

c = arr[a++];
→ 後置インクリメントのため、まず a の現在値 3 で arr[3](= 25)が c に代入され、その後 a は 4 に増える。

printf("%d--%d--%d", a, b, c);
printf("%d--%d--%d", 4, 3, 25);
よって、出力は 4--3--25 となる。

例2

続いて、別の例で前置・後置インクリメントの挙動をさらに詳しく確認してみましょう。

#include<stdio.h>
int main(){
    int a, b, c;
    int arr[5] = {1, 2, 3, 25, 7};
    a = ++arr[3];
    b = arr[3]++;
    c = arr[a++];
    printf("%d--%d--%d", a, b, c);
    return 0;
}

出力

27--26--0

解説

a = ++arr[3];
→ 前置インクリメントにより、arr[3] が 25 から 26 に増え、a には 26 が代入される。

b = arr[3]++;
→ 後置インクリメントにより、b には増加前の値 26 が代入され、その後 arr[3] は 27 になる。

c = arr[a++];
→ a の現在値は 26 であるため、c には arr[26] の値が代入される。

printf("%d--%d--%d", a, b, c);
→ a は 27、b は 26 になっているため、出力は 27--26--0 となる。

注意:例2では arr[26] へのアクセスが発生しており、これは配列の範囲を超えた不正なメモリ参照です。C言語において範囲外アクセスの結果は未定義動作(undefined behavior)となるため、出力値はコンパイラや実行環境によって異なる可能性があります。実務では、添字が必ず配列の範囲内に収まるよう十分な注意が必要です。

  1. C言語入門:モノリシックプログラミングとモジュラープログラミングの違いを徹底解説

    本記事では、C言語におけるモノリシックプログラミングとモジュラープログラミングの違いを、それぞれのメリット・デメリットとともに詳しく解説します。 モノリシックプログラミングとは プログラム全体を1つの関数、すなわちmain関数だけですべて記述する方式を「モノリシック(一枚岩)型プログラミング」と呼びます。しかし、すべてのロジックを単一の関数に詰め込むのは、良いプログラミングスタイルとは言えません。 デメリット モノリシックプログラミングには、以下のような欠点があります。 プログラムが非常に大きく、複雑になりやすい。 デバッグ、テスト、保守が非常に困難になる。 モジュラープログラミングとは

  2. C言語のアルゴリズムとフローチャートとは?基礎をわかりやすく解説

    アルゴリズムとは、問題を解決するために役立つ、段階的に実行される手順のことです。この手順を英語のような文章形式で記述したものを「疑似コード(PSEUDO CODE)」と呼びます。アルゴリズムが満たすべき5つの特性正しいアルゴリズムには、以下の5つの特性が備わっている必要があります。入力(Input)出力(Output)有限性(Finiteness)明確性(Definiteness)有効性(Effectiveness)アルゴリズムの例3つの数値の平均を求めるアルゴリズムは、以下のように記述できます。開始する3つの数値 a、b、c を読み込む合計 = a + b + c を計算する平均 = 合計