C言語インクリメント・デクリメント演算子完全マスター:使い方とベストプラクティス
C言語 - インクリメントとデクリメント演算子
インクリメント演算子(++)は変数の値を1増やし、デクリメント演算子(--)は値を1減らします。
インクリメントとデクリメント演算子は、C言語でのカウントループ(forループ)構築で頻繁に使用されます。また、配列走査とポインタ演算にも応用があります。
++と--演算子は単項演算子であり、変数の前置(プレフィックス)または後置(ポストフィックス)として使用できます。
インクリメント・デクリメント演算子の例
以下の例は、インクリメント・デクリメント演算子を様々なバリエーションで使用する複数の文を含みます:
#include <stdio.h>
int main() {
int a = 5, b = 5, c = 5, d = 5;
a++; // 後置インクリメント
++b; // 前置インクリメント
c--; // 後置デクリメント
--d; // 前置デクリメント
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("c = %d\n", c);
printf("d = %d\n", d);
return 0;
}
出力
このコードを実行すると、以下の出力が得られます:
a = 6 b = 6 c = 4 d = 4
例の説明
つまり、「a++」は「++a」と同じ効果を持ち、両方とも変数「a」の値を1増やします。同様に、「a--」は「--a」と同じ効果です。
式「a++;」は文「a = a + 1;」と同等と見なせます。右辺の式が「a」に1を加え、結果が再び「a」に代入されるため、「a」の値が1増加します。
同様に、「b--;」は「b = b - 1;」と同等です。
インクリメント演算子の種類
インクリメント演算子には2種類あります——前置インクリメントと後置インクリメント。
前置(プレフィックス)インクリメント演算子
式において、前置インクリメント演算子は変数の値が使用される前に、変数の値を1増やします。
構文
++variable_name;
例
以下の例では前置インクリメント演算子を使用しており、「x」の値が1増やされた後、増加した値が式で使用されます。
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + ++x;
printf("x = %d, y = %d\n", x, y);
return 0;
}
このコードを実行すると、以下の出力が得られます:
x = 11, y = 21
後置(ポストフィックス)インクリメント演算子
式において、後置インクリメント演算子は変数の値が使用された後で、変数の値を1増やします。
構文
variable_name++;
例
以下の例では後置インクリメント演算子を使用しており、「x」の値が式で使用された後、1増やされます。
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + x++;
printf("x = %d, y = %d\n", x, y);
return 0;
}
このコードを実行すると、以下の出力が得られます:
x = 11, y = 20
デクリメント演算子の種類
デクリメント演算子には2種類あります——前置デクリメントと後置デクリメント。
前置(プレフィックス)デクリメント演算子
式において、前置デクリメント演算子は変数の値が使用される前に、変数の値を1減らします。
構文
--variable_name;
例
以下の例では前置デクリメント演算子を使用しており、「x」の値が1減らされた後、減少した値が式で使用されます。
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + --x;
printf("x = %d, y = %d\n", x, y);
return 0;
}
このコードを実行すると、以下の出力が得られます:
x = 9, y = 19
後置(ポストフィックス)デクリメント演算子
式において、後置デクリメント演算子は変数の値が使用された後で、変数の値を1減らします。
構文
variable_name--;
例
以下の例では後置デクリメント演算子を使用しており、「x」の値が式で使用された後、1減らされます。
#include <stdio.h>
int main() {
int x = 10;
int y = 10 + x--;
printf("x = %d, y = %d\n", x, y);
return 0;
}
このコードを実行すると、以下の出力が得られます:
x = 9, y = 20
インクリメント・デクリメント演算子のさらなる例
例1
以下の例は、前置/後置インクリメント/デクリメントの使用を強調しています:
#include <stdio.h>
int main(){
char a = 'a', b = 'M';
int x = 5, y = 23;
printf("a: %c b: %c\n", a, b);
a++;
printf("後置インクリメント a: %c\n", a);
++b;
printf("前置インクリメント b: %c\n", b);
printf("x: %d y: %d\n", x, y);
x--;
printf("後置デクリメント x: %d\n", x);
--y;
printf("前置デクリメント y: %d\n", y);
return 0;
}
出力
このコードを実行すると、以下の出力が得られます:
a: a b: M 後置インクリメント a: b 前置インクリメント b: N x: 5 y: 23 後置デクリメント x: 4 前置デクリメント y: 22
上記例は、前置および後置演算子がオペランド変数の値に同じ効果を持つことを示しています。しかし、これらの「++」または「--」演算子が式の中で他の演算子と共に現れる場合、振る舞いが異なります。
例2
以下のコードでは、「a」と「b」変数の初期値は同じですが、printf()関数は異なる値を表示します:
#include <stdio.h>
int main(){
int x = 5, y = 5;
printf("x: %d y: %d\n", x,y);
printf("後置インクリメント x: %d\n", x++);
printf("前置インクリメント y: %d\n", ++y);
return 0;
}
出力
コードを実行して出力を確認してください:
x: 5 y: 5 後置インクリメント x: 5 前置インクリメント y: 6
最初のケースでは、printf()関数が「x」の値を表示してから値を増やします。2番目のケースでは、インクリメント演算子が最初に実行され、printf()関数が増加した値を使用して表示します。
インクリメント・デクリメント演算子の演算子優先順位
C言語には多数の演算子があります。式で複数の演算子が使用される場合、それらは優先順位に従って実行されます。インクリメント・デクリメント演算子は他の演算子と共に使用される時、異なる振る舞いをします。
式がインクリメントまたはデクリメント演算子と他の演算子で構成される場合、インクリメント・デクリメント演算が最初に実行されます。後置インクリメント・デクリメント演算子は前置インクリメント・デクリメント演算子より高い優先順位を持ちます。
関連記事: C言語の演算子優先順位
例1
以下の例を見てみましょう:
#include <stdio.h>
int main(){
int x = 5, z;
printf("x: %d \n", x);
z = x++;
printf("x: %d z: %d\n", x, z);
return 0;
}
出力
コードを実行して出力を確認してください:
x: 5 x: 6 z: 5
「x++」が「x」の値を6に増やすので、「z」も6になると期待するかもしれません。しかし、結果は「z」が5です。これは代入演算子が後置インクリメント演算子より高い優先順位を持つためです。したがって、「x」の既存値が「z」に代入されてから「x」がインクリメントされます。
例2
もう一つの例を見てみましょう:
#include <stdio.h>
int main(){
int x = 5, y = 5, z;
printf("x: %d y: %d\n", x,y);
z = ++y;
printf("y: %d z: %d\n", y ,z);
return 0;
}
出力
このコードを実行すると、以下の出力が得られます:
y: 5 y: 6 z: 6
結果は混乱するかもしれません。「y」と「z」の両方が6になっています。理由は前置インクリメント演算子が代入演算子より高い優先順位を持つためです。したがって、「y」が最初にインクリメントされ、その後新しい値が「z」に代入されます。
演算子の結合規則も重要な役割を果たします。インクリメント・デクリメント演算子の結合規則は左から右です。したがって、単一の式に複数のインクリメントまたはデクリメント演算子がある場合、左端の演算子が最初に実行され、右へ進みます。
例3
この例では、代入式に前置および後置演算子の両方が含まれています。
#include <stdio.h>
int main(){
int x = 5, y = 5, z;
z = x++ + ++y;
printf("x: %d y: %d z: %d\n", x,y,z);
return 0;
}
出力
コードを実行して出力を確認してください:
x: 6 y:6 z: 11
この例では、最初に実行される演算は「++y」(「y」が6になる)です。次に「+」演算子が「x」(5)と「y」を加算し、結果が「z」に11として代入され、その後「x++」が「x」を6に増やします。
ループでのインクリメント演算子使用
C言語では、forループの最も一般的な構文は以下の通りです:
for (init_val; final_val; increment) {
statement(s);
}
例
ループ本体は、初期値と最終値の間の変数のすべての値に対して実行され、各ラウンド後にインクリメントされます。
#include <stdio.h>
int main(){
int x;
for (x = 1; x <= 5; x++){
printf("x: %d\n", x);
}
return 0;
}
出力
このコードを実行すると、以下の出力が得られます:
x: 1 x: 2 x: 3 x: 4 x: 5
C言語
- C言語の文字ポインタと関数活用をマスターする
- C#データ型完全解説:int、double、bool、string等の使い方と実例
- C#のポリモーフィズム:静的バインディングと動的バインディングを徹底解説
- C vs C++: 主な違いとそれぞれを選ぶべきケース
- .NETとC#のバージョン履歴完全ガイド
- C++ポインタ完全ガイド:仕組みと実践例
- C 言語動的メモリ割り当て: malloc、calloc、realloc、free をマスター
- C++ do-while文:構文、実践例、ネストしたループ
- C# アクセス修飾子を理解する:public、private、protected、internal など
- C#の演算子オーバーロード:カスタム型で演算子を再定義する
- C# 面接質問トップ50 & 回答 (2021年版) – 初心者から経験豊富な開発者まで