重庆美图库!!
查看: 3366|回复: 30
打印 上一主题 下一主题
收起左侧

C语言完全教程

[复制链接]
1
跳转到指定楼层
发表于 2006-6-3 16:58 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
重庆商务网,重庆电子商务第一网!

登陆享受更多浏览权限哟~

您需要 登录 才可以下载或查看,没有帐号?入驻经典

x
<FONT color=red>第一章 C语言概论</FONT><BR>C语言的发展过程<BR><BR>  C语言是在70年代初问世的。一九七八年由美国电话电报公司(AT&amp;T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchit合著了著名的“THE C PROGRAMMING LANGUAGE”一书。通常简称为《K&amp;R》,也有人称之为《K&amp;R》标准。但是,在《K&amp;R》中并没有定义一个完整的标准C语言,后来由美国国家标准学会在此基础上制定了一个C 语言标准,于一九八三年发表。通常称之为ANSI C。<BR>   当代最优秀的程序设计语<BR>   早期的C语言主要是用于UNIX系统。由于C语言的强大功能和各方面的优点逐渐为人们认识,到了八十年代,C开始进入其它操作系统,并很快在各类大、中、小和微型计算机上得到了广泛的使用。成为当代最优秀的程序设计语言之一。<BR><BR>C语言的特点<BR><BR>   C语言是一种结构化语言。它层次清晰,便于按模块化方式组织程序,易于调试和维护。C语言的表现能力和处理能力极强。它不仅具有丰富的运算符和数据类型,便于实现各类复杂的数据结构。它还可以直接访问内存的物理地址,进行位(bit)一级的操作。由于C语言实现了对硬件的编程操作,因此C语言集高级语言和低级语言的功能于一体。既可用于系统软件的开发,也适合于应用软件的开发。此外,C语言还具有效率高,可移植性强等特点。因此广泛地移植到了各类各型计算机上,从而形成了多种版本的C语言。<BR><BR>C语言版本<BR><BR>   目前最流行的C语言有以下几种:<BR>    ·Microsoft C 或称 MS C<BR>    ·Borland Turbo C 或称 Turbo C<BR>    ·AT&amp;T C<BR>   这些C语言版本不仅实现了ANSI C标准,而且在此基础上各自作了一些扩充,使之更加方便、完美。<BR>面向对象的程序设计语言<BR>   在C的基础上,一九八三年又由贝尔实验室的Bjarne Strou-strup推出了C++。 C++进一步扩充和完善了C语言,成为一种面向 对象的程序设计语言。C++目前流行的最新版本是Borland C++4.5,Symantec C++6.1,和Microsoft VisualC++ 2.0。C++提出了一些更为深入的概念,它所支持的这些面向对象的概念容易将问题空间直接地映射到程序空间,为程序员提供了一种与传统结构程序设计不同的思维方式和编程方法。因而也增加了整个语言的复杂性,掌握起来有一定难度。<BR><BR>C和C++<BR><BR>  但是,C是C++的基础,C++语言和C语言在很多方面是兼容的。因此,掌握了C语言,再进一步学习C++就能以一种熟悉的语法来学习面向对象的语言,从而达到事半功倍的目的。<BR><BR>C源程序的结构特点<BR><BR>  为了说明C语言源程序结构的特点,先看以下几个程序。这几个程 序由简到难,表现了C语言源程序在组成结构上的特点。虽然有关内容还未介绍,但可从这些例子中了解到组成一个C源程序的基本部分和书写格式。main()<BR>{printf("c语言世界www.vcok.com,您好!\n");<BR>}<BR>   main是主函数的函数名,表示这是一个主函数。每一个C源程序都必须有,且只能有一个主函数(main函数)。函数调用语句,printf函数的功能是把要输出的内容送到显示器去显示。printf函数是一个由系统定义的标准函数,可在程序中直接调用。<BR>#include<BR>#include<BR>main()<BR>{<BR>double x,s;<BR>printf("input number:\n");<BR>scanf("%lf",&amp;x);<BR>s=sin(x);<BR>printf("sine of %lf is %lf\n",x,s);<BR>}<BR><BR>每行注释<BR><BR>include称为文件包含命令扩展名为.h的文件也称为头文件或首部文件<BR>定义两个实数变量,以被后面程序使用<BR>显示提示信息<BR>从键盘获得一个实数x<BR>求x的正弦,并把它赋给变量s<BR>显示程序运算结果<BR>main函数结束<BR>   <BR>   程序的功能是从键盘输入一个数x,求x的正弦值,然后输出结果。在main()之前的两行称为预处理命令(详见后面)。预处理命令还有其它几种,这里的include 称为文件包含命令,其意义是把尖括号""或引号&lt;&gt;内指定的文件包含到本程序来,成为本程序的一部分。被包含的文件通常是由系统提供的,其扩展名为.h。因此也称为头文件或首部文件。C语言的头文件中包括了各个标准库函数的函数原型。因此,凡是在程序中调用一个库函数时,都必须包含该函数原型所在的头文件。在本例中,使用了三个库函数:输入函数scanf,正弦函数sin,输出函数printf。sin函数是数学函数,其头文件为math.h文件,因此在程序的主函数前用include命令包含了math.h。scanf和printf是标准输入输出函数,其头文件为stdio.h,在主函数前也用include命令包含了stdio.h文件。<BR><BR>  需要说明的是,C语言规定对scanf和printf这两个函数可以省去对其头文件的包含命令。所以在本例中也可以删去第二行的包含命令#include。同样,在例1.1中使用了printf函数,也省略了包含命令。<BR><BR>  在例题中的主函数体中又分为两部分,一部分为说明部分,另一部分执行部分。说明是指变量的类型说明。例题中未使用任何变量,因此无说明部分。C语言规定,源程序中所有用到的变量都必须先说明,后使用,否则将会出错。这一点是编译型高级程序设计语言的一个特点,与解释型的BASIC语言是不同的。说明部分是C源程序结构中很重要的组成部分。本例中使用了两个变量x,s,用来表示输入的自变量和sin函数值。由于sin函数要求这两个量必须是双精度浮点型,故用类型说明符double来说明这两个变量。说明部分后的四行为执行部分或称为执行语句部分,用以完成程序的功能。执行部分的第一行是输出语句,调用printf函数在显示器上输出提示字符串,请操作人员输入自变量x的值。第二行为输入语句,调用scanf函数,接受键盘上输入的数并存入变量x中。第三行是调用sin函数并把函数值送到变量s中。第四行是用printf 函数输出变量s的值,即x的正弦值。程序结束。<BR><BR>printf("input number:\n");<BR>scanf("%lf",'C10F10&amp;x);<BR>s=sin(x);<BR>printf("sine of %lf is %lf\n",'C10F10x,s);<BR>   运行本程序时,首先在显示器屏幕上给出提示串input number,这是由执行部分的第一行完成的。用户在提示下从键盘上键入某一数,如5,按下回车键,接着在屏幕上给出计算结果。<BR><BR>输入和输出函数<BR><BR>  在前两个例子中用到了输入和输出函数scanf和 printf,在第三章中我们要详细介绍。这里我们先简单介绍一下它们的格式,以便下面使用。scanf和 printf这两个函数分别称为格式输入函数和格式输出函数。其意义是按指定的格式输入输出值。因此,这两个函数在括号中的参数表都由以下两部分组成: “格式控制串”,参数表  格式控制串是一个字符串,必须用双引号括起来,它表示了输入输出量的数据类型。各种类型的格式表示法可参阅第三章。在printf函数中还可以在格式控制串内出现非格式控制字符,这时在显示屏幕上将原文照印。参数表中给出了输入或输出的量。当有多个量时,用逗号间隔。例如:<BR>printf("sine of %lf is %lf\n",x,s);<BR>   其中%lf为格式字符,表示按双精度浮点数处理。它在格式串中两次现,对应了x和s两个变量。其余字符为非格式字符则照原样输出在屏幕上<BR>int max(int a,int b);<BR>main(){<BR>int x,y,z;<BR>printf("input two numbers:\n");scanf("%d%d",&amp;x,&amp;y);<BR>z=max(x,y);<BR>printf("maxmum=%d",z);<BR>}<BR>int max(int a,int b){<BR>if(a&gt;b)return a;else return b;<BR>}<BR>此函数的功能是输入两个整数,输出其中的大数。<BR>/*函数说明*/<BR>/*主函数*/<BR>/*变量说明*/<BR>/*输入x,y值*/<BR>/*调用max函数*/<BR>/*输出*/<BR>/*定义max函数*/<BR>/*把结果返回主调函数*/<BR>   上面例中程序的功能是由用户输入两个整数,程序执行后输出其中较大的数。本程序由两个函数组成,主函数和max 函数。函数之间是并列关系。可从主函数中调用其它函数。max 函数的功能是比较两个数,然后把较大的数返回给主函数。max 函数是一个用户自定义函数。因此在主函数中要给出说明(程序第三行)。可见,在程序的说明部分中,不仅可以有变量说明,还可以有函数说明。关于函数的详细内容将在第五章介绍。在程序的每行后用/*和*/括起来的内容为注释部分,程序不执行注释部分。<BR><BR>  上例中程序的执行过程是,首先在屏幕上显示提示串,请用户输入两个数,回车后由scanf函数语句接收这两个数送入变量x,y中,然后调用max函数,并把x,y 的值传送给max函数的参数a,b。在max函数中比较a,b的大小,把大者返回给主函数的变量z,最后在屏幕上输出z的值。<BR><BR>C源程序的结构特点<BR><BR>1.一个C语言源程序可以由一个或多个源文件组成。<BR><BR>2.每个源文件可由一个或多个函数组成。<BR><BR>3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。<BR><BR>4.源程序中可以有预处理命令(include 命令仅为其中的一种),预处理命令通常应放在源文件或源程序的最前面。<BR><BR>5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。<BR><BR>6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。<BR><BR>书写程序时应遵循的规则<BR><BR>  从书写清晰,便于阅读,理解,维护的角度出发,在书写程序时 应遵循以下规则:<BR><BR>1.一个说明或一个语句占一行。<BR><BR>2.用{} 括起来的部分,通常表示了程序的某一层次结构。{}一般与该结构语句的第一个字母对齐,并单独占一行。<BR><BR>3.低一层次的语句或说明可比高一层次的语句或说明缩进若干格后书写。以便看起来更加清晰,增加程序的可读性。在编程时应力求遵循这些规则,以养成良好的编程风格。<BR><BR>C语言的字符集<BR><BR>  字符是组成语言的最基本的元素。C语言字符集由字母,数字,空格,标点和特殊字符组成。在字符常量,字符串常量和注释中还可以使用汉字或其它可表示的图形符号。<BR>1.字母  小写字母a~z共26个,大写字母A~Z共26个<BR><BR>2.数字  0~9共10个<BR><BR>3.空白符 空格符、制表符、换行符等统称为空白符。空白符只在字符常量和字符串常量中起作用。在其它地方出现时,只起间隔作用, 编译程序对它们忽略。因此在程序中使用空白符与否,对程序的编译不发生影响,但在程序中适当的地方使用空白符将增加程序的清晰性和可读性。<BR><BR>4.标点和特殊字符<BR><BR>C语言词汇<BR><BR>  在C语言中使用的词汇分为六类:标识符,关键字,运算符,分隔符,常量,注释符等。<BR><BR>1.标识符<BR><BR>  在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线()组成的字符串,并且其第一个字符必须是字母或下划线。<BR><BR>以下标识符是合法的:<BR><BR>a,x, 3x,BOOK 1,sum5<BR><BR>以下标识符是非法的:<BR>3s 以数字开头<BR>s*T 出现非法字符*<BR>-3x 以减号开头<BR>bowy-1 出现非法字符-(减号)<BR>   在使用标识符时还必须注意以下几点:<BR>(1)标准C不限制标识符的长度,但它受各种版本的C 语言编译系统限制,同时也受到具体机器的限制。例如在某版本C 中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。<BR>(2)在标识符中,大小写是有区别的。例如BOOK和book 是两个不同的标识符。<BR>(3)标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,作到“顾名思义”。<BR><BR>2.关键字<BR><BR>  关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。用户定义的标识符不应与关键字相同。C语言的关键字分为以下几类:<BR>(1)类型说明符<BR>用于定义、说明变量、函数或其它数据结构的类型。如前面例题中用到的int,double等<BR>(2)语句定义符<BR>用于表示一个语句的功能。如例1.3中用到的if else就是条件语句的语句定义符。<BR>(3)预处理命令字<BR>用于表示一个预处理命令。如前面各例中用到的include。<BR><BR>3.运算符<BR><BR>  C语言中含有相当丰富的运算符。运算符与变量,函数一起组成表达式,表示各种运算功能。运算符由一个或多个字符组成。<BR><BR>4.分隔符<BR><BR>  在C语言中采用的分隔符有逗号和空格两种。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,作间隔符。在关键字,标识符之间必须要有一个以上的空格符作间隔, 否则将会出现语法错误,例如把int a;写成 inta;C编译器会把inta当成一个标识符处理,其结果必然出错。<BR><BR>5.常量<BR><BR>  C 语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种。在第二章中将专门给予介绍。 6.注释符<BR><BR>  C 语言的注释符是以“/*”开头并以“*/”结尾的串。在“/*”和“*/”之间的即为注释。程序编译时,不对注释作任何处理。注释可出现在程序中的任何位置。注释用来向用户提示或解释程序的意义。在调试程序中对暂不使用的语句也可用注释符括起来,使翻译跳过不作处理,待调试结束后再去掉注释符。<BR>
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 顶 踩
发布商机信息及企业宣传推广--请移步注册重庆商务网!!
快捷入口:给经典重庆客服留言
31
发表于 2006-6-24 17:16 | 只看该作者
重庆女性论坛
<P>什么时候把这几贴打印出来,可以参考一下哈!!</P><br>

6QIOO3Fy.jpg (8.26 KB, 下载次数: 5)

C语言完全教程

C语言完全教程
重庆商务网,重庆电子商务第一网,欢迎入驻!
30
 楼主| 发表于 2006-6-24 15:49 | 只看该作者
说普通话,从我做起,全面提升重庆文明程度
<P>谢谢了哈,斑竹给我的感觉很好也.</P>
29
发表于 2006-6-24 08:40 | 只看该作者
经典百事通,你的生活好助手~
楼主实在是强!你朋友更强啦
28
 楼主| 发表于 2006-6-24 03:42 | 只看该作者
<P>好多哟,我朋友总结的,我用的他的.</P>
发布商机信息及企业宣传推广--请移步注册重庆商务网!!
快捷入口:给经典重庆客服留言
27
发表于 2006-6-18 14:53 | 只看该作者
重庆商务网,重庆电子商务第一网!
今天翻了一下书,可能也只有这些了,请问楼主这个C教程是你自己总结的?哪点找的哟?
发布商机信息及企业宣传推广--请移步注册重庆商务网!!
快捷入口:给经典重庆客服留言
26
 楼主| 发表于 2006-6-18 12:51 | 只看该作者
重庆女性论坛
好象就是这些了,斑竹觉得还有些什么呢?
重庆商务网,重庆电子商务第一网,欢迎入驻!
25
发表于 2006-6-16 16:15 | 只看该作者
说普通话,从我做起,全面提升重庆文明程度
<P>很好的帖子,不错!</P>
<P>汗!!我只知道一些,还不知道楼主发完没有?感觉上好像还有一部分未发。</P>[em17][em17][em17][em17]
24
 楼主| 发表于 2006-6-13 17:33 | 只看该作者
经典百事通,你的生活好助手~
<FONT color=#ff0000>第十一章 预处理<BR></FONT>概述<BR>   在前面各章中,已多次使用过以“#”号开头的预处理命令。如包含命令# include,宏定义命令# define等。在源程序中这些命令都放在函数之外, 而且一般都放在源文件的前面,它们称为预处理部分。<BR><BR>  所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作。预处理是C语言的一个重要功能, 它由预处理程序负责完成。当对一个源文件进行编译时, 系统将自动引用预处理程序对源程序中的预处理部分作处理, 处理完毕自动进入对源程序的编译。<BR><BR>  C语言提供了多种预处理功能,如宏定义、文件包含、 条件编译等。合理地使用预处理功能编写的程序便于阅读、修改、 移植和调试,也有利于模块化程序设计。本章介绍常用的几种预处理功能。<BR><BR>宏定义<BR>   在C语言源程序中允许用一个标识符来表示一个字符串, 称为“宏”。被定义为“宏”的标识符称为“宏名”。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换, 这称为“宏代换”或“宏展开”。<BR><BR>  宏定义是由源程序中的宏定义命令完成的。 宏代换是由预处理程序自动完成的。在C语言中,“宏”分为有参数和无参数两种。 下面分别讨论这两种“宏”的定义和调用。 无参宏定义<BR>   无参宏的宏名后不带参数。其定义的一般形式为: #define 标识符 字符串 其中的“#”表示这是一条预处理命令。凡是以“#”开头的均为预处理命令。“define”为宏定义命令。 “标识符”为所定义的宏名。“字符串”可以是常数、表达式、格式串等。在前面介绍过的符号常量的定义就是一种无参宏定义。 此外,常对程序中反复使用的表达式进行宏定义。例如: # define M (y*y+3*y) 定义M表达式(y*y+3*y)。在编写源程序时,所有的(y*y+3*y)都可由M代替,而对源程序作编译时,将先由预处理程序进行宏代换,即用(y*y+3*y)表达式去置换所有的宏名M,然后再进行编译。<BR>#define M (y*y+3*y)<BR>main(){<BR>int s,y;<BR>printf("input a number: ");<BR>scanf("%d",&amp;y);<BR>s=3*M+4*M+5*M;<BR>printf("s=%d\n",s);<BR>}<BR>   上例程序中首先进行宏定义,定义M表达式(y*y+3*y),在s= 3*M+4*M+5* M中作了宏调用。在预处理时经宏展开后该语句变为:s=3*(y*y+3*y)+4(y*y+3*y)+5(y*y+3*y);但要注意的是,在宏定义中表达式(y*y+3*y)两边的括号不能少。否则会发生错误。<BR>   当作以下定义后: #difine M y*y+3*y在宏展开时将得到下述语句: s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;这相当于; 3y2+3y+4y2+3y+5y2+3y;显然与原题意要求不符。计算结果当然是错误的。 因此在作宏定义时必须十分注意。应保证在宏代换之后不发生错误。对于宏定义还要说明以下几点:<BR><BR>1. 宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的代换,字符串中可以含任何字符,可以是常数,也可以是表达式,预处理程序对它不作任何检查。如有错误,只能在编译已被宏展开后的源程序时发现。<BR><BR>2. 宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起置换。<BR><BR>3. 宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结 束。如要终止其作用域可使用# undef命令,例如: # define PI 3.14159<BR>main()<BR>{<BR>……<BR>}<BR># undef PIPI的作用域<BR>f1()<BR>....表示PI只在main函数中有效,在f1中无效。<BR>4. 宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换。<BR>#define OK 100<BR>main()<BR>{<BR>printf("OK");<BR>printf("\n");<BR>}<BR>上例中定义宏名OK表示100,但在printf语句中OK被引号括起来,因此不作宏代换。程序的运行结果为:OK这表示把“OK”当字符串处理。<BR><BR>5. 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。例如: #define PI 3.1415926<BR>#define S PI*y*y /* PI是已定义的宏名*/对语句: printf("%f",s);在宏代换后变为: printf("%f",3.1415926*y*y);<BR><BR>6. 习惯上宏名用大写字母表示,以便于与变量区别。但也允许用小写字母。<BR><BR>7. 可用宏定义表示数据类型,使书写方便。例如: #define STU struct stu在程序中可用STU作变量说明: STU body[5],*p;#define INTEGER int 在程序中即可用INTEGER作整型变量说明: INTEGER a,b; 应注意用宏定义表示数据类型和用typedef定义数据说明符的区别。宏定义只是简单的字符串代换,是在预处理完成的,而typedef是在编译时处理的,它不是作简单的代换, 而是对类型说明符重新命名。被命名的标识符具有类型定义说明的功能。请看下面的例子: #define PIN1 int* typedef (int*) PIN2;从形式上看这两者相似, 但在实际使用中却不相同。下面用PIN1,PIN2说明变量时就可以看出它们的区别: PIN1 a,b;在宏代换后变成 int *a,b;表示a是指向整型的指针变量,而b是整型变量。然而:PIN2 a,b;表示a,b都是指向整型的指针变量。因为PIN2是一个类型说明符。由这个例子可见,宏定义虽然也可表示数据类型, 但毕竟是作字符<BR>代换。在使用时要分外小心,以避出错。<BR><BR>8. 对“输出格式”作宏定义,可以减少书写麻烦。例9.3 中就采用了这种方法。<BR>#define P printf<BR>#define D "%d\n"<BR>#define F "%f\n"<BR>main(){<BR>int a=5, c=8, e=11;<BR>float b=3.8, d=9.7, f=21.08;<BR>P(D F,a,b);<BR>P(D F,c,d);<BR>P(D F,e,f);<BR>}<BR><BR>带参宏定义<BR><BR>  C语言允许宏带有参数。在宏定义中的参数称为形式参数, 在宏调用中的参数称为实际参数。对带参数的宏,在调用中,不仅要宏展开, 而且要用实参去代换形参。<BR><BR>  带参宏定义的一般形式为: #define 宏名(形参表) 字符串 在字符串中含有各个形参。带参宏调用的一般形式为: 宏名(实参表);<BR>例如:<BR>#define M(y) y*y+3*y /*宏定义*/<BR>:<BR>k=M(5); /*宏调用*/<BR>: 在宏调用时,用实参5去代替形参y, 经预处理宏展开后的语句<BR>为: k=5*5+3*5<BR>#define MAX(a,b) (a&gt;b)?a:b<BR>main(){<BR>int x,y,max;<BR>printf("input two numbers: ");<BR>scanf("%d%d",&amp;x,&amp;y);<BR>max=MAX(x,y);<BR>printf("max=%d\n",max);<BR>}<BR>   上例程序的第一行进行带参宏定义,用宏名MAX表示条件表达式(a&gt;b)?a:b,形参a,b均出现在条件表达式中。程序第七行max=MAX(x,<BR>y)为宏调用,实参x,y,将代换形参a,b。宏展开后该语句为: max=(x&gt;y)?x:y;用于计算x,y中的大数。对于带参的宏定义有以下问题需要说明:<BR><BR>1. 带参宏定义中,宏名和形参表之间不能有空格出现。<BR>例如把: #define MAX(a,b) (a&gt;b)?a:b写为: #define MAX (a,b) (a&gt;b)?a:b 将被认为是无参宏定义,宏名MAX代表字符串 (a,b)(a&gt;b)?a:b。<BR>宏展开时,宏调用语句: max=MAX(x,y);将变为: max=(a,b)(a&gt;b)?a:b(x,y);这显然是错误的。<BR><BR>2. 在带参宏定义中,形式参数不分配内存单元,因此不必作类型定义。而宏调用中的实参有具体的值。要用它们去代换形参,因此必须作类型说明。这是与函数中的情况不同的。在函数中,形参和实参是两个不同的量,各有自己的作用域,调用时要把实参值赋予形参,进行“值传递”。而在带参宏中,只是符号代换,不存在值传递的问题。<BR><BR>3. 在宏定义中的形参是标识符,而宏调用中的实参可以是表达式。<BR>#define SQ(y) (y)*(y)<BR>main(){<BR>int a,sq;<BR>printf("input a number: ");<BR>scanf("%d",&amp;a);<BR>sq=SQ(a+1);<BR>printf("sq=%d\n",sq);<BR>}<BR>   上例中第一行为宏定义,形参为y。程序第七行宏调用中实参为a+1,是一个表达式,在宏展开时,用a+1代换y,再用(y)*(y) 代换SQ,得到如下语句: sq=(a+1)*(a+1); 这与函数的调用是不同的, 函数调用时要把实参表达式的值求出来再赋予形参。 而宏代换中对实参表达式不作计算直接地照原样代换。<BR><BR>4. 在宏定义中,字符串内的形参通常要用括号括起来以避免出错。 在上例中的宏定义中(y)*(y)表达式的y都用括号括起来,因此结果是正确的。如果去掉括号,把程序改为以下形式:<BR>#define SQ(y) y*y<BR>main(){<BR>int a,sq;<BR>printf("input a number: ");<BR>scanf("%d",&amp;a);<BR>sq=SQ(a+1);<BR>printf("sq=%d\n",sq);<BR>}<BR>运行结果为:input a number:3<BR>sq=7 同样输入3,但结果却是不一样的。问题在哪里呢? 这是由于代换只作符号代换而不作其它处理而造成的。 宏代换后将得到以下语句: sq=a+1*a+1; 由于a为3故sq的值为7。这显然与题意相违,因此参数两边的括号是不能少的。即使在参数两边加括号还是不够的,请看下面程序:<BR>#define SQ(y) (y)*(y)<BR>main(){<BR>int a,sq;<BR>printf("input a number: ");<BR>scanf("%d",&amp;a);<BR>sq=160/SQ(a+1);<BR>printf("sq=%d\n",sq);<BR>}<BR>   本程序与前例相比,只把宏调用语句改为: sq=160/SQ(a+1); 运行本程序如输入值仍为3时,希望结果为10。但实际运行的结果如下:input a number:3 sq=160为什么会得这样的结果呢?分析宏调用语句,在宏代换之后变为: sq=160/(a+1)*(a+1);a为3时,由于“/”和“*”运算符优先级和结合性相同, 则先作160/(3+1)得40,再作40*(3+1)最后得160。为了得到正确答案应在宏定义中的整个字符串外加括号, 程序修改如下<BR>#define SQ(y) ((y)*(y))<BR>main(){<BR>int a,sq;<BR>printf("input a number: ");<BR>scanf("%d",&amp;a);<BR>sq=160/SQ(a+1);<BR>printf("sq=%d\n",sq);<BR>}<BR>以上讨论说明,对于宏定义不仅应在参数两侧加括号, 也应在整个字符串外加括号。<BR><BR>5. 带参的宏和带参函数很相似,但有本质上的不同,除上面已谈到的各点外,把同一表达式用函数处理与用宏处理两者的结果有可能是不同的。main(){<BR>int i=1;<BR>while(i&lt;=5)<BR>printf("%d\n",SQ(i++));<BR>}<BR>SQ(int y)<BR>{<BR>return((y)*(y));<BR>}#define SQ(y) ((y)*(y))<BR>main(){<BR>int i=1;<BR>while(i&lt;=5)<BR>printf("%d\n",SQ(i++));<BR>}<BR>   在上例中函数名为SQ,形参为Y,函数体表达式为((y)*(y))。在例9.6中宏名为SQ,形参也为y,字符串表达式为(y)*(y))。 两例是相同的。例9.6的函数调用为SQ(i++),例9.7的宏调用为SQ(i++),实参也是相同的。从输出结果来看,却大不相同。分析如下:在例9.6中,函数调用是把实参i值传给形参y后自增1。 然后输出函数值。因而要循环5次。输出1~5的平方值。而在例9.7中宏调用时,只作代换。SQ(i++)被代换为((i++)*(i++))。在第一次循环时,由于i等于1,其计算过程为:表达式中前一个i初值为1,然后i自增1变为2,因此表达式中第2个i初值为2,两相乘的结果也为2,然后i值再自增1,得3。在第二次循环时,i值已有初值为3,因此表达式中前一个i为3,后一个i为4, 乘积为12,然后i再自增1变为5。进入第三次循环,由于i 值已为5,所以这将是最后一次循环。计算表达式的值为5*6等于30。i值再自增1变为6,不再满足循环条件,停止循环。从以上分析可以看出函数调用和宏调用二者在形式上相似, 在本质上是完全不同的。<BR><BR>6. 宏定义也可用来定义多个语句,在宏调用时,把这些语句又代换到源程序内。看下面的例子。<BR>#define SSSV(s1,s2,s3,v) s1=l*w;s2=l*h;s3=w*h;v=w*l*h;<BR>main(){<BR>int l=3,w=4,h=5,sa,sb,sc,vv;<BR>SSSV(sa,sb,sc,vv);<BR>printf("sa=%d\nsb=%d\nsc=%d\nvv=%d\n",sa,sb,sc,vv);<BR>}<BR>   程序第一行为宏定义,用宏名SSSV表示4个赋值语句,4 个形参分别为4个赋值符左部的变量。在宏调用时,把4 个语句展开并用实参代替形参。使计算结果送入实参之中。<BR><BR>文件包含<BR><BR>  文件包含是C预处理程序的另一个重要功能。文件包含命令行的一般形式为: #include"文件名" 在前面我们已多次用此命令包含过库函数的头文件。例如:<BR>#include"stdio.h"<BR>#include"math.h"<BR>文件包含命令的功能是把指定的文件插入该命令行位置取代该命令行, 从而把指定的文件和当前的源程序文件连成一个源文件。在程序设计中,文件包含是很有用的。 一个大的程序可以分为多个模块,由多个程序员分别编程。 有些公用的符号常量或宏定义等可单独组成一个文件, 在其它文件的开头用包含命令包含该文件即可使用。这样,可避免在每个文件开头都去书写那些公用量, 从而节省时间,并减少出错。<BR><BR>对文件包含命令还要说明以下几点:<BR>1. 包含命令中的文件名可以用双引号括起来,也可以用尖括号括起来。例如以下写法都是允许的: #include"stdio.h" #include&lt;math.h&gt; 但是这两种形式是有区别的:使用尖括号表示在包含文件目录中去查找(包含目录是由用户在设置环境时设置的), 而不在源文件目录去查找; 使用双引号则表示首先在当前的源文件目录中查找,若未找到才到包含目录中去查找。 用户编程时可根据自己文件所在的目录来选择某一种命令形式。<BR><BR>2. 一个include命令只能指定一个被包含文件, 若有多个文件要包含,则需用多个include命令。3. 文件包含允许嵌套,即在一个被包含的文件中又可以包含另一个文件。<BR><BR>条件编译<BR><BR>预处理程序提供了条件编译的功能。 可以按不同的条件去编译不同的程序部分,因而产生不同的目标代码文件。 这对于程序的移植和调试是很有用的。 条件编译有三种形式,下面分别介绍:<BR>1. 第一种形式:<BR>#ifdef 标识符<BR>程序段1<BR>#else<BR>程序段2<BR>#endif<BR>它的功能是,如果标识符已被 #define命令定义过则对程序段1进行编译;否则对程序段2进行编译。如果没有程序段2(它为空),本格式中的#else可以没有, 即可以写为:<BR>#ifdef 标识符<BR>程序段 #endif<BR>#define NUM ok<BR>main(){<BR>struct stu<BR>{<BR>int num;<BR>char *name;<BR>char sex;<BR>float score;<BR>} *ps;<BR>ps=(struct stu*)malloc(sizeof(struct stu));<BR>ps-&gt;num=102;<BR>ps-&gt;name="Zhang ping";<BR>ps-&gt;sex='M';<BR>ps-&gt;score=62.5;<BR>#ifdef NUM<BR>printf("Number=%d\nScore=%f\n",ps-&gt;num,ps-&gt;score);<BR>#else<BR>printf("Name=%s\nSex=%c\n",ps-&gt;name,ps-&gt;sex);<BR>#endif<BR>free(ps);<BR>}<BR>   由于在程序的第16行插入了条件编译预处理命令, 因此要根据NUM是否被定义过来决定编译那一个printf语句。而在程序的第一行已对NUM作过宏定义,因此应对第一个printf语句作编译故运行结果是输出了学号和成绩。在程序的第一行宏定义中,定义NUM表示字符串OK,其实也可以为任何字符串,甚至不给出任何字符串,写为: #define NUM 也具有同样的意义。 只有取消程序的第一行才会去编译第二个printf语句。读者可上机试作。<BR><BR>2. 第二种形式:<BR>#ifndef 标识符<BR>程序段1<BR>#else<BR>程序段2<BR>#endif<BR>与第一种形式的区别是将“ifdef”改为“ifndef”。它的功能是,如果标识符未被#define命令定义过则对程序段1进行编译, 否则对程序段2进行编译。这与第一种形式的功能正相反。<BR><BR>3. 第三种形式:<BR>#if 常量表达式<BR>程序段1<BR>#else<BR>程序段2<BR>#endif<BR>它的功能是,如常量表达式的值为真(非0),则对程序段1 进行编译,否则对程序段2进行编译。因此可以使程序在不同条件下,完成不同的功能<BR>#define R 1<BR>main(){<BR>float c,r,s;<BR>printf ("input a number: ");<BR>scanf("%f",&amp;c);<BR>#if R<BR>r=3.14159*c*c;<BR>printf("area of round is: %f\n",r);<BR>#else<BR>s=c*c;<BR>printf("area of square is: %f\n",s);<BR>#endif<BR>}<BR>   本例中采用了第三种形式的条件编译。在程序第一行宏定义中,定义R为1,因此在条件编译时,常量表达式的值为真, 故计算并输出圆面积。上面介绍的条件编译当然也可以用条件语句来实现。 但是用条件语句将会对整个源程序进行编译,生成的目标代码程序很长,而采用条件编译,则根据条件只编译其中的程序段1或程序段2, 生成的目标程序较短。如果条件选择的程序段很长, 采用条件编译的方法是十分必要的。<BR><BR>本章小结<BR>1. 预处理功能是C语言特有的功能,它是在对源程序正式编译前由预处理程序完成的。程序员在程序中用预处理命令来调用这些功能。<BR><BR>2. 宏定义是用一个标识符来表示一个字符串,这个字符串可以是常量、变量或表达式。在宏调用中将用该字符串代换宏名。<BR><BR>3. 宏定义可以带有参数,宏调用时是以实参代换形参。而不是“值传送”。<BR><BR>4. 为了避免宏代换时发生错误,宏定义中的字符串应加括号,字符串中出现的形式参数两边也应加括号。<BR><BR>5. 文件包含是预处理的一个重要功能,它可用来把多个源文件连接成一个源文件进行编译,结果将生成一个目标文件。<BR><BR><BR>6. 条件编译允许只编译源程序中满足条件的程序段,使生成的目标程序较短,从而减少了内存的开销并提高了程序的效率。<BR><BR>7. 使用预处理功能便于程序的修改、阅读、移植和调试,也便于实现模块化程序设计。
23
 楼主| 发表于 2006-6-13 17:32 | 只看该作者
<FONT size=2><FONT face=宋体><FONT color=red>第十章 枚举,位运算</FONT><br><br>枚举<br><br>  在实际问题中, 有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月, 一个班每周有六门课程等等。如果把这些量说明为整型, 字符型或其它类型显然是不妥当的。 为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是, 枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。<br><br>枚举类型的定义和枚举变量的说明<br><br>一、枚举的定义枚举类型定义的一般形式为:<br>enum 枚举名<br>{ 枚举值表 };<br>在枚举值表中应罗列出所有可用值。这些值也称为枚举元素。<br>例如: enum weekday<br>{ sun,mou,tue,wed,thu,fri,sat };<br>该枚举名为weekday,枚举值共有7个,即一周中的七天。 凡被说明为weekday类型变量的取值只能是七天中的某一天。<br><br>二、枚举变量的说明 如同结构和联合一样,枚举变量也可用不同的方式说明, 即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:<br>enum weekday<br>{<br>......<br>};<br>enum weekday a,b,c;或者为: enum weekday<br>{<br>......<br>}a,b,c;或者为: enum<br>{<br>......<br>}a,b,c;<br><br>枚举类型变量的赋值和使用<br><br>枚举类型在使用中有以下规定:<br>1. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值: sun=5;mon=2;sun=mon; 都是错误的。<br><br>2. 枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1, …,sat值为6。<br>main(){<br>enum weekday<br>{ sun,mon,tue,wed,thu,fri,sat } a,b,c;<br>a=sun;<br>b=mon;<br>c=tue;<br>printf("%d,%d,%d",a,b,c);<br>}<br>3. 只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量。如: a=sum;b=mon; 是正确的。而: a=0;b=1; 是错误的。如一定要把数值赋予枚举变量,则必须用强制类型转换,如: a=(enum weekday)2;其意义是将顺序号为2的枚举元素赋予枚举变量a,相当于: a=tue; 还应该说明的是枚举元素不是字符常量也不是字符串常量, 使用时不要加单、双引号。<br>main(){<br>enum body<br>{ a,b,c,d } month[31],j;<br>int i;<br>j=a;<br>for(i=1;i&lt;=30;i++){<br>month</FONT></FONT><FONT face=宋体 size=2>=j;<br>j++;<br>if (j&gt;d) j=a;<br>}<br>for(i=1;i&lt;=30;i++){<br>switch(month</FONT><FONT face=宋体 size=2>)<br>{<br>case a:printf(" %2d %c\t",i,'a'); break;<br>case b:printf(" %2d %c\t",i,'b'); break;<br>case c:printf(" %2d %c\t",i,'c'); break;<br>case d:printf(" %2d %c\t",i,'d'); break;<br>default:break;<br>}<br>}<br>printf("\n");<br>}<br><br>位运算<br><br>  前面介绍的各种运算都是以字节作为最基本位进行的。 但在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了位运算的功能, 这使得C语言也能像汇编语言一样用来编写系统程序。<br>一、位运算符C语言提供了六种位运算符:<br>&amp; 按位与<br>| 按位或<br>^ 按位异或<br>~ 取反<br>&lt;&lt; 左移<br>&gt;&gt; 右移<br><br>1. 按位与运算 按位与运算符"&amp;"是双目运算符。其功能是参与运算的两数各对应的二进位相与。只有对应的两个二进位均为1时,结果位才为1 ,否则为0。参与运算的数以补码方式出现。<br>例如:9&amp;5可写算式如下: 00001001 (9的二进制补码)&amp;00000101 (5的二进制补码) 00000001 (1的二进制补码)可见9&amp;5=1。<br><br>  按位与运算通常用来对某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&amp;255 运算 ( 255 的二进制数为0000000011111111)。<br>main(){<br>int a=9,b=5,c;<br>c=a&amp;b;<br>printf("a=%d\nb=%d\nc=%d\n",a,b,c);<br>}<br><br>2. 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位相或。只要对应的二个二进位有一个为1时,结果位就为1。参与运算的两个数均以补码出现。<br>例如:9|5可写算式如下: 00001001|00000101<br>00001101 (十进制为13)可见9|5=13<br>main(){<br>int a=9,b=5,c;<br>c=a|b;<br>printf("a=%d\nb=%d\nc=%d\n",a,b,c);<br>}<br><br>3. 按位异或运算 按位异或运算符“^”是双目运算符。其功能是参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。参与运算数仍以补码出现,例如9^5可写成算式如下: 00001001^00000101 00001100 (十进制为12)<br>main(){<br>int a=9;<br>a=a^15;<br>printf("a=%d\n",a);<br>}<br><br>4. 求反运算 求反运算符~为单目运算符,具有右结合性。 其功能是对参与运算的数的各二进位按位求反。例如~9的运算为: ~(0000000000001001)结果为:1111111111110110<br><br>5. 左移运算 左移运算符“&lt;&lt;”是双目运算符。其功能把“&lt;&lt; ”左边的运算数的各二进位全部左移若干位,由“&lt;&lt;”右边的数指定移动的位数,<br>高位丢弃,低位补0。例如: a&lt;&lt;4 指把a的各二进位向左移动4位。如a=00000011(十进制3),左移4位后为00110000(十进制48)。6. 右移运算 右移运算符“&gt;&gt;”是双目运算符。其功能是把“&gt;&gt; ”左边的运算数的各二进位全部右移若干位,“&gt;&gt;”右边的数指定移动的位数。<br>例如:设 a=15,a&gt;&gt;2 表示把000001111右移为00000011(十进制3)。 应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。<br>main(){<br>unsigned a,b;<br>printf("input a number: ");<br>scanf("%d",&amp;a);<br>b=a&gt;&gt;5;<br>b=b&amp;15;<br>printf("a=%d\tb=%d\n",a,b);<br>}<br>请再看一例!<br>main(){<br>char a='a',b='b';<br>int p,c,d;<br>p=a;<br>p=(p&lt;&lt;8)|b;<br>d=p&amp;0xff;<br>c=(p&amp;0xff00)&gt;&gt;8;<br>printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);<br>}<br><br>位域<br><br>有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:<br>struct 位域结构名<br>{ 位域列表 };<br>其中位域列表的形式为: 类型说明符 位域名:位域长度<br>例如:<br>struct bs<br>{<br>int a:8;<br>int b:2;<br>int c:6;<br>};<br>位域变量的说明与结构变量说明的方式相同。 可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:<br>struct bs<br>{<br>int a:8;<br>int b:2;<br>int c:6;<br>}data;<br>说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:<br><br>1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:<br>struct bs<br>{<br>unsigned a:4<br>unsigned :0 /*空域*/<br>unsigned b:4 /*从下一单元开始存放*/<br>unsigned c:4<br>}<br>在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。<br><br>2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。<br><br>3. 位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:<br>struct k<br>{<br>int a:1<br>int :2 /*该2位不能使用*/<br>int b:3<br>int c:2<br>};<br>从以上分析可以看出,位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。<br><br>二、位域的使用位域的使用和结构成员的使用相同,其一般形式为: 位域变量名·位域名 位域允许用各种格式输出。<br>main(){<br>struct bs<br>{<br>unsigned a:1;<br>unsigned b:3;<br>unsigned c:4;<br>} bit,*pbit;<br>bit.a=1;<br>bit.b=7;<br>bit.c=15;<br>printf("%d,%d,%d\n",bit.a,bit.b,bit.c);<br>pbit=&amp;bit;<br>pbit-&gt;a=0;<br>pbit-&gt;b&amp;=3;<br>pbit-&gt;c|=1;<br>printf("%d,%d,%d\n",pbit-&gt;a,pbit-&gt;b,pbit-&gt;c);<br>}<br>上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。<br>程序的9、10、11三行分别给三个位域赋值。( 应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&amp;=", 该行相当于: pbit-&gt;b=pbit-&gt;b&amp;3位域b中原有值为7,与3作按位与运算的结果为3(111&amp;011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=", 相当于: pbit-&gt;c=pbit-&gt;c|1其结果为15。程序第17行用指针方式输出了这三个域的值。<br><br>类型定义符typedef<br><br>C语言不仅提供了丰富的数据类型,而且还允许由用户自己定义类型说明符,也就是说允许由用户为数据类型取“别名”。 类型定义符typedef即可用来完成此功能。例如,有整型量a,b,其说明如下: int aa,b; 其中int是整型变量的类型说明符。int的完整写法为integer,<br>为了增加程序的可读性,可把整型说明符用typedef定义为: typedef int INTEGER 这以后就可用INTEGER来代替int作整型变量的类型说明了。 例如: INTEGER a,b;它等效于: int a,b; 用typedef定义数组、指针、结构等类型将带来很大的方便,不仅使程序书写简单而且使意义更为明确,因而增强了可读性。例如:<br>typedef char NAME[20]; 表示NAME是字符数组类型,数组长度为20。<br>然后可用NAME 说明变量,如: NAME a1,a2,s1,s2;完全等效于: char a1[20],a2[20],s1[20],s2[20]<br>又如:<br>typedef struct stu{ char name[20];<br>int age;<br>char sex;<br>} STU;<br>定义STU表示stu的结构类型,然后可用STU来说明结构变量: STU body1,body2;<br>typedef定义的一般形式为: typedef 原类型名 新类型名 其中原类型名中含有定义部分,新类型名一般用大写表示, 以<br>便于区别。在有时也可用宏定义来代替typedef的功能,但是宏定义是由预处理完成的,而typedef则是在编译时完成的,后者更为灵活方便。<br><br>本章小结<br><br>1. 枚举是一种基本数据类型。枚举变量的取值是有限的,枚举元素是常量,不是变量。<br><br>2. 枚举变量通常由赋值语句赋值,而不由动态输入赋值。枚举元素虽可由系统或用户定义一个顺序值,但枚举元素和整数并不相同,它们属于不同的类型。因此,也不能用printf语句来输出元素值(可输出顺序值)。<br><br>3. 位运算是C语言的一种特殊运算功能, 它是以二进制位为单位进行运算的。位运算符只有逻辑运算和移位运算两类。位运算符可以与赋值符一起组成复合赋值符。如&amp;=,|=,^=,&gt;&gt;=,&lt;&lt;=等。<br><br>4. 利用位运算可以完成汇编语言的某些功能,如置位,位清零,移位等。还可进行数据的压缩存储和并行运算。<br><br>5. 位域在本质上也是结构类型,不过它的成员按二进制位分配内存。其定义、说明及使用的方式都与结构相同。<br><br>6. 位域提供了一种手段,使得可在高级语言中实现数据的压缩,节省了存储空间,同时也提高了程序的效率。<br><br>7. 类型定义typedef 向用户提供了一种自定义类型说明符的手段,照顾了用户编程使用词汇的习惯,又增加了程序的可读性。</FONT>
发布商机信息及企业宣传推广--请移步注册重庆商务网!!
快捷入口:给经典重庆客服留言
您需要登录后才可以回帖 登录 | 入驻经典

本版积分规则

连接招租|手机版| ( 苏ICP备13006526号-1 )

GMT+8, 2024-6-13 17:36

  • 欢迎关注重庆发展,多发帖多回帖才能持续保持帐号活力哟!请不要发表任何政 治,领 导,官 员,人 事及其它违法违规类言论,以免帐号被封禁。感谢您的支持和理解!
经典重庆旗下网站 | 24小时客服:13424176859 308675020

爱重庆,爱上经典重庆! 爱重庆,就上经典重庆!

快速回复 返回顶部 返回列表