Четно-нечетная программа с использованием побитового

#include <stdio.h>

int main()
{
   int n;

   printf("Input an integer\n");
   scanf("%d", &n);

   if (n & 1 == 0)
      printf("even\n");
   else
      printf("odd\n");

   return 0;
}

Эта программа не входит в цикл If и всегда выводит «odd». Я понимаю, что if (False) или if (0) нарушает условие, но «n & 1 == 0» является ИСТИННЫМ условием для четных чисел, верно? или мне что-то здесь не хватает ?.

(n & 1 == 0) -> ((n & 1) == 0)
Jabberwocky 11.04.2018 14:10

Почему вы сравниваете n & 1 с 0?

purec 11.04.2018 14:10

@purec, потому что, если n & 1 равен нулю, n четен.

Jabberwocky 11.04.2018 14:11

Я вижу сейчас......

purec 11.04.2018 14:12
2
4
704
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Включите все предупреждения в вашем компиляторе. Мой говорит:

warning: & has lower precedence than ==; == will be evaluated first [-Wparentheses]
note: place parentheses around the & expression to evaluate it first
Ответ принят как подходящий

Операторы равенства == и! = Имеют более высокий приоритет, чем оператор побитового И.

Таким образом, условие в операторах if эквивалентно следующему

if (n & ( 1 == 0 ) )

поскольку 1 не равно 0, то условие можно переписать следующим образом:

if (n & 0)

Таким образом, подстановка оператора if никогда не выполняется, потому что n & 0 всегда оценивается как false ( 0 ).

Чтобы избежать логической ошибки, вы можете поменять местами выражения if и else.

   if (n & 1 )
      printf("odd\n");
   else
      printf("even\n");

Учтите, что согласно стандарту C функция main без параметров должна быть объявлена ​​как

int main( void )

Вот демонстрационная программа.

#include <stdio.h>

int main(void) 
{
    while ( 1 )
    {
        int n;

        printf( "Input an integer (0 - exit): " );

        if ( scanf( "%d", &n ) != 1 || n == 0 ) break;

        printf( "%d is %s\n\n", n, n & 1 ? "odd" : "even" );
    }

    return 0;
}

Его вывод может выглядеть как

Input an integer (0 - exit): 10
10 is even

Input an integer (0 - exit): 9
9 is odd

Input an integer (0 - exit): 8
8 is even

Input an integer (0 - exit): 7
7 is odd

Input an integer (0 - exit): 6
6 is even

Input an integer (0 - exit): 5
5 is odd

Input an integer (0 - exit): 4
4 is even

Input an integer (0 - exit): 3
3 is odd

Input an integer (0 - exit): 2
2 is even

Input an integer (0 - exit): 1
1 is odd

Input an integer (0 - exit): 0

Спасибо за подробный ответ. Я понимаю здесь логическую ошибку. Можете ли вы также объяснить, почему вы использовали scanf( "%d", &n ) != 1 в своем коде в качестве условия прерывания?

Ganesh Thampi 11.04.2018 14:39

@GaneshThampi Функция scanf возвращает целое число, которое можно использовать для проверки успешности scahf. Например, пользователь может прервать ввод, нажав ctrl + Z в Windows.

Vlad from Moscow 11.04.2018 14:42

& имеет удивительно низкий приоритет, поэтому вам нужен (n & 1) == 0. Еще лучше использовать

if (n & 1)
      printf("odd\n");
else
      printf("even\n");

Обратите внимание, что эта реализация определена для отрицательных значений int из-за различных схем дополнения, поэтому вы можете не получить правильный ответ для отрицательного значения n. Может, использовать unsigned?

не надо сравнивать с нулем. Любое ненулевое значение - истина, ноль - ложь.

Так что достаточно:

   if (n & 1 )
      printf("odd\n");
   else
      printf("even\n");

или же

printf("%s\n", (n&1) ? "odd" : "even");

Другие вопросы по теме