profack 2023-09-27 10:41 采纳率: 66.7%
浏览 21
已结题

关于c语言的学习问题

今天学C的时候遇到不能理解的的东西了,是来自《C Primer Plus》的下面程序清单7.7
!inword 为什么与 inword==false
先前
bool inword=false;* 不应该令inword 为假了吗,**! inword** 应该是真才对啊
关于这个书上的说法我也是不怎么理解
希望各位大触能浅显易懂解释一下这句话,补充一下这方面的基础知识(┬┬﹏┬┬)

//程序清单7.7
#include<stdio.h>
#include<ctype.h>
#include<stdbool.h>
#define STOP '|'
int main(void)
{
    char c;
    char prev;
    long n_chars = 0L;
    int n_lines = 0;
    int n_words = 0;
    int p_lines = 0;
    bool inword = false;

    printf("Enter text to be analyzed (| to terminate):\n");
    prev = '\n';
    while ((c = getchar()) != STOP)
    {
        n_chars++;
        if (c == '\n')
            n_lines++;
        if (!isspace(c) && !inword)
        {
            inword = true;
            n_words++;
        }
        if (isspace(c) && inword)
            inword = false;
        prev = c;
    }
    if (prev != '\n')
        p_lines = 1;
    printf("characters = %ld, words = %d, lines = %d, ",
        n_chars, n_words, n_lines);
    printf("partial lines = %d\n", p_lines);

    return 0;
}

就我一直认为**!inword为真搞不懂为什么还能进入if**(╯°□°)╯︵ ┻━┻

img

img

  • 写回答

11条回答 默认 最新

  • Java毕设王 2023-09-27 10:50
    关注

    这个程序中的 !inword 并不是一个判断 inword 为真的条件,而是一个判断 inword 为假的条件。
    inword 用来追踪是否处于一个单词中。初始时,inword 被设置为 false,表示我们不处于一个单词中。然后,在循环中,我们通过检查字符 c 是否为空白字符(空格、制表符、换行符等)来判断是否进入或退出一个单词。
    具体来说,当 c 是一个非空白字符,并且 inword 为假时(!inword 为真),这意味着我们进入了一个新单词,于是我们将 inword 设置为 true 并增加单词计数 n_words。
    当 c 是一个空白字符,并且 inword 为真时(inword 为真),这意味着我们退出了一个单词,于是我们将 inword 设置为 false。这样,inword 的状态在程序中不断地被切换,以便准确地计算单词数。所以,!inword 在这里是用来判断是否进入了一个新单词的条件,而不是判断是否处于一个单词中的条件。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

问题事件

  • 系统已结题 10月6日
  • 已采纳回答 9月28日
  • 创建了问题 9月27日