포스트

[C++] 조건문 속 변수 선언의 주의점(스코프)

알고리즘 문제 중, if()문의 조건식 안에 변수를 선언해 풀고자 한 문제가 있었습니다.
제가 작성한 코드는 아래와 같습니다.

1
2
3
4
5
6
7
8
for(auto it = target.begin(); it != target.end(); ++it) {
    if(int t = original.find(*it) == string::npos) {
        next_target += *it;
    } else {
        something_deleted = true;
        original.erase(original.begin() + t);
    }
}


위 코드는 MSVC기준 컴파일 오류가 발생하지 않은 코드입니다.
그러나 조건문의 지역변수인 t의 값이 else문으로 넘어가지 않았습니다.
따라서 original의 문자를 제거하는 동작이 예상과 다르게 동작하였습니다.

이 문제를 해결하기 위해 여러 가능성을 확인하던 중,
연산자 우선순위가 다르다는 것을 기억하였고 위 코드는 연산자 우선순위에 의해 아래와 같이 실행되었습니다.

1
2
3
4
5
6
if(int t = (original.find(*it) == string::npos)) {
    next_target += *it;
} else {
    something_deleted = true;
    original.erase(original.begin() + t);
}


따라서 t의 값은 1(true), 0(false) 값만 나왔기 때문에 결과값이 예상과 달랐던 것 입니다.
이 문제를 해결하기 위해 변수 t를 조건문 밖에서 선언하도록 수정하였고, 원하는 결과값을 출력할 수 있었습니다.

1
2
3
4
5
6
7
int t = original.find(*it);
if(t == string::npos)) {
    next_target += *it;
} else {
    something_deleted = true;
    original.erase(original.begin() + t);
}


참고

Cppreference.com의 Block scope 설명

블록스코프

[Cppreference.com의 Block scope 설명]
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.