c语言中设置符号常量有何意义,深入解读C语言中的符号常量EOF

本文详细介绍了C语言中的EOF(文件结束符)及其在输入/输出操作中的作用。通过示例程序展示了如何利用getchar和putchar函数检测和处理文件结束。还解释了为什么在处理可能包含EOF的字符时,需要将变量声明为int类型,而不是char类型。最后,讨论了如何在程序中验证和打印EOF的值,并强调了使用符号常量EOF提高程序可移植性的优点。
摘要由CSDN通过智能技术生成

EOF是指文件的结束符,是一个宏定义

借助于getchar 与putchar 函数,可以在不了解其它输入/输出知识的情况下编写出

数量惊人的有用的代码。最简单的例子就是把输入一次一个字符地复制到输出,其基本思想

如下:

读一个字符

while (该字符不是文件结束指示符)

输出刚读入的字符

读下一个字符

将上述基本思想转换为C语言程序为:

#include

/* copy input to output; 1st version */

main()

{

int c;

c = getchar();

while (c != EOF) {

putchar(c);

c = getchar();

}

}

其中,关系运算符!=表示“不等于”。

字符在键盘、屏幕或其它的任何地方无论以什么形式表现,它在机器内部都是以位模式

存储的。char 类型专门用于存储这种字符型数据,当然任何整型(int)也可以用于存储字

符型数据。因为某些潜在的重要原因,我们在此使用int类型。

这里需要解决如何区分文件中有效数据与输入结束符的问题。C语言采取的解决方法是:

在没有输入时,getchar 函数将返回一个特殊值,这个特殊值与任何实际字符都不同。这个

值称为EOF(end of file,文件结束)。我们在声明变量c 的时候,必须让它大到足以存

放getchar函数返回的任何值。这里之所以不把c声明成char类型,是因为它必须足够大,

除了能存储任何可能的字符外还要能存储文件结束符EOF。因此,我们将c声明成int类型。

EOF 定义在头文件中,是个整型数,其具体数值是什么并不重要,只要它与

任何char类型的值都不相同即可。这里使用符号常量,可以确保程序不需要依赖于其对应的

任何特定的数值。

对于经验比较丰富的C 语言程序员,可以把这个字符复制程序编写得更精炼一些。在C

语言中,类似于

c = getchar()

之类的赋值操作是一个表达式,并且具有一个值,即赋值后左边变量保存的值。也就是说,

赋值可以作为更大的表达式的一部分出现。如果将为c赋值的操作放在while循环语句的测

试部分中,上述字符复制程序便可以改写成下列形式:

#include

/* copy input to output; 2nd version */

main()

{

int c;

while ((c = getchar()) != EOF)

putchar(c);

}

在该程序中,while 循环语句首先读一个字符并将其赋值给c,然后测试该字符是否为文件

结束标志。如果该字符不是文件结束标志,则执行while语句体,并打印该字符。随后重复

执行while语句。当到达输入的结尾位置时,while循环语句终止执行,从而整个main函

数执行结束。

以上这段程序将输入集中化,getchar函数在程序中只出现了一次,这样就缩短了程序,

整个程序看起来更紧凑。习惯这种风格后,读者就会发现按照这种方式编写的程序更易阅读。

我们经常会看到这种风格。(不过,如果我们过多地使用这种类型的复杂语句,编写的程序可

能会很难理解,应尽量避免这种情况。)

对while语句的条件部分来说,赋值表达式两边的圆括号不能省略。不等于运算符!=的

优先级比赋值运算符=的优先级要高,这样,在不使用圆括号的情况下关系测试!=将在赋值=

操作之前执行。因此语句

c = getchar() != EOF

等价于语句

c = (getchar() != EOF)

验证与打印EOF

1. 验证表达式 getchar() != EOF 的值是 0 还是 1。

#include

main()

{

int c;

while(c = (getchar() != EOF))

printf("%d\n", c);

printf("%d - at EOF\n", c);

}

程序会读取字符,当有字符可读时,getchar() 不会返回文件结束符(EOF),所以 getchar() != EOF 的取值为真,变量 c 将被赋值为 1。当程序遇到文件结束符时,表达式取值为假,此时变量将被赋值为 0,程序将运行结束。

对于一个判断表达式,它的返回值会是一个布尔值。

2. 请编写一个打印 EOF 值的程序

#include

main()

{

printf("EOF is %d\n", EOF);

}

符号常量 EOF 是在头文件 stdio.h 中定义的,在这个程序中,printf() 语句中双引号外的 EOF 将被替换为头文件 stdio.h 中紧跟在 #define EOF 之后的文本。

在我们的系统中, EOF 被定义为 -1,但在其它系统中,EOF 可能被定义成其它的值。这正是使用 EOF 等标准符号常量能够增加程序可移植性的原因所在。

时间: 2015-11-29

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值