C 语言为什么这个 while 循环中判定式值为假值了也不会结束?

2015-04-13 08:55:06 +08:00
 rundis
rt,我是C语言初学者,今天做习题的时候遇到这个问题
代码:
#include <stdio.h>
#include<stdlib.h>

int main(void)
{
char first, last, ch;

printf("Enter a first and last name: ");
first = getchar();
while ((ch = getchar()) != ' ')
{
ch = getchar();
if (ch == '\n' || ch == ' ')
break;
}

while ((last = getchar()) != ' ' )
printf("%c", last);

printf(",%c.", first);
system("pause");
}
最后一个while循环输出完 需要的东西之后并不结束,但是表达式的值已经为假值了,因为getchar提取到缓冲区的最后一个字符是'\n'。但是循环并不结束,只有人为在循环中加入:
if ((last = getchar()) != '\n')
{
break;
}
循环才会在getchar遇到\n才会结束

这是为什么?
谢谢!
2759 次点击
所在节点    问与答
10 条回复
rundis
2015-04-13 09:03:46 +08:00
while循环不是会在判定式值为假值的时候结束么。。。
lll9p
2015-04-13 09:29:32 +08:00
你的程序里不是遇到空格就结束循环么?空格和换行是不一样的。
rundis
2015-04-13 10:14:29 +08:00
@lll9p 但是改成!=' ' || != '\n'也不行啊…
FanAndXinran
2015-04-13 11:11:20 +08:00
while ((last = getchar()) != '\n' )
qwlhappy
2015-04-13 12:25:56 +08:00
getchar()有点多,会不会是自己在输入的时候没想明白?不如单独测试下最后一个循环
rundis
2015-04-13 12:35:15 +08:00
@qwlhappy 应该不是。我最后一个循环想判定如果出现空格或者换行符就跳出循环,否则执行循环体。
rundis
2015-04-13 12:35:44 +08:00
@lll9p 我主要是想遇到空格结束循环,遇到换行符也结束循环
rundis
2015-04-13 12:36:11 +08:00
@FanAndXinran 但是我希望遇到空格也跳出循环啊。
leavic
2015-04-13 20:18:09 +08:00
为什么要用‘或'判定?

我们分析一下流程:
1.你现在得到了一个'\n'
2.你判断的条件式不为空格或者不为'\n'
3.不满足后面不为'\n'的条件
4.但是满足前面非空格的条件啊
5.或关系,有一个真即为真,
6.while判断为真,当然继续循环体。

明显应该用'与'。
否定判断用与,肯定判断用或,这是个很通用的逻辑。
类似的逻辑如果用在位运算上,你以后如果碰到寄存器某位写0或者写1这个问题,一样是这个逻辑。
leavic
2015-04-13 20:19:40 +08:00
简单点说,你的逻辑是:
最后得到的字符既不是空格,也不是回车,才进入循环,所以这明显是个与关系。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/183330

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX