マスター C インクリメント演算子とデクリメント演算子:使用法とベスト プラクティス
C - インクリメント演算子とデクリメント演算子
インクリメント演算子 (++) は変数の値を 1 ずつインクリメントし、デクリメント演算子 (--) は値をデクリメントします。
インクリメント演算子とデクリメント演算子は、C のカウント ループ (for ループを使用) の構築で頻繁に使用されます。また、配列とポインタの算術演算にも応用できます。
++ 演算子と -- 演算子は単項であり、変数の接頭辞または後置として使用できます。
インクリメント演算子とデクリメント演算子の例
次の例には、さまざまなバリエーションを持つインクリメント演算子とデクリメント演算子の使用を示す複数のステートメントが含まれています -
#include <stdio.h>
int main() {
int a = 5, b = 5, c = 5, d = 5;
a++; // postfix increment
++b; // prefix increment
c--; // postfix decrement
--d; // prefix decrement
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 を加算し、その結果が 1 に戻されることにより、「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("postfix increment a: %c\n", a);
++b;
printf("prefix increment b: %c\n", b);
printf("x: %d y: %d\n", x, y);
x--;
printf("postfix decrement x : %d\n", x);
--y;
printf("prefix decrement y : %d\n", y);
return 0;
}
出力
このコードを実行すると、次の出力が生成されます-
a: a b: M postfix increment a: b prefix increment b: N x: 5 y: 23 postfix decrement x: 4 prefix decrement 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("postfix increment x: %d\n", x++);
printf("prefix increment y: %d\n", ++y);
return 0;
}
出力
コードを実行し、その出力を確認します-
x: 5 y: 5 postfix increment x: 5 prefix increment 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」をインクリメントする前に、「x」の既存の値が「z」に割り当てられます。
例 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
「z」だけでなく「y」の値も 6 になったため、結果は混乱を招く可能性があります。その理由は、接頭辞増分演算子が代入演算子よりも優先順位が高いためです。したがって、「y」が最初にインクリメントされてから、その新しい値が「z」に割り当てられます。
演算子の結合性も重要な役割を果たします。インクリメント演算子とデクリメント演算子の場合、結合性は左から右になります。したがって、1 つの式に複数のインクリメント演算子またはデクリメント演算子がある場合は、左端の演算子が最初に実行され、右に移動します。
例 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言語