使用按位的奇偶程序
Even-odd program using bitwise
#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" 是偶数的 TRUE 条件,对吧?还是我在这里遗漏了什么?
在编译器中启用所有警告。我的说:
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
&
的优先级低得惊人,因此您需要 (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");
#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" 是偶数的 TRUE 条件,对吧?还是我在这里遗漏了什么?
在编译器中启用所有警告。我的说:
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
&
的优先级低得惊人,因此您需要 (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");