2014-07-18 4 views
2

다음 코드를 고려 작동하지 않는 함수의 반환 값 사용 : 임시 변수에 비교하기 전에 수학 계산의 결과를 저장하는 데 필요한 이유 코멘트가 나타으로는 C++ 수학 비교

char foo[32] = "123456"; 
    printf("strlen(foo) = %d\n", strlen(foo)); 
    if ((5 - strlen(foo)) > 0) 
    { 
     //This statement prints because the comparison above returns true, why? 
     printf("String must be less than 5 characters, test 1\n"); 
    } 

    int tmp; 
    if ((tmp = 5-strlen(foo)) > 0) 
    { 
     //This statement does not print and makes since 
     printf("String must be less than 5 characters, test 2\n"); 
    } 

을, 이해가 안 돼요 또 다른 가치있는 일.

+0

입니다. '% d'은 (는) '% zu'여야합니다. – chris

답변

8

true의 이유는 뺄셈 결과가 이고 서명이없는이기 때문입니다. 이는 size_t이고 반환 유형이 strlen()이고 서명이없고 int가 다른 형식이 아닌 형식으로 변환되기에 충분하기 때문입니다.

부호가있는 int 변수 tmp에 뺄셈 결과를 대입하면 결과가 다시 서명되므로 비교가 예상대로 작동합니다.

일반적으로 결과가 음수가 될 수 있다고 생각되면 부호없는 값을 빼는 데주의해야합니다. 100 % 확실하지 않은 경우 서명 된 유형을 사용하거나 처음부터 빼기를 피하십시오. 예를 들어 위 조건에 맞는 합법적 인 대체품은

if (strlen(foo) <= 5) 
    ... 
+0

"strlen()의 반환 유형 인 size_t가 부호가 없으므로"...이며, 크기가 너무 커서 int가 그 반전이 아닌 유형으로 변환됩니다. –

+0

그러나 과제가 뺄셈의 결과 유형을 수정하는 이유는 무엇입니까? 'int' 형에 할당하기 전에 감산 연산을 해결하면 안됩니까? – Svalorzen

+0

@Svalorzen, 빼기 결과는 부호가 없으며'tmp'에 저장 될 때 변환됩니다. – chris