检查数字中每个数字的奇偶性

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;
}
4个回答

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

那么,加法应该怎么做呢?将 n&1 改为 (n&1)。 总是要求警告。


我没有收到任何警告,也无法设置它们。你使用的是哪个编译器?你传递了什么样的选项给它? - tryt
我不能确定nc3b正在使用哪个编译器,但是gcc -Wall会给出逐字的警告。http://gcc.gnu.org/ - msw
是的,我使用gcc。我没有仅仅提到“使用gcc -Wall”,因为OP没有提到他的编译器。 - nc3b

5
== 运算符的优先级高于 & 运算符,因此你的 if (n&1 == 0) 语句并没有达到预期的效果!(正确写法应该是 (n & 1) == 0
(而 if (n&1 == 1) 语句之所以能够正常工作,只是因为 1 == 1 的结果是 1 )

2

操作符优先级。 n & 1 == 0 等同于 n & (1 == 0)


2

这是一个与执行顺序相关的问题。尝试在 all_odd_2 中使用 if ((n&1) == 0),一切都会正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接