이곳저곳에서 남의 코드 구경하다 발견한 잡기술들이다. C/C++가 아닌 다른 언어들에서도 응용할 수 있는 것들이 많이 있다.
이런 잡기술들이 가독성을 안 좋게 만드는 것도 있지만 더 좋을 때도 있다고 생각한다. 상황에 따라 잘 사용하면 될 것 같다.
잡기술들을 발견하면 하나씩 추가할 예정이다. (최종 수정 2022/07/07)
char을 if문으로 여러 개 걸어야 할 때
if (c == 'A' || c == 'B' || c == 'C' || c == 'D')
위와 같은 코드를 아래와 같이 줄일 수 있다
if (strchr("ABCD", c))
나눗셈 올림
std::ceil(x / n)
위의 함수는 리턴 값이 실수이다.
1. x / n + !!(x % n)
2. (x + n - 1) / n
위의 두 방법으로 정수형만 이용하여 나눗셈 올림을 할 수 있다.
음수 인덱스 배열
int tmp[n+n];
int *arr = tmp + n;
이렇게 하면 arr은 [-n, n-1] 범위를 사용할 수 있는 배열이 된다.
띄어쓰기 단위로 출력하다 마지막에 개행
for (int i = 0; i < n; i++) printf("%d ", a[i]);
printf("\n");
이런 방법으로도 할 수 있지만 한 줄로도 할 수 있다.
for (int i = 0; i < n; i++) printf("%d%c", a[i], " \n"[i == n-1]);
양수는 1, 음수는 -1, 0은 0 리턴하는 함수
int f(int x) {
if (x > 0) return 1;
if (x < 0) return -1;
return 0;
}
이렇게도 할 수 있지만 한 줄로도 할 수 있다.
int f(int x) {
return (x > 0) - (x < 0);
}
임시 변수 없이 swap
x ^= y ^= x ^= y;
이건 임시 변수를 이용하는 것보다 효율도 더 좋지 않고 가독성도 정말 안 좋다. 그냥 보고 넘어가자. std::swap을 쓰는 걸로.. (임베디드 같은 분야에서 메모리를 최대한 조금 쓰기 위해 이런 걸 사용하는 경우도 있다고 들었는데 잘은 모르겠다..)
참고로 한 줄로 쓰는 건 c와 c++17 이전 버전에선 UB다. 평가 순서가 정의되지 않았다. c++17에서 ^=와 같은 연산들의 평가 순서가 정의됐다.
비트 연산
if (x != -1)
이 수식을 ~ 연산을 이용할 수 있다.
if (~x)
~(-1)은 0이기 때문에 -1일 때만 저 조건문이 false가 된다.
if (x % 2)
x가 홀수인지 체크하는 조건문이다.
if (x & 1)
첫 번째 비트가 1일 때만 홀수이기 때문이 이렇게 처리할 수 있다.
if (~x & 1)
반대로 짝수는 이렇게 할 수 있다.
if (x >> k & 1)
k번째 비트가 1인지 확인
if (!(x & (x - 1)))
x가 2^n인지 확인
(l + r) / 2
l + r >> 1
연산자 우선순위 때문에 괄호 없이 이렇게 할 수 있다.
l + (r - l >> 1)
l + r 이 오버플로우가 생길 가능성이 있다면 이렇게 하면 된다.
'C++' 카테고리의 다른 글
[C++20] auto로 template를 대체해보자 (0) | 2022.07.14 |
---|---|
[C/C++] Sequencing (Sequence Point) (0) | 2022.05.01 |
[C/C++] printf에 float만을 위한 변환 명세가 없는 이유 (0) | 2022.04.28 |
[C++] lower_bound vs upper_bound (0) | 2021.10.15 |
[C++] string split구현 (0) | 2021.09.11 |