the C Programming Language 练习1-13的打印直方图的细节问题

该程序主要是实现打印输入中单词长度的水平方向的直方图

(len = nl[i] * MAXHIST / maxvalue) <= 0)这个while语句循环的条件让我有些困惑。它会出现len小于0的情况吗?如果不会出现,那么他这个条件改成(len = nl[i] * MAXHIST / maxvalue) = 0)也是可以的吗?如果会出现,那么可否帮忙具体举个例子。谢谢大家了!

#include<stdio.h>
#define IN 1      //单词内部
#define OUT 0  //单词外部
#define MAXNUMBER 11    //一个单词的最大长度
#define MAXHIST 15          //直方图的最大长度
int main()
{
    int c,i,nc,state;
    int overflow;    //长度超过规定范围的单词个数
    int maxvalue;   //nl[]数组元素中的最大值
    int nl[MAXNUMBER];    //储存单词长度
    nc = 0;    //一个单词的字符个数
    state = OUT;    //初始状态是在单词外
    overflow = 0;    //意味着长度大于MAXNUMBER 的单词个数
    for (i=0;i< MAXNUMBER;i++)
    {
        nl[i] = 0 ;
    }
    while ((c=getchar())!=EOF)
    {
        if (c==' '||c=='\n'||c=='\t')
        {
            state = OUT;//在结束时,开始记录对应单词长度的个数
            if (nc > 0)
            {
                if (nc <= MAXNUMBER)
                {
                    nl[nc]++;
                }
                else
                {
                    overflow++;
                }
            }
            nc = 0;
        }
        else if (state==OUT)
        {
            state = IN;
            nc=1;    //状态:一个单词的开始
        }
        else
        {
            nc++;//状态:在一个单词中
        }
    }
    maxvalue = 0;
    int len = 0;
    for (i=1;i< MAXNUMBER;i++)//find nl[i] maxvalue
    {
        if (nl[i] > maxvalue)
        {
            maxvalue = nl[i];
        }
    }
    for (i = 1; i < MAXNUMBER; i++)
    {
        printf("%5d - %5d :",i,nl[i]);
        if (nl[i] > 0)
        {
            if ((len = nl[i] * MAXHIST / maxvalue) <= 0)//此处将程序编的更加简单
                //len = nl[i] * MAXHIST / maxvalue这样的赋值操作是一个表达式
                //因此可以作为更大表达式的一部分出现,所以说len并不是只在if分支语句中起作用的局部变量。
                //这里进行完该操作语句后,持续进行while循环语句。
                //同时,该语句可以看成len = nl[i] / maxvalue * MAXHIST,nl[i]表示长度为i单词的个数
                //maxvalue表示最大频数,两者之比再乘以直方图最大高度,所以得到的便是相应高度。
                //同时这样也起到了限制打印长度的作用
            {
                len = 1;
            }
        }
        else
        {
            len = 0;
        }
        while (len > 0)
        {
            putchar('*');
            len--;
        }
        putchar('\n');
    }
    if (overflow > 0)
    {
        printf("there are %d words >=%d\n",overflow,MAXNUMBER);
    }
    return 0;
}
 
 
 

应该是避免引发除零错误的吧,其实就是把判断maxvalue不为0和判断nl[i]为0写一起了

这里应该只是作为溢出保护,类型是int,如果溢出会变成负值,如果参数范围可控,这个条件可以改为=0