这个是单词计数
有点难理解,不是说结构多难,而是这本书其实也没阐明这个程序的功能
再加上是翻译过来的,刚开始看还是会蒙逼的
阐述下整个逻辑:
共有5个变量,c是我们输入的字符,nl代表
的个数,nw代表单词数,nc表示字母数
所谓的IN 和 OUT就是一个种状态,有点类似于标志寄存器
我们首先,给定的状态state = OUT,即初始状态是在单词外的,接着nl nw nc 的初始值也都是0
nl = nw = nc = 0相当于 nl = (nw = (nc = 0))
现在开始循环体的执行,循环的条件不说了,上次说过
我们令c = getchar() = 'abc'
其实是分别循环了'a' 'b' 'c' '
'(这个我也是在OD的时候发现的,刚开始学汇编只是无聊,但发现这玩意有时还挺有用)
很明显经过++nc 后,nc = 4
我们一个个分析,首先是'a':执行的是else if (state == OUT)循环体的内容,nw = 1,但此时state = IN了
接着是'b':不执行啥
接着是'c':不执行啥
接着是'
':执行的是if (c == '
') 循环体的内容,nl = 1
所以结果可能是 nl = 1, nw = 1,nc = 4
我们来看看结果,bingo,正确的
#define IN 1 //在单词内
#define OUT 0 //在单词外
int main()
{
int c, nl, nw, nc, state; //nl表示单纯换行数,nw表示单词数,nc表示字符数
state = OUT;
nl = nw = nc = 0;
while ((c = getchar()) != EOF)
{
++nc;
if (c == '
')
++nl;
if (c == ' ' || c == '
' || c == ' ')
state = OUT;
else if (state == OUT)
{
state = IN;
++nw;
}
}
printf("nl = %d , nw = %d , nc = %d
", nl, nw, nc);
system("pause");
return 0;
}
演示一遍:
我们输入了两个单词,nw = 2,自然getchar吸收了两个
,nl = 2 ,
一共有6个字母,由于getchar会吸收两个
,nc = 6 + 2 = 8