C 언어 증감 연산자 마스터하기: 사용법 & 모범 사례
C - 증감 연산자
증가 연산자(++)는 변수 값을 1 증가시키고, 감소 연산자(--)는 변수 값을 1 감소시킵니다.
증감 연산자는 C에서 카운트 루프(for 루프) 구성에 자주 사용됩니다. 배열 순회와 포인터 연산에도 활용됩니다.
++와 -- 연산자는 단항 연산자이며, 변수에 접두사(prefix) 또는 접미사(postfix)로 사용할 수 있습니다.
증감 연산자 예제
다음 예제는 증감 연산자를 다양한 변형으로 사용하는 여러 문을 포함합니다.
#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;과 동등합니다.
증가 연산자 유형
증가 연산자는 전위 증가(pre-increment)와 후위 증가(post-increment) 두 가지 유형이 있습니다.
전위(Prefix) 증가 연산자
표현식에서 전위 증가 연산자는 변수 값이 사용되기 전에 변수 값을 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
후위(Postfix) 증가 연산자
표현식에서 후위 증가 연산자는 변수 값이 사용된 후에 변수 값을 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
감소 연산자 유형
감소 연산자는 전위 감소(pre-decrement)와 후위 감소(post-decrement) 두 가지 유형이 있습니다.
전위(Prefix) 감소 연산자
표현식에서 전위 감소 연산자는 변수 값이 사용되기 전에 변수 값을 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
후위(Postfix) 감소 연산자
표현식에서 후위 감소 연산자는 변수 값이 사용된 후에 변수 값을 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 값을 출력한 후 값을 증가시킵니다. 두 번째 경우, 증가 연산자가 먼저 실행되어 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