我可以从许多方面确定一个数字是偶数还是奇数。我的目的不是要-而是测试特定的按位运算。这是小代码:
#include <stdio.h>
int main(){
unsigned int c;
while(c=getchar()!='\n')
(c&1)==0?printf("Even"):printf("Odd");
printf("\n");
}
我在终端上的输入的类型为:“ 1234567890”或“ asdf5678”。
我得到的输出基本上是字符串“ OddOdd ...”,正如预期的那样,其数量与键入的字符数完全对应,但是对于所有字符仅返回“ Odd”。
我错过了一些基本的东西吗?如前所述,我对解决一个一般问题不感兴趣-我对找出为什么特定逻辑代码合理时为什么该特定代码不起作用感兴趣。与评估顺序有关吗? (从左到右等)我看不到这是运算符优先级的问题,因为我已将&运算括在方括号中,取代了==
的优先级您遇到的问题在此行上:
while (c = getchar() != '\n')
并且是由于运算符的优先级。具体而言,!=
运算符的优先级高于=
。添加括号显示了实际情况:
while (c = (getchar() != '\n'))
getchar
的结果不是'\n'
时,条件为1,这是奇数。
要解决此问题,请添加括号以正确分组操作:
while ((c = getchar()) != '\n')
然而,这忽略了以下事实:失败时getchar
返回EOF
。如果stdin
是EOF,它将永远循环,并等待永远不会出现的换行符。变量c
应该至少是int
而不是unsigned int
,以匹配getchar
的返回类型。
while语句中的表达式
while(c=getchar()!='\n')
相当于
while( c = ( getchar() != '\n' ) )
您需要
while( ( c = getchar() ) != '\n' )
无论如何写都更好
int c;
while( ( c = getchar() ) != EOF && c != '\n' )
我也认为写起来会更具可读性
printf( "%s ", (c&1) == 0 ? "Even" : "Odd" );
代替
(c&1)==0?printf("Even"):printf("Odd");