新的C语言:C99中的整型 Part 1

原创 2003年11月06日 00:36:00
 

此篇文章摘取于即将登载于《Dr.Dobb's 软件研发》第四期(2003年11月)的《The New C:C99中的整型Part 1》,在得到作者Randy Meyers以及《Dr.Dobb's 软件研发》杂志负责人刘江先生的应允下,把全文的前面的一部分作为文档发表,希望能对大家有所帮助。

    The New C: C99中的整型 Part 1<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

译注:这篇文章是The New C专题的第三篇文章,连同下期的第四篇作者Randy Meyers主要讲叙了C99中整型的变化以及新标准。整型(int)做为C语言中的基本数据类型,对C程序员来说其地位无可替代。本文给出了在新的C语言中关于整型的权威诠释,希望能给关心C语言和使用C语言的用户带来帮助。关于本文的一切可以用amstrongest@hotmail.com与译者联系和讨论。

 

 

C语言起源于一些非类型语言(typeless languages),但比起那些简陋的非类型语言来说,它却有更多的内涵。

 

 

回到八十年代(1980s),那时ANSI C标准和定义函数原型的功能都未出台,在comp.lang.c新闻组上偶尔会发生一些关于C语言类型系统的激烈论战。起因一般都是Pascal的支持者指责C语言缺少严格的类型检查。超越纯粹的反对观点,C阵营有时还会有失公允的一棒子打死所有类型检查的作用。其中一位就曾经这样留言:“C语言不需要强类型,因为C程序员只使用三种类型:整型,字符和字符指针。”

 

这个夸张的说法本身有些幽默,但就其所说却多少反映了一些真实的情况。在许多C语言程序设计中,尤其是系统编程,不同尺度的整型就是基本的数据类型。当然,你也可以用数组和结构来存储整型。有时候整型代表数字,而有时候他们却代表字符,但几乎所有的东西都是整型或者其演化中的一种。SNOBOL语言的基本数据类型是string FORTRAN的是浮点成员(floating-point number),但对C来说,那就是整型。

 

这并不是在说C99中没有新的而且重要的浮点特性,因为这样的新特性确实存在。然而,对于大多数C程序员来说,整型依旧是核心。在这个月和下个月的专栏中,我将叙说在C99中关于整型的新特性。

 

不再是默认类型

      

       C是从非类型语言BCPLB中演化而来的,其本身在发展初期的短暂时期内也同样是非类型语言。非类型语言并非真的完全没有类型,更精确的说应该是它们只有一种类型----机器字(machine word),但在其上的大多数操作都把它当作整型来对待。毫无疑问,在那些语言中的声明是不需要包含类型说明符的(type specifier),因为在那些语言中只有一种(但没有类型的名字)类型是有效的。当Dennis Ritchie第一次把类型加到C语言中的时候,被加入的仅仅是整型和字符。我不知道这样的行为是否是在认同C语言的根基是非类型语言,或者整型在C语言中的威望就由此而来,也或者这同时就是C语言著名的简洁性的来由。无论如何,C语言从其源头开始一直到C99定案前,整型就一直是语言的默认数据类型。如果你声明一个对象或者函数而没有指定其类型,亦或者通过调用隐式的声明了一个函数,这些默认的类型都将会是整型。

 

       举例子来说,在C99之前,如果下面的代码属于一个翻译单元:

extern x;
f(y)
{
    register z = g(x) + y;
    return z;
}

变量XYZ的类型都将是整型,并且函数fg也都返回整型。C99要求在任何时候如果运用到早期C语言定义的属性-----一个类型采用整型作为其默认值的话,编译器都要给出一个诊断。给出诊断的好处是因为很多隐式整型都会带来错误而且这样的错误不易定位。就象下面这样的完整翻译单元:

int main()
{
    double d;
    d = sqrt(2.0);
    return 0;
}

