C 为什么以奇怪的方式初始化此数组?
我正在阅读《K&R》第二版,在理解练习1-13时遇到困难。答案是这个密码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];
#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设置将数组值设置为零的循环(除非再次使用该数组)