자료형과 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에 접근할 리가 없다.
'컴터 > C, C++' 카테고리의 다른 글
[C, C++] Pointer(포인터) ( 부제 : 어디서 삿대질) (0) | 2023.08.13 |
---|---|
C++ 문자열 숫자 곱하기 (0) | 2023.06.16 |
c++ at(-1), [-1] 뭐는 되고? 왜 다르지? (0) | 2023.02.25 |