检查数字中的每个数字是否有奇怪

时间:2010-05-25 20:17:15

标签: c

我正在编写一个函数来检查数字中的每个数字是否都是奇数。我遇到了这种奇怪的行为。为什么第二个函数返回不同(不正确)的结果,尽管它基本相同? (以相反的方式实施)

#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;
}

4 个答案:

答案 0 :(得分:10)

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

那么,添加它们呢?将n&1更改为(n&1)。总是要求警告。

答案 1 :(得分:5)

==运算符的优先级高于&运算符,因此您的if (n&1 == 0)语句没有达到预期效果!

(并且if (n&1 == 1)语句仅按1 == 1计算为1的巧合而起作用;)

答案 2 :(得分:2)

运营商优先权。 n & 1 == 0相当于n & (1 == 0)

答案 3 :(得分:2)

这是与执行顺序有关的问题。尝试在all_odd_2中使用if((n&amp; 1)== 0),一切都会有效。