内容简介:最近在重新阅读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 语言函数式编程系列教程(十九) —— 函数篇:函数的传参和返回值
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java编程思想 (第4版)
[美] Bruce Eckel / 陈昊鹏 / 机械工业出版社 / 2007-6 / 108.00元
本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形。从Java的基础语法到最高级特性(深入的面向对象概念、多线程、自动项目构建、单元测试和调试等),本书都能逐步指导你轻松掌握。 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作。本书的作者拥有多年教学经验,对C、C++以及Java语言都有独到......一起来看看 《Java编程思想 (第4版)》 这本书的介绍吧!