代码之家  ›  专栏  ›  技术社区  ›  Ganesh Thampi

使用位的奇偶程序

  •  2
  • Ganesh Thampi  · 技术社区  · 8 年前
    #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”是偶数的真条件,对吗?还是我错过了什么?。

    4 回复  |  直到 8 年前
        1
  •  4
  •   John Zwinck    8 年前

    启用编译器中的所有警告。我的意思是:

    warning: & has lower precedence than ==; == will be evaluated first [-Wparentheses]
    note: place parentheses around the & expression to evaluate it first
    
        2
  •  3
  •   Vlad from Moscow    8 年前

    相等运算符==和!=具有比按位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
    
        3
  •  1
  •   Bathsheba    8 年前

    & 优先级极低,所以您需要 (n & 1) == 0 .更好的是,使用

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

    请注意,这是为负数定义的实现 int 由于互补方案不同,所以很可能无法得到否定的正确答案 n .可能使用 unsigned ?

        4
  •  0
  •   0___________    8 年前

    您不必将其与零进行比较。任何非零值均为真,零为假。

    因此,这足以:

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

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