内容简介:最近在重新阅读K&R的《C程序设计语言》时对getchar()这个自带的函数的返回值产生了疑惑。从字面上看,给函数返回的类型应该是char型,但在示例中,却将返回内容赋值给了int型变量,示例代码如下:书中给出的解释为:因为某些潜在的重要原因,我们在此使用int类型。
最近在重新阅读K&R的《C程序设计语言》时对getchar()这个自带的函数的返回值产生了疑惑。从字面上看,给函数返回的类型应该是char型,但在示例中,却将返回内容赋值给了int型变量,示例代码如下:
#include <stdio.h> /* 将输入复制到输出 */ int main(void) { int c; while ((c = getchar()) != EOF){ putchar(c); } return 0; }
书中给出的解释为:
因为某些潜在的重要原因,我们在此使用int类型。
这里作者并没有对重要原因给出明确的说明,我试着将int修改为char,发现程序还是能够正常编译与执行,这更加让我疑惑!经过一翻搜索,找到的答案如下。
1、getchar()除了返回正常的字符外,还会返回输入结束符EOF(end of file)。该函数原型如下:
int getchar(void) { static char buf[BUFSIZ]; static char *bb = buf; static int n = 0; if(n == 0) { n = read(0, buf, BUFSIZ); bb = buf; } return(--n >= 0)?(unsigned char) *bb++ : EOF; }
2、EOF通常在<stdio.h>文件中被定义为-1:
#define BUFSIZ 512 #define _NFILE _NSTREAM_ #define _NSTREAM_ 512 #define _IOB_ENTRIES 20 #define EOF (-1)
3、各种数据类型能表示的数值范围由编译器决定。char类型在有些编译器中定义的范围为0~255,另外一些编译器中定义的范围为-128~127。当编译器中定义的范围为0~255时,用char接收getchar()返回值时就会出错。数据类型具体的定义范围可在<limits.h>文件中找到:
#define CHAR_BIT 8 #define SCHAR_MIN (-128) #define SCHAR_MAX 127 #define UCHAR_MAX 0xff #define CHAR_MIN SCHAR_MIN #define CHAR_MAX SCHAR_MAX
4、将int改为char后能在我的电脑上正常编译,时由于我的编译器中定义的范围为-128~127,当用char接收时会隐式的转化为char类型。
5、即使编译器总定义的范围为-128~127,程序也有可能出错。虽然常见字符到127位就结束了。但是 ASCII表 中分配到的时256。128~256为拓展字符,如常用的欧元符号等均在内。
综上:getchar()返回的内容用更大范围区间的int型接收,才能使程序更加稳健。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- go语言plugin怎么返回对象
- Go语言的断言返回值和类型转换的区别
- 【编程语言】Python 的参数传递、返回值、浅拷贝、深拷贝
- C 语言中返回字符串函数的四种实现方法
- 【C# 调用 Go 语言】0x2 参数、返回值与类型转换
- Go 语言函数式编程系列教程(十九) —— 函数篇:函数的传参和返回值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Code Reading
Diomidis Spinellis / Addison-Wesley Professional / 2003-06-06 / USD 64.99
This book is a unique and essential reference that focuses upon the reading and comprehension of existing software code. While code reading is an important task faced by the vast majority of students,......一起来看看 《Code Reading》 这本书的介绍吧!