본문 바로가기
컴터/C, C++

c++ string :: npos 는 -1 ?

by 나 진짜 못차마 2023. 2. 23.
728x90

자료형과 type casting을 정확하게 파악했다면 생기지 않았을 의문점...

 

결론부터 말하자면,

" '-1' 이 맞고 그렇게 선언 되어있으나,

size_t 자료형에 따른다.

 


string 문자열에서 find() 함수를 사용하다 문득 궁금한 점이 생겼다.

find() 함수는 대상 문자열에서 찾고자 하는 부분 문자열을 찾지 못하면 string::npos 를 반환한다.

 

string::npos는 문자열에서 특정 문자 또는 문자열을 찾지 못한 경우 반환되는 값으로 사용되는 상수이다.

아래는 cplusplus.com 에 나와있는 내용이다.

 

size_t는 일반적으로 unsigned long long 을 사용한다.

출력을 해보자.

 

cout << string::npos << "\n";

출력

띠용.

 

그렇다 npos 는 size_t 형이고, size_t는 일반적으로 unsigned long long 이다.

 

그래서 " size_t(unsgined long long) npos = -1" 은

under flow로 unsigned long long의 가장 maximum 값으로 저장되어 있다.

 

흠흠 그렇구만.

 

그래서 -1 과 npos를 직접적으로 비교했을 때,

npos는 unsigned이기 때문에 묵시적 형변환으로 인해

-1 은 unsigned long long MAX_VALUE와 동일하게 된다.

if (string::npos == ULLONG_MAX) 
{
    cout << "string::npos == ULLONG_MAX\n";
}

if (string::npos == -1) 
{
    cout << "string::npos == -1\n";
}

출력

 

필요한 코드 작성하다 find()함수를 사용할 일이 있었다.

그러다

find() 함수에서 문자열을 찾지 못했을 때 string::npos 반환하네 ?

-> npos 값 뭐지?

-> -1 ?

-> 출력해볼까? 엥 ULLONG_MAX 값?

 

본인은 자료형변환을 고려 안하고

-1 이랑 같네? ULLONG_MAX랑 같네? 무식하게 접근했다.

 

ㅋㅋㅋㅋㅋ너무 단순하지만 자꾸 머리 속에서 찝찝하게 남아서 빠르게 정리하였다.

 

 

ps .


그럼 ULLONG_MAX 값보다 긴~ 문자열을 사용했을 때

해당 문자열에서 원하는 문자열을 발견 못하면 npos = ULLONG_MAX 값을 반환하나?

그럼 해당 인덱스에 접근하면 옳지 않은 문자열에 접근하는 게 아닌가?

(물론 통상적으로 앞에서 썼듯이 "특정 문자 또는 문자열을 찾지 못한 경우 반환되는 값으로 사용되는 상수" 라서 이렇게 접근할 일은 없겠지만)

 

그래서 문자열을 마구 붙여봤다.

붙이는 중...

 

 

결과는 ?

 

붙이면서 시간 걸리는 거 같아서

바로 string의 max size를 알아보니

signed long long의 양수 값인 9,223,372,036,854,775,807 이다.

npos 값인 18,446,744,073,709,551,615 보다는 한참 작기에

결국 당연히 npos index에 접근할 리가 없다.

728x90