2010-05-25 61 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 2010-05-25 20:45:16

+0

我不能确定哪个编译器nc3b正在使用,但'gcc -Wall'给出逐字警告。 http://gcc.gnu.org/ – msw 2010-05-25 23:22:28

+0

是的,我使用gcc。我没有提到'使用gcc -Wall',因为OP没有提到他的编译器。 – nc3b 2010-05-26 05:00:46

2

运算符优先级。 n & 1 == 0相当于n & (1 == 0)

2

这是一个与执行顺序有关的问题。尝试在all_odd_2中使用if((n & 1)== 0)并且一切都将工作。