V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
rundis
V2EX  ›  问与答

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

  •  
  •   rundis · 2015-04-13 08:55:06 +08:00 · 2612 次点击
    这是一个创建于 3307 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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才会结束

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

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

    明显应该用'与'。
    否定判断用与,肯定判断用或,这是个很通用的逻辑。
    类似的逻辑如果用在位运算上,你以后如果碰到寄存器某位写0或者写1这个问题,一样是这个逻辑。
    leavic
        10
    leavic  
       2015-04-13 20:19:40 +08:00
    简单点说,你的逻辑是:
    最后得到的字符既不是空格,也不是回车,才进入循环,所以这明显是个与关系。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2274 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 08:40 · PVG 16:40 · LAX 01:40 · JFK 04:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.