用作计数器的整数值的意外输出

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)

jua*_*nza 5

当我将所有变量初始化为0时,程序正常工作.我在这里错过了什么?

tab_count,space_count并且nl_count;自动存储变量.如果不将它们初始化为0,则它们具有不确定的值.从它们读取是技术上未定义的行为(UB).由于您在初始化它们之前递增它们的值,因此您正在调用UB.UB的一个表现是产生看似荒谬的价值观.

  • @ user3370603你的理解是错的. (3认同)