728x90
반응형
증감 연산자 (increment and decrement operators)
C 언어에서 증감 연산자는 변수의 값을 1씩 증가시키거나 감소시키는 연산자입니다.
++ 연산자는 증가 연산자이며, 변수의 값을 1 증가 시킵니다.(Increment Operator)
반면, -- 연산자는 감소 연산자이며, 변수의 값을 1 감소 시킵니다.(Derement Operator)
증감 연산자는 단항 연산자이므로 하나의 피연산자를 가지며,
피연산자는 반드시 변수여야 합니다. 증감연산자는 변수를 사용하여 반복문을 작성하는데 유용하게 사용됩니다.
예를 들어, for 루프의 조건 부분에서 증감 연산자를 사용하여 반복 횟수를 제어할 수 있습니다.
또한 증감 연산자는 변수의 값을 변경하면서도 해당 변수를 다른 표현식에서 사용할 수 있으므로
코드의 가독성과 간결성을 높이는 데 도움이 됩니다.
e.g.
void main() {
int i = 3;
int j = 4;
if ((++i > j--) && (i++ < --j))
i = i-- + ++j;
else
j = i-- - --j;
printf("%d %d\n", i, j);
}
※※아래 내용에 오류가 있습니다! ※※
- 변수 i와 j에 각각 3과 4를 할당합니다.
- 첫 번째 논리 연산자인 &&의 왼쪽 피연산자인 ++i > j-- 을 계산합니다.
i는 먼저 1 증가하여 4가 되고, j는 1 감소하여 3이 됩니다. 따라서 이 식은 true(참)이 됩니다. ***** - 두번째 논리 연산자의 &&의 오른쪽 피연산자인 i++ < --j 을 계산합니다.
이 때 i는 4로 유지되고, j는 2로 감소합니다. 따라서 이 식은 false(거짓)이 됩니다. - 전체 식의 값은 false(거짓)이 되므로 else 블록이 실행됩니다.
- else 블록의 첫 번째 문장 j = i -- - --j 를 계산합니다.
i 는 3으로 감소하고, j 는 1 로 감소합니다. 따라서 j 에는 2가 할당됩니다. - printf 함수를 호출하여 i 와 j 의 값을 출력합니다.
이 때, i 는 3으로 유지되고, j 는 2 로 변경되어 출력됩니다.
따라서 출력 값은 "3 2"가 됩니다.
*****
전위 연산자와 후위 연산자는 피연산자의 값을 변경하는 방식에서 차이가 있습니다.
전위 연산자는 피연산자의 값을 먼저 증가시킨 다음, 변경된 값을 반환합니다.
반면 후위 연산자는 피연산자의 값을 반환한 다음에 값을 증가 시킵니다.
따라서, 전위연산자를 사용한 ++i 는 먼저 i 를 증가시키고, 증가된 값을 조건식에서 사용합니다.
그리고 후위연산자를 사용한 j-- 는 값을 반환하기 전에 j를 1 감소시키므로 4에서 1을 감소시켜 3이 됩니다.
※※ 수정 내용 ※※
C언어에서 논리 연산자는 short-circuit evaluation을 따르기 때문에,
왼쪽 피연산자가 이미 거짓인 경우 오른쪽 피연산자는 계산되지 않습니다.
즉, 첫번째 논리연산자의 왼쪽 피연산자의 (++i > j--) 는 4 > 4 로서 false로 출력되고
오른쪽 피연산자인 (i++ < --j)는 평가하지 않고 전체 식의 결과는 거짓(false)입니다.
따라서 컴파일러가 오른쪽 피연산자를 수행하지 않습니다.
e.g.
int main() {
int i = 3;
int j = 4;
if ((++i > j--) || (i++ < --j))
i = i-- + ++j;
else
j = i-- - --j;
printf("%d %d\n", i, j); // 4 4
}
e.g.
int main() {
int a = 20, b = 30;
if (a++ <= 20 || ++b > 30)
b++;
printf("%d, %d\n", a++, b); //21, 31
return 0;
}
e.g.
int main() {
int a = 3 + 5, b = 1, c;
int ap, bp;
ap = a++;
bp = ++b;
b = 3 * (ap == 8);
c = 5 * (ap != 8);
printf("%d %d %d %d %d", a, b, c, ap, bp);
// 9 3 0 8 2
return 0;
}
728x90
반응형
'Language > C & C++' 카테고리의 다른 글
GNU Compiler Collection (0) | 2024.01.02 |
---|---|
구조체(Structure) (0) | 2023.04.16 |
특수연산자 (괄호, 쉼표) (0) | 2023.04.15 |
Function pointer (0) | 2022.11.19 |
Visual Studio Short-cut (0) | 2022.11.18 |