偶数程序使用按位

时间:2018-04-11 12:03:01

标签: c bit-manipulation operators bitwise-operators

#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循环并始终打印“奇数”。我知道如果(假)或如果(0)是破坏条件但是&#34; n&amp; 1 == 0&#34;偶数是正确的条件吗?或者我在这里遗漏了什么?。

4 个答案:

答案 0 :(得分:4)

启用编译器中的所有警告。我说:

warning: & has lower precedence than ==; == will be evaluated first [-Wparentheses]
note: place parentheses around the & expression to evaluate it first

答案 1 :(得分:3)

等于运算符==和!=的优先级高于按位AND运算符。

因此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

答案 2 :(得分:1)

&的优先级低得惊人,因此您需要(n & 1) == 0。更好的是,使用

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

请注意,由于补充方案不同,这是针对负int值定义的实现,因此您可能无法获得否定n的正确答案。也许使用unsigned

答案 3 :(得分:0)

你不必比较为零。任何非零值都是真,零是假。

所以它足够了:

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

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