2010-05-25 4 views
4

숫자의 모든 숫자가 홀수인지 확인하는 함수를 작성했습니다. 나는 이상한 행동을 보았다. 두 번째 함수가 다른 (잘못된) 결과를 반환하는 이유는 무엇입니까?이상한 숫자의 모든 숫자 확인

#include <stdio.h> 

int all_odd_1(int n) { 
if (n == 0) return 0; 
if (n < 0) n = -n; 

while (n > 0) { 
    if (n&1 == 1) 
    n /= 10; 
    else 
    return 0; 
    } 

return 1; 
} 


int all_odd_2(int n) { 
if (n == 0) return 0; 
if (n < 0) n = -n; 

while (n > 0) { 
    if (n&1 == 0) 
    return 0; 
    else 
    n /= 10; 
    } 

return 1; 
} 


int main() { 

printf("all_odd_1\n"); 
printf("%d\n", all_odd_1(-131)); 
printf("%d\n", all_odd_1(121)); 
printf("%d\n", all_odd_1(2242)); 
printf("-----------------\n"); 
printf("all_odd_2\n"); 
printf("%d\n", all_odd_2(131)); 
printf("%d\n", all_odd_2(121)); 
printf("%d\n", all_odd_2(2242)); 
return 0; 
} 

답변

5

== 연산자의 우선 순위가 & 연산자보다 높으므로 if (n&1 == 0) 문이 예상 한대로 수행되지 않습니다.

(그리고 if (n&1 == 1) 문은 1 == 1 1로 평가하는 우연에 의해 작동)

10
warning: suggest parentheses around comparison in operand of '&' 

음 (반대 방식으로 구현) 방법을 추가하는 방법에 대한? n&1(n&1)으로 변경하십시오. 항상 경고를 요구하십시오.

+0

경고를받지 못했거나 설정할 수 없습니다. 어떤 컴파일러를 사용하고 있습니까? 어떤 종류의 옵션을 사용합니까? – tryt

+0

어떤 컴파일러 nc3b가 사용 중인지 확실히 알 수는 없지만'gcc -Wall'은 축 어적으로 경고합니다. http://gcc.gnu.org/ – msw

+0

네, gcc를 사용합니다. OP가 자신의 컴파일러에 대해 언급하지 않았기 때문에'use gcc -Wall'을 언급하지 않았습니다. – nc3b

2

연산자 우선 순위. n & 1 == 0n & (1 == 0)과 같습니다.

2

실행 순서와 관련된 문제입니다. all_odd_2에서 if ((n & 1) == 0)를 사용해보세요. 모든 것이 작동합니다.

관련 문제