2014-09-13 1 views
0

이 코드는 "여기서 뭔가"를 인쇄해야하지만 실제로 잘못

void test(){ 
    string str = ""; 
    int count = 0; 
    if (count > str.length() - 1){ 
     cout << "something here" << endl; 
     return; 
    } 
    cout << "wrong" << endl; 
} 

를 인쇄하지만, 나는 다음과 같이 약간 변경하면, 여기 "뭔가를 인쇄합니다 "

void test_2(){ 
    string str = ""; 
    int count = 0; 
    int last_index = str.length() - 1; 
    if (count > last_index){  // change to last_index 
     cout << "something here" << endl; 
     return; 
    } 
    cout << "wrong" << endl; 
} 

누구나 나를 도와 줄 수 있습니까?

+0

컴파일러 경고를 켜거나 켭니다. – chris

답변

3

string::length은 인 unsigned int을 반환합니다.

0을 반환하고 1을 빼면 underflow이됩니다.

는 두 번째 경우에 작동하는 이유는

int last_index = str.length() - 1; 

말 이후 size_t은 뺄셈 대입시 int로 변환된다는 점이다.

+1

'-1'을 생성하는 구현 정의 방식으로 '빼기'* 후 *로 변환됩니다. 또한,'size_t'는 64 비트 플랫폼에서'unsigned int'가 될 가능성이 없습니다. –

+0

흥미 롭습니다. 따라서 우선 순위에 따라 변환을 먼저 수행해야하는지 기술적으로 지정해야합니까? – CoryKramer

+1

뺄셈은'size_t' 인 부호없는 정수형으로 승격시킬 것입니다 (플랫폼에 따라'unsigned int','unsigned long' 또는'unsigned long long'이 될 수 있습니다), 결과는'int '(int의 범위 내에서 표현 될 수 없기 때문에) 구현 정의 방식으로'last_index'를 초기화하는데 사용됩니다. –