проверка каждой цифры в номере на странность - PullRequest
4 голосов
/ 26 мая 2010

Я писал функцию, которая проверяет, является ли каждая цифра числа нечетной. Я столкнулся с этим странным поведением. Почему вторая функция возвращает разные (неправильные) результаты, хотя в принципе она одинакова? (реализовано противоположным образом)

#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 голосов
/ 26 мая 2010
warning: suggest parentheses around comparison in operand of '&'

Ну, а как насчет их добавления? Измените n&1 на (n&1). Всегда просите предупреждений.

5 голосов
/ 26 мая 2010

Оператор == имеет более высокий приоритет, чем оператор &, поэтому ваш оператор if (n&1 == 0) не выполняет то, что вы ожидаете!

(а оператор if (n&1 == 1) работает только по совпадению, что 1 == 1 оценивается как 1;)

2 голосов
/ 26 мая 2010

Это проблема, связанная с порядком исполнения. Попробуйте использовать if ((n & 1) == 0) в all_odd_2, и все будет работать.

2 голосов
/ 26 мая 2010

Приоритет оператора. n & 1 == 0 эквивалентно n & (1 == 0)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...