1.5.2 字符计数
下列程序用于对字符进行计数:
#include <stdio.h>
/* count characters in input; 1st version */
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
换行符也会计数
[vagrant@node01 1.5]$ gcc -o ./out/1.5.2_01_test 1.5.2_01_test.c
[vagrant@node01 1.5]$ ./out/1.5.2_01_test
abc
a
6
++nc;
引入了一个新的运算符 ++
,其功能是执行加 1
操作
可以用语句 nc = nc + 1
代替它,但 语句 ++nc
更精炼一些,且通常效率也更高
与该运算符相应的是自减运算符 --
++
与 --
这两个运算符既可以作为前缀运算符(如:++nc
),也可以作为后缀运算符(如:nc++
)
这两种形式在表达式中具有不同的值,但 ++nc
与 nc++
都使 nc
的值加 1
该字符计数程序使用 long
类型的变量存放计数值,而没有使用 int
类型的变量
long
整型数(长整型)至少要占用 32 位存储单元
在某些机器上 int
与 long
类型的长度相同
在另一些机器上 int
类型的值可能只有 16
位存储单元的长度(最大值为 32767
)
这样,相当小的输入都可能使 int
类型的计数变量溢出
%ld
告诉 printf
函数其对应的参数是 long
整型
使用 double
(双精度浮点数)类型可以处理更大的数字:
#include <stdio.h>
/* count characters in input; 2nd version */
main()
{
double nc;
for (nc = 0; getchar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}
[vagrant@node01 1.5]$ gcc -o ./out/1.5.2_02_test 1.5.2_02_test.c
[vagrant@node01 1.5]$ ./out/1.5.2_02_test
abc
abcd
9
对于 float
与 double
类型 printf
函数都使用 %f
进行说明
%.0f
强制不打印小数点和小数部分
在该程序段中,for
循环语句的循环体是空的,这是因为所有工作都在测试(条件)部分与增加步长部分完成了
但 C 语言的语法规则要求 for
循环语句必须有一个循环体,因此用单独的分号代替
单独的分号称为空语句,它正好能满足 for
语句的这一要求,把它单独放在一行是为了更加醒目