Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么以奇怪的方式初始化此数组?_C_Arrays - Fatal编程技术网

C 为什么以奇怪的方式初始化此数组?

C 为什么以奇怪的方式初始化此数组?,c,arrays,C,Arrays,我正在阅读《K&R》第二版,在理解练习1-13时遇到困难。答案是这个密码 #include <stdio.h> #define MAXHIST 15 #define MAXWORD 11 #define IN 1 #define OUT 0 main() { int c, i, nc, state; int len; int maxvalue; int ovflow; int wl[MAXWORD];

我正在阅读《K&R》第二版,在理解练习1-13时遇到困难。答案是这个密码

#include <stdio.h>

#define MAXHIST 15  
#define MAXWORD 11  
#define IN 1        
#define OUT 0      


main()
{

    int c, i, nc, state;
    int len;
    int maxvalue;
    int ovflow;
    int wl[MAXWORD];

    state = OUT;
    nc = 0;         
    ovflow = 0;

    for (i = 0; i < MAXWORD; i++)
        wl[i] = 0;  

    while ((c = getchar()) != EOF)
    {
        if(c == ' ' || c == '\n' || c == '\t')
        {
            state = OUT;            
            if (nc > 0)
            {
                if (nc < MAXWORD)   
                    ++wl[nc];       
                else
                    ++ovflow;       
            }                       
            nc = 0;                 
        }
        else if (state == OUT)
        {
            state = IN;             
            nc = 1;                 
        }
        else
            ++nc;                   
    }

    maxvalue = 0;
    for (i = 1; i < MAXWORD; ++i)
    {
        if(wl[i] > maxvalue)
            maxvalue = wl[i];       
    }

    for(i = 1; i < MAXWORD; ++i)
    {
        printf("%5d - %5d : ", i, wl[i]);
        if(wl[i] > 0)
        {
            if((len = wl[i] * MAXHIST / maxvalue) <= 0)
                len = 1;
        }
        else
            len = 0;

        while(len > 0)
        {
            putchar('*');
            --len;
        }
        putchar('\n');
    }

    if (ovflow > 0)
        printf("There are %d words >= %d\n", ovflow, MAXWORD);

    return 0;

}
#包括
#定义MAXHIST 15
#定义maxword11
#在1中定义
#定义出0
main()
{
int c,i,nc,state;
内伦;
int最大值;
int-ovflow;
int-wl[MAXWORD];
状态=输出;
nc=0;
ovflow=0;
对于(i=0;i0)
{
if(ncmaxvalue)
最大值=wl[i];
}
对于(i=1;i0)
{
如果((len=wl[i]*MAXHIST/maxvalue)0)
{
putchar('*');
--len;
}
putchar('\n');
}
如果(ovflow>0)
printf(“有%d个单词>=%d\n”、ovflow、MAXWORD);
返回0;
}
在顶部,
wl
正在声明和初始化。我不明白的是,如果它只计算单词长度,为什么它会循环通过它并将所有内容设置为零?它不跟踪有多少单词,它只跟踪单词长度,所以为什么所有内容都设置为0


我知道这还不清楚,只是过去20分钟我一直在紧张,我不知道为什么。

数组
I
第th个元素
wl[]
是在输入文件中找到的长度
I
的字数。
wl[]
数组需要先初始化为零,以便
+wl[nc];
不会因为尝试使用未初始化的变量而导致未定义的行为,因此表示不存在的字长的数组元素反映未找到此类字长

请注意,当遇到长度为
nc
的字时,
++wl[nc]
会增加值
wl[nc]
。如果数组未初始化,则代码第一次尝试增加数组元素时,它将尝试增加不确定的值。此尝试将导致未定义的行为

此外,表示在输入中找不到的字长计数的数组索引应包含零值,但如果没有零初始化,这些值将是不确定的。即使尝试打印这些不确定的值,也会导致未定义的行为

寓意:在尝试使用变量之前,将变量初始化为合理的值,或将值存储在其中

使用数组初始值设定项对
wl[]
数组进行零初始化似乎更简单、更清晰:

int wl[MAXWORD] = { 0 };
在此之后,不需要将数组值设置为零的循环(除非再次使用该数组)另一个文件。但是,发布的代码来自Tondo和Gimpel的C答案书。这本书以K&R的风格为K&R第二版中的练习提供了解决方案,并且只使用在每次练习之前书中介绍的想法。此练习,1.13,出现在“第1章-教程简介”中.这是一次简短的语言之旅,没有在本书后面找到许多细节。此时,已经介绍了赋值和数组,但数组初始值设定项没有(这必须等到第4章),并且使用数组的K&R代码到目前为止已经使用循环初始化了数组。不要过多地阅读一本30多年前的书的介绍章节中的代码样式


自K&R发布以来,C语言发生了很大变化,例如,
main()
不再是
main()
函数的有效函数签名。请注意,函数签名必须是
int main(void)
int main(int argc,char*argv[])
(或者
int main(int argc,char**argv)
),对于
main()

的实现定义的签名有一个警告,数组
wl[]
i
第个元素是在输入文件中找到的长度
i
的字数。
wl[]
数组需要先初始化为零,以便
+wl[nc];
不会因为尝试使用未初始化的变量而导致未定义的行为,因此表示不存在的字长的数组元素反映未找到此类字长

请注意,当遇到长度为
nc
的字时,
++wl[nc]
会增加值
wl[nc]
。如果数组未初始化,则代码第一次尝试增加数组元素时,它将尝试增加不确定的值。此尝试将导致未定义的行为

此外,表示在输入中找不到的字长计数的数组索引应包含零值,但如果没有零初始化,这些值将是不确定的。即使尝试打印这些不确定的值,也会导致未定义的行为

寓意:在尝试使用变量之前,将变量初始化为合理的值,或将值存储在其中

使用数组初始值设定项对
wl[]
数组进行零初始化似乎更简单、更清晰:

int wl[MAXWORD] = { 0 };
在此之后,不需要为另一个文件.B设置将数组值设置为零的循环(除非再次使用该数组)