关于C中两个简单字符计数程序的困惑

时间:2019-01-21 13:14:21

标签: c

目标是用C语言编写一个简单的字符计数程序。如果这样编写:

#include <stdio.h>

main()
{
   long nc;

   for(nc = 0; getchar() != EOF; ++nc)
   printf("%ld\n", nc);
}

输出中列出的最后一个数字将是正确的字符数。但是,如果这样写:

#include <stdio.h>

main()
{
   long nc;

   nc = 0;
   while(getchar() != EOF)
   {
      ++nc;
      printf("%ld\n", nc);
   }
}

其输出中的最后一个数字将始终比输入字符串中的真实字符数大一个。我了解到这是因为在输入所需的字符串后按Enter会引入换行符,该换行符会被计数并产生错误。要消除该错误是微不足道的,但是我的问题是,为什么上面编写的程序中不会出现相同的问题?

例如,如果第一个程序在没有输入的情况下运行,它将正确输出0。但是,第二个在相同的情况下将输出1。为什么会有所不同?

2 个答案:

答案 0 :(得分:2)

所有数字在第二个循环中都增加一个,而不仅仅是在最后一个循环中。

您的for循环等效于

nc = 0;
while (getchar() != EOF)
{
    printf("%ld\n", nc);
    ++nc;
}

如您所见,它在打印后增加,而while在打印前增加。

答案 1 :(得分:1)

差异是由于两种情况下语句的执行顺序所致。

for循环的情况下,顺序为:

         (1)           (2)        (4)
       |----|  |---------------|   |
   for(nc = 0; getchar() != EOF; ++nc)
       printf("%ld\n", nc);  --------------- (3)

,在while循环的情况下,顺序为:

   nc = 0;     ------------------- (1)
   while(getchar() != EOF)  --------------- (2)
   {
      ++nc;  -------------------- (3)
      printf("%ld\n", nc);  ------------ (4)
   }

因此,在for循环的情况下,++nc在每次迭代中最后执行,即在printf()之后,在while循环的情况下,++nc是在每次迭代中在printf()之前执行。因此,您正在观察差异。