因为sqrt是隐式声明的,编译器将让其返回一个整型。当sqrt 正确的存储其double型返回值时,主函数main并不需要知道返回值存储在哪个位置(在一些机器上,整型变量和浮点变量使用不同的寄存器),当主函数main加载这个返回值时(从可能错误的地方),为了能把它赋给d主函数将把这个值从整型转换成double型。因为返回值本身就已经是double型了(假设主函数main正确的找到了它),这将造成sqrt返回结果的彻底混乱。

 

       很多种情况下都可能导致这种性质的错误。比如,你可能包含了错误的头文件并且遗漏了必须的函数声明,或者在声明一个外部变量的时候忘记使用类型说明符了。隐式整型特性在带来方便同时也将会带来查找隐晦错误的巨大困难。即使是Ritchie本人也提到他喜欢使用强制函数原型声明的编译器。

 

       注意,C99并不要求编译器把隐式整型诊断看成错误而终止编译。一个聪明的编译器将仅仅把诊断看成是一个警告,并且根据程序员的选择看是给出一个错误的消息或者是完全忽略掉。

 

-完-

 

欢迎访问:http://nishuo.35123.net

C语言几种整形类型的区别

今天写了一道算法题,碰到long int类型定义的变量,竟然不知道什么意思。。。 查资料,总结分享如下: int数据类型的位数为16位,short int数据类型的位数也是16位。而long int的...
  • Amo_te_ama_me
  • Amo_te_ama_me
  • 2016年02月13日 09:46
  • 6143

C语言进阶:整型提升

几乎每个程序员都学过C,而且大多数在他们的工作中使用C。很显然C是TIOBE(2012年11月时排榜首)上最流程的编程语言之一。然而,有时,C的行为会让人意外和困惑。其中一个例子就是**整型提升**。...
  • mishifangxiangdefeng
  • mishifangxiangdefeng
  • 2015年08月25日 19:50
  • 3895

c语言之标准(K&RC 、c89、c99、c11)

K&R C  1978年,丹尼斯•里奇(Dennis Ritchie)和布莱恩•柯林汉(Brian Kernighan)合作出版了《C程序设计语言》的第一版。书中介绍的C语言标准也被C语言程式设计师称...
  • qq_31029351
  • qq_31029351
  • 2016年11月22日 20:04
  • 3630

C语言中变量定义的位置(C89和C99的区别)

C语言中变量定义的位置(C89和C99的区别)          在C++和JAVA中,按照语法,我们可以把变量定义在任何位置,所以很多人习惯了“哪里使用哪里定义”的这种做法,所以当用C语言进行编程的...
  • dan15188387481
  • dan15188387481
  • 2015年11月06日 21:22
  • 3402

C99的新关键字_Bool

C99标准定义了一个新的关键字_Bool,提供了布尔类型。以前,C程序员总是使用自己的方法定义布尔类型。  0表示false,非0表示true。 可能使用char类型表示一个布尔类型,也可能使用i...
  • u013256622
  • u013256622
  • 2016年03月18日 18:37
  • 989

C语言中整型的定义

使用C语言时,用sizeof运算int,long int,long long int时,得到的结果不尽相同。那么这些类型长度与什么有关?与机器?与编译器(语言实现)?还是操作系统? 我查阅了一些资料,...
  • u012842205
  • u012842205
  • 2016年03月21日 15:38
  • 1493

C99 c语言特性 数组可以这样初使化

数组 我们可以指定数组的元素来进行初始化 C99 c语言特性              我在线用c++ 14 可以编译  char *err_strings[] = {    ...
  • kaizi318
  • kaizi318
  • 2015年06月19日 17:37
  • 3861

c语言中int什么意思以及什么是无符号和有符号整型

int 是整数类型,用于定义变量的类型,有符号,unsigned int 是无符号的整数类型,直白点说有符号无符号整型就是能不能存放负数。 根据程序编译器的不同,整形定义的字节数不同。51类单片...
  • qq_22122811
  • qq_22122811
  • 2016年10月05日 23:55
  • 2286

c语言 可变参数 三个点 ...

1.函数中使用可变参数表C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, …); 它除了有一个参数...
  • believnjdvnkds
  • believnjdvnkds
  • 2016年07月29日 15:30
  • 278

为什么C语言中的整型取值范围是--32768~32767

整型的宽度是一个字,也就是2个字节,16个二进制位,最高一位二进制位用来表示符号(正或负),那么剩下的15位来表示数值。 01111111 11111111是32767,最大的正整数 0000000...
  • u013176681
  • u013176681
  • 2014年08月12日 22:26
  • 1339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:新的C语言:C99中的整型 Part 1
举报原因:
原因补充:

(最多只允许输入30个字)