我正在编写一个函数来检查数字中的每个数字是否都是奇数。我遇到了这种奇怪的行为。为什么第二个函数返回不同(不正确)的结果,尽管它基本相同? (以相反的方式实施)
#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;
}
答案 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),一切都会有效。