use*_*603 1 c initialization getchar
在编写应该是一个非常简单的程序(在K&R C书中)时,我得到了一些我不理解的输出.如果我EOF马上nl_count就是0,但space_count总是32767(最大int范围的一半),并且tab_count是一个很大的值(通常非常高或非常低).
当我将所有变量初始化为0时,程序正常工作.我在这里错过了什么?
10 int main(void)
11 {
12 int tab_count, space_count, nl_count;
13
14 //tab_count = space_count = nl_count = 0;
15
16 int c;
17 while( (c = getchar()) != EOF ){
18 if( c == '\t' )
19 tab_count++;
20 if( c == ' ' )
21 space_count++;
22 if( c == '\n' )
23 nl_count++;
24 }
25
26 printf("\n");
27 printf("TABS = %d\n", tab_count);
28 printf("SPACES = %d\n", space_count);
29 printf("NEWLINES = %d\n", nl_count);
30
31 return 0;
32 }
Run Code Online (Sandbox Code Playgroud)
输入和输出:
这是另一个输入,它再次正确地为换行输出3,但是为标签输出垃圾,为空格输出32767.
(空间)(空间)(空间)\吨\吨\吨\n \n \n
TABS = 441446448
SPACES = 32767
NEWLINES = 3
Run Code Online (Sandbox Code Playgroud)
当我将所有变量初始化为0时,程序正常工作.我在这里错过了什么?
tab_count,space_count并且nl_count;是自动存储变量.如果不将它们初始化为0,则它们具有不确定的值.从它们读取是技术上未定义的行为(UB).由于您在初始化它们之前递增它们的值,因此您正在调用UB.UB的一个表现是产生看似荒谬的价值观.