帮我看看有什么问题

来源:百度知道 编辑:UC知道 时间:2024/05/17 05:14:45
g=1;
while(g)
{
.
.
.
printf("continue?(Y/N)");
if((c=getchar())=='N'||(c=getchar())=='n')g=0;
}
我是想当输入N或者n时程序终止 输入Y或者y时继续执行程序 但是为什么对n有效而对N无效呢 当我把n和N位置换一下以后情况也跟着反了 这是怎么回事??

因为程序有两条getchar语句,即最多可能要读取两个字符,之所以在输入N时执行正确是由于'||'操作符有短路求值特性,因此,在询问时要输入两个字符‘n'

即按程序的要求,在输入时应是如下格式:
nn
或者
N

修改方法:去掉多余的getchar语句,改为如下形式:

g=1;
while(g)
{
...
printf("continue?(Y/N)");
if((c=getchar())=='N'||c=='n')g=0;
}

或者

g=1;
while(g)
{

printf("continue?(Y/N)");
c=getchar();
if(c=='N'||c=='n')g=0;
}

短路求值资料:
http://baike.baidu.com/view/1083418.htm

这就要说到判断语句的短路性质了:

当你输入'N'时前面的判断(c=getchar())=='N'执行,并为真,那么判断就结束了,不会再去执行后面的(c=getchar())=='n',于是结果正确

当你输入'n'时,前面的判断为假,就会去执行后面的语句,于是问题就出现了,程序会再让你输入一个值(因为又执行了一个getchar()),而你在第一个输入时为了结束输入会按一下回车,这就使紧接着的getchar()自动获得'\n'这个值,因为'\n'!='n'所以后面的判断也为假。