일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 분할 정복
- 세그먼트 트리
- BFS
- c++
- 자바스크립트
- 회고록
- 2023
- dfs
- NEXT
- DP
- 크루스칼
- 가끔은 말로
- 다익스트라
- 미래는_현재와_과거로
- back propagation
- Overfitting
- 가끔은_말로
- tensorflow
- 우선 순위 큐
- 문자열
- dropout
- 너비 우선 탐색
- 알고리즘
- object detection
- lazy propagation
- 조합론
- 플로이드 와샬
- 백트래킹
- 이분 탐색
- pytorch
- Today
- Total
Doby's Lab
Operator, Prefix or Postfix (전위 연산자 or 후위 연산자) 본문
직전 포스팅 백준 1005번을 풀면서 겪었던 오류가 있었다.
전위 연산자와 후위 연산자와 관련된 문제였다.
매일 for문을 돌리면서 후위 연산자만 썼었는데 이 기회에 정리해두자.
우선 예제 코드를 만들어보자.
n1과 n2 둘 다 1로 선언 후, n1은 Prefix Operator, n2는 Postfix Operator로 연산한다.
#include <iostream>
using namespace std;
int main() {
int n1 = 1;
cout << "n1(Prefix Operator): " << ++n1 << '\n';
int n2 = 1;
cout << "n2(Postfix Operator): " << n2++;
return 0;
}
[Output]
n1(Prefix Operator): 2
n2(Postfix Operator): 1
둘 다 연산을 해줬음에도 불구하고, 다른 출력 값을 가진다.
하나, 두 연산자의 작동 원리만 안다면 왜 이렇게 되는 것인지 이해 가능하다.
작동 원리
작동 원리를 이해하기 위해 두 가지 변수 a, b를 사용한다.
(이러한 코드를 쓰지는 않겠지만 이해를 위해서 작성하였다.)
// Prefix Operator
a = a + 1;
b = a;
Prefix Operator는 연산을 먼저 수행하고, 변수에 연산이 된 값을 할당한다.
// Postfix Operator
b = a;
a = a + 1;
Postfix Operator는 변수에 먼저 할당하고, 연산을 수행한다.
(Postfix의 경우 저렇게 작성된 것만 보았을 때는 b는 증감이 되지는 않지만 증감 연산자는 변수 자체적으로 쓴다는 것을 인지하자. 이 코드는 다시 한번 말하지만 이해를 돕기 위할 뿐이다.)
이처럼 작동 원리에서 순서만 다를 뿐, 결괏값은 같다.
문제점 해결 (주관적인 의견, 오피셜 X)
매우 주관적인 의견이다. 오피셜인 내용이 아니며 나의 생각을 적어두었으니 아래 글부터는 공식적인 정보가 아님을 알린다.
직전 포스팅에서 전위, 후위 연산자에 의해 논리적 오류가 났었다고 했었다.
이에 대해 파헤쳐 보자.
오류를 더 간단하게 코드로 표현해보았다.
int a = 1;
if (a-- == 0) {
cout << "complete";
}
내 의도는 저 조건문이 통과하는 것이었다. 하지만, 저대로 컴파일할 경우 내 의도대로 되지 않는다.
그 이유는 연산자 우선순위에 있다.
후위 연산자와 비교 연산자 간의 우선순위의 문제다.
지금 상황을 이해 하기 위해서 다음 연산자들의 우선순위들만 표현한다.
++, -- (증감) | 1 |
+, - (덧셈, 뺄셈) | 2 |
== (비교) | 3 |
= (할당) | 4 |
후위 연산자는 변수에 할당을 하고 난 후에 연산을 수행한다고 했다.
이 순서를 보면 증감(1)이 실행되고, 변수에 할당을 하려 하지만 비교(3)에 의해 비교가 먼저 되고, 할당(4)이 된 후, 연산(2)을 한다고 생각한다.
>> 그렇게 따지면 '2번 우선 순위인 덧셈, 뺄셈이 먼저가 되어야 하지 않나'라는 생각이 들었다.
>> 이 점은 {(할당)(1), (덧셈, 뺄셈)(2)}으로 묶어서 생각해보기로 했다.
>> 즉, 중괄호 맨 처음에 오는 부분을 기준으로 우선순위를 결정한다는 생각이다.
후위 연산자 주관적 정리
(증감)(1) -> (비교)(2) -> {(할당)(1), (덧셈, 뺄셈)(2)}(3)
그럼 마찬가지로 전위 연산자는 연산을 수행한 후, 값을 할당한다고 했다.
이 점을 바탕으로
전위 연산자 주관적 정리
(증감)(1) -> {(덧셈, 뺄셈)(1), (할당)(2)}(2) -> (비교)(3)
'C++' 카테고리의 다른 글
STL map관련 메소드 (0) | 2022.05.02 |
---|---|
vector.resize() 메소드 간단 정리 (0) | 2022.04.21 |
[C++] Merge Sort Tree를 위한 함수, merge(), vector.resize() (0) | 2022.03.02 |
[C++] 참조자(&)에 대하여, 포인터와는 전혀 다른 개념 (0) | 2021.11.19 |
[C++] memset 함수, for 문으로 초기화 시키기 귀찮을 때 (0, -1만 가능!) (0) | 2021.11.12 |