2010-05-25 59 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)並且一切都將工作。