内容简介:最近在重新阅读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 语言函数式编程系列教程(十九) —— 函数篇:函数的传参和返回值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。