汽车生活馆是干什么的:c语言

来源:百度文库 编辑:中财网 时间:2024/05/09 06:51:27
编辑本段结构
1.一个C语言源程序可以由一个或多个源文件组成。
2.每个源文件可由一个或多个函数组成。
3.一个源程序不论由多少个文件组成,都有一个且只能有一个main函数,即主函数。
4.源程序中可以有预处理命令(包括include 命令、if命令、pragma命令),预处理命令通常应放在源文件或源程序的最前面。
5.每一个说明,每一个语句都必须以分号结尾。但预处理命令,函数头和花括号“}”之后不能加分号。
6.标识符,关键字之间必须至少加一个空格以示间隔。若已有明显的间隔符,也可不再加空格来间隔。
编辑本段特点
1. C是高级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
2.C是结构式语言。结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C 语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
3.C语言功能齐全。具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游戏。
4. C语言适用范围大。适合于多种操作系统,如Windows、DOS、UNIX等等;也适用于多种机型。
C语言对编写需要硬件进行操作的场合,明显优于其它高级语言,有一些大型应用软件也是用C语言编写的。
编辑本段特色
指针是C语言的一大特色,可以说是C语言优于其它高级语言的一个重要原因。就是因为它有指针,可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强了安全性,受到了一些用户的支持,但是,由于这些改进增加语言的复杂度,也为另一部分所诟病。Java则吸取了C++的教训,取消了指针操作,也取消了C++改进中一些备受争议的地方,在安全性和适合性方面均取得良好的效果,但其本身解释在虚拟机中运行,运行效率低于C++/C。一般而言,C,C++,java被视为同一系的语言,它们长期占据着程序使用榜的前三名。
C语言的强劲之处在于用数学观点对基于存储程序原理(store program concept)的硬件架构进行软抽象。
编辑本段入门
对于一个初学者,Microsoft Visual C++是一个比较好的软件。界面友好,功能强大,调试也很方便。这是微软出的一个C语言集成开发环境(IDE),主要有:VC++6.0、VS2005.VS2008.VS2010等,分为企业版和学生版等。对于初学者VC++6.0是比较容易上手的,但其对标准支持的不好可能使人养成不良的编程习惯。
在unix/linux操作系统上,学习c语言一般使用vim/emacs来编辑源文件,使用gcc来编译源文件,使用make程序来管理编译过程。
其他编译器如CodeBlocks10.05(跨平台linux/windows开源免费支持高达29种不同的项目)、dev-c++(开源免费)、turbo、c-free5.0、codelite(开源免费)、eclipse(开源免费基于Java 扩展平台)……
编辑本段历史
C语言的祖先是BCPL语言。
1967年,剑桥大学的 Martin Richards 对CPL语言进行了简化,于是产生了BCPL(Basic Combined Pogramming Language)语言。
1970年,美国贝尔实验室的 Ken Thompson。以BCPL语言为基础,设计出很简单且很接近硬件的B语言(取BCPL的首字母)。并且他用B语言写了第一个UNIX操作系统。
在1972年,美国贝尔实验室的 D.M.Ritchie 在B语言的基础上最终设计出了一种新的语言,他取了BCPL的第二个字母作为这种语言的名字,这就是C语言。
为了使UNIX操作系统推广,1977年Dennis M.Ritchie发表了不依赖于具体机器系统的C语言编译文本《可移植的C语言编译程序》。
1978年由美国电话电报公司(AT&T)贝尔实验室正式发表了C语言。同时由B.W.Kernighan和D.M.Ritchie合著了著名的《The C Programming Language》一书。通常简称为《K&R》,也有人称之为《K&R》标准。但是,在《K&R》中并没有定义一个完整的标准C语言,后来由美国国家标准化协会(American National Standards Institute)在此基础上制定了一个C语言标准,于一九八三年发表。通常称之为ANSI C。
K&R第一版在很多语言细节上也不够精确,对于pcc这个“参照编译器”来说,它日益显得不切实际;K&R甚至没有很好表达它所要描述的语言,把后续扩展扔到了一边。最后,C在早期项目中的使用受商业和政府合同支配,它意味着一个认可的正式标准是重要的。因此(在M. D. McIlroy的催促下),ANSI于1983年夏天,在CBEMA的领导下建立了X3J11委员会,目的是产生一个C标准。X3J11在1989年末提出了一个他们的报告[ANSI 89],后来这个标准被ISO接受为ISO/IEC 9899-1990。
1990年,国际标准化组织ISO(International Organization for Standards)接受了89 ANSI C 为I SO C 的标准(ISO9899-1990)。1994年,ISO修订了C语言的标准。
1995年,ISO对C90做了一些修订,即“1995基准增补1(ISO/IEC/9899/AMD1:1995)”。1999年,ISO有对C语言标准进行修订,在基本保留原来C语言特征的基础上,针对应该的需要,增加了一些功能,尤其是对C++中的一些功能,命名为ISO/IEC9899:1999。
2001年和2004年先后进行了两次技术修正。
目前流行的C语言编译系统大多是以ANSI C为基础进行开发的,但不同版本的C编译系统所实现的语言功能和语法规则有略有差别。
编辑本段优点
简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写形式自由,区分大小写。把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元。
运算符丰富
C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
数据类型丰富
C语言的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据结构的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能,支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
同时对于不同的编译器也有各种
C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰,便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
语法限制不太严格,程序设计自由度大
虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。
允许直接访问物理地址,对硬件进行操作
由于C语言允许直接访问物理地址,可以直接对硬件进行操作,因此它既具有高级语言的功能,又具有低级语言的许多功能,能够像汇编语言一样对位、字节和地址进行操作,而这三者是计算机最基本的工作单元,可用来写系统软件。
生成目标代码质量高,程序执行效率高
一般只比汇编程序生成的目标代码效率低10へ20%。
适用范围大,可移植性好
C语言有一个突出的优点就是适合于多种操作系统,如DOS、UNIX、windows 98.windows NT;也适用于多种机型。C语言具有强大的绘图能力,可移植性好,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画,它也是数值计算的高级语言。
编辑本段缺点
1. C语言的缺点主要表现在数据的封装性上,这一点使得C在数据的安全性上有很大缺陷,这也是C和C++的一大区别。
2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
编辑本段运算
C语言的运算非常灵活,功能十分丰富,运算种类远多于其它程序设计语言。在表达式方面较其它程序语言更为简洁,如自加、自减、逗号运算和三目运算使表达式更为简单,但初学者往往会觉的这种表达式难读,关键原因就是对运算符和运算顺序理解不透不全。当多种不同运算组成一个运算表达式,即一个运算式中出现多种运算符时,运算的优先顺序和结合规则显得十分重要。在学习中,只要我们对此合理进行分类,找出它们与我们在数学中所学到运算之间的不同点之后,记住这些运算也就不困难了,有些运算符在理解后更会牢记心中,将来用起来得心应手,而有些可暂时放弃不记,等用到时再记不迟。
先要明确运算符按优先级不同分类,《C程序设计》运算符可分为15种优先级,从高到低,优先级为1 ~ 15,除第2.13级和第14级为从右至左结合外,其它都是从左至右结合,它决定同级运算符的运算顺序.
编辑本段结构
顺序结构
顺序结构的程序设计是最简单的,只要按照解决问题的顺序写出相应的语句就行,它的执行顺序是自上而下,依次执行。
例如:a = 3,b = 5,现交换a,b的值,这个问题就好像交换两个杯子水,这当然要用到第三个杯子,假如第三个杯子是c,那么正确的程序为:c = a; a = b; b = c;执行结果是a = 5,b = c = 3如果改变其顺序,写成:a = b; c = a; b =c;则执行结果就变成a = b = c = 5,不能达到预期的目的,初学者最容易犯这种错误。顺序结构可以独立使用构成一个简单的完整程序,常见的输入、计算,输出三步曲的程序就是顺序结构,例如计算圆的面积,其程序的语句顺序就是输入圆的半径r,计算s = 3.14159*r*r,输出圆的面积s。不过大多数情况下顺序结构都是作为程序的一部分,与其它结构一起构成一个复杂的程序,例如分支结构中的复合语句、循环结构中的循环体等。选择结构
顺序结构的程序虽然能解决计算、输出等问题,但不能做判断再选择。对于要先做判断再选择的问题就要使用选择结构。选择结构的执行是依据一定的条件选择执行路径,而不是严格按照语句出现的物理顺序。选择结构的程序设计方法的关键在于构造合适的分支条件和分析程序流程,根据不同的程序流程选择适当的选择语句。选择结构适合于带有逻辑或关系比较等条件判断的计算,设计这类程序时往往都要先绘制其程序流程图,然后根据程序流程写出源程序,这样做把程序设计分析与语言分开,使得问题简单化,易于理解。程序流程图是根据解题分析所绘制的程序执行流程图。
几种基本的选择结构①if(条件)
{选择体}
这种选择结构中的选择体可以是一条语句,此时“{}”可以省略,也可以是多条语句即复合语句。它有两条分支路径可选,一是当条件为真,执行分支体,否则跳过选择体,这时选择体就不会执行。如:要计算x的绝对值,根据绝对值定义,我们知道,当x>=0时,其绝对值不变,而x<0时其绝对值是为x的反号,因此程序段为:if(x<0)x=-x;
②if(条件)
{择路1}
else
{择路2}
这是典型的选择结构,如果条件成立,执行路径1,否则执行路径2,路径1和路径2都可以是1条或若干条语句构成。如:求ax^2+bx+c=0的根
分析:因为当b^2-4ac>=0时,方程有两个实根,否则(b^2-4ac<0)有两个共轭复根。其程序段如下:
int a,b,c,d,x,y;
printf("Please put the number of a,b&c from the quadratic equation of one variable one by one\n");
scanf("%d%d%d",&a,&b,&c);
d=b*b-4*a*c;
if(d<0)
{
printf("NO Root!Wrong!\n");
}
else
{
y=-b-sqrt(d)/2*a;
x=-b+sqrt(d)/2*a;
printf("The 1st equation root=%d\nThe 2nd equation root=%d",y,x);
}
③IF嵌套分支语句:其语句格式为:
if(条件1) {择路1}
else if(条件2){择路2}
else if(条件3){择路3}
……
else if(条件n){择路n}
else {择路n+1}
FOR嵌套,其语句格式为:
for(初值A;范围A;步长A)
{
for(初值B;范围B;步长B)
{
循环体
}
}
FOR嵌套例子:九九乘法表
main()
{
int a,b,c;
for(a=1;a<=9;a++)
{
for(b=1;b<=a;b++)
{
c=b*a;
printf("%dx%d=%d ",b,a,c);
}
printf("\n");
}
}
嵌套分支语句虽可解决多个入口和出口的问题,但超过3重嵌套后,语句结构变得非常复杂,对于程序的阅读和理解都极为不便,建议嵌套在3重以内,超过3重可以用下面的语句。
④switch开关语句:该语句也是多选择语句,到底执行哪一块,取决于开关设置,也就是表达式的值与常量表达式相匹配的那一路,它不同if…else语句,它的所有路径都是并列的,程序执行时,由第一分支开始查找,如果相匹配,执行其后的块,接着执行第2路径,第3路径……的块,直到遇到break语句;如果不匹配,查找下一个分支是否匹配。这个语句在应用时要特别注意开关条件的合理设置以及break语句的合理应用。
“?”语句问号语句也是分支的一种,格式类似(a循环结构
循环结构可以减少源程序重复书写的工作量,用来描述重复执行某段算法的问题,这是程序设计中最能发挥计算机特长的程序结构,C语言中提供四种循环,即goto循环、while循环、do while循环和for循环。四种循环可以用来处理同一问题,一般情况下它们可以互相代替换,但一般不提倡用goto循环,因为强制改变程序的顺序经常会给程序的运行带来不可预料的错误。
特别要注意在循环体内应包含趋于结束的语句(即循环变量值的改变),否则就可能成了一个死循环,这是初学者的一个常见错误。
三个循环的异同点:用while和do…while循环时,循环变量的初始化的操作应在循环体之前,而for循环一般在语句1中进行的;while循环和for循环都是先判断表达式,后执行循环体,而do…while循环是先执行循环体后判断表达式,也就是说do…while的循环体最少被执行一次,而while循环和for就可能一次都不执行。另外还要注意的是这三种循环都可以用break语句跳出循环,用continue语句结束本次循环,而goto语句与if构成的循环,是不能用break和 continue语句进行控制的。
顺序结构、分支结构和循环结构并不彼此孤立的,在循环中可以有分支、顺序结构,分支中也可以有循环、顺序结构,其实不管哪种结构,我们均可广义的把它们看成一个语句。在实际编程过程中常将这三种结构相互结合以实现各种算法,设计出相应程序,但是要编程的问题较大,编写出的程序就往往很长、结构重复多,造成可读性差,难以理解,解决这个问题的方法是将C程序设计成模块化结构。模块化程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数。因此,对函数的定义、调用、值的返回等中要尤其注重理解和应用,并通过上机调试加以巩固。
判断语句(选择结构)循环语句(循环结构)跳转语句(循环结构:是否循环)
if 语句:“如果”语句while 语句:“当…”语句goto 语句:“转舵”语句
if—else 语句:“若…(则)…否则…”语句do—while 语句:“做…当…(时候)”语句break 语句:“中断”(循环)语句
switch 语句:“切换”语句for 语句:条件语句(即“(做)…为了…”语句)continue 语句:“继续”语句(结束本次循环,继续下一次循环)
switch—case:“切换—情况”语句?return 语句:“返回馈”语句
编辑本段关键字
关键字就是已被C语言本身使用,不能作其它用途使用的字。例如关键字不能用作变量名、函数名等
由ANSI标准定义的C语言关键字共32个:
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed void
default goto sizeof volatile do if while static
根据关键字作用将关键字分为数据类型关键字和流程控制关键字两大类大类小类名称与作用
1 数据类型关键字A.基本数据类型(5个)void:声明函数无返回值或无参数,声明无类型指针,显式丢弃运算结果
char:字符型类型数据,属于整型数据的一种
int:整型数据,通常为编译器指定的机器字长
float:单精度浮点型数据,属于浮点数据的一种
double:双精度浮点型数据,属于浮点数据的一种
B .类型修饰关键字(4个)short:修饰int,短整型数据,可省略被修饰的int。
long:修饰int,长整形数据,可省略被修饰的int。
signed:修饰整型数据,有符号数据类型
unsigned:修饰整型数据,无符号数据类型
C .复杂类型关键字(5个)struct:结构体声明
union:共用体声明
enum:枚举声明
typedef:声明类型别名
sizeof:得到特定类型或特定类型变量的大小
D .存储级别关键字(6个)auto:指定为自动变量,由编译器自动分配及释放。通常在栈上分配
static:指定为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
register:指定为寄存器变量,建议编译器将变量存储到寄存器中使用,也可以修饰函数形参,建议编译器通过寄存器而不是堆栈传递参数
extern:指定对应变量为外部变量,即标示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。
const:与volatile合称“cv特性”,指定变量不可被当前线程/进程改变(但有可能被系统或其他线程/进程改变)
volatile:与const合称“cv特性”,指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量的值
2 流程控制关键字A .跳转结构(4个)return:用在函数体中,返回特定值(或者是void值,即不返回值)
continue:结束当前循环,开始下一轮循环
break:跳出当前循环或switch结构
goto:无条件跳转语句
B .分支结构(5个)if:条件语句,后面不需要放分号
else:条件语句否定分支(与if连用)
switch:开关语句(多重分支语句)
case:开关语句中的分支标记
default:开关语句中的“其他”分支,可选。
C .循环结构(3个)for:for循环结构,for(1;2;3)4;的执行顺序为1->2->4->3->2...循环,其中2为循环条件。在整个for循环过程中,表达式1只计算一次,表达式2和表达式3则可能计算多次,也可能一次也不计算。循环体可能多次执行,也可能一次都不执行。
do:do循环结构,do 1 while(2); 的执行顺序是1->2->1...循环,2为循环条件
while:while循环结构,while(1) 2; 的执行顺序是1->2->1...循环,1为循环条件
以上循环语句,当循环条件表达式为真则继续循环,为假则跳出循环。
编辑本段经典错误
void main()的用法并不是任何标准制定的,是Microsoft制定的。大部分编译器不支持这种写法。C语言正确的语法是int main(void)。 在 C++ 标准中,虽然 main 的标准型态应是int,但编译器实现中也可以自行定义型态,不过,所有实现均应接受 int main(void)的。如果坚持使用void main()会使C程序失去跨平台的移植特性。
编辑本段开发环境
常用的C语言IDE(集成开发环境)有Microsoft Visual C++,Dev-C++,Code::Blocks,Borland C++,Watcom C++,Borland C++ Builder,GNU DJGPP C++,Lccwin32 C Compiler 3.1,High C,Turbo C,C-Free,win-tc, xcode(mac os x)等。
编辑本段新标
在ANSI标准化后,C语言的标准在一段相当的时间内都保持不变,尽管C继续在改进。(实际上,NormativeAmendment1在1995年已经开发了一个新的C语言版本。但是这个版本很少为人所知。)标准在90年代才经历了改进,这就是ISO9899:1999(1999年出版)。这个版本就是通常提及的C99。它被ANSI于2000年3月采用。在C99中包括的特性
对编译器限制增加了,比如源程序每行要求至少支持到4095 字节,变量名函数名的要求支持到63 字节 (extern 要求支持到31)
预处理增强了。例如:
宏支持取参数#defineMacro(...) __VA_ARGS__
使用宏的时候,参数如果不写,宏里用#,## 这样的东西会扩展成空串。(以前会出错的)
支持// 行注释(这个特性实际上在C89的很多编译器上已经被支持了)
增加了新关键字 restrict, inline,_Complex, _Imaginary,_Bool
支持 long long, long double _Complex, float _Complex 这样的类型
支持 <: :> <% %> %: %:%: ,等等奇怪的符号替代
支持了不定长的数组。数组的长度就可以用变量了。声明类型的时候呢,就用 int a[*] 这样的写法。不过考虑到效率和实现,这玩意并不是一个新类型。所以就不能用在全局里,或者 struct union 里面,如果你用了这样的东西,goto 语句就受限制了。
变量声明不必放在语句块的开头,for 语句提倡这么写 for(int i=0;i<100;++i) 就是说,int i 的声明放在里面,i 只在 for 里面有效。(VC没有遵守这条标准,i 在 for 外也有效)
当一个类似结构的东西需要临时构造的时候,可以用(type_name){xx,xx,xx} 这有点像C++ 的构造函数
初始化结构的时候现在可以这样写:
struct {int a[3], b;} hehe[] = { [0].a = ,[1].a = 2 };
struct {int a, b, c, d;} hehe = { .a = 1,。c = 3,4, .b = 5} // 3,4 是对。c,.d 赋值的
字符串里面,\u 支持 unicode 的字符
支持 16 进制的浮点数的描述
所以 printf scanf 的格式化串多支持了 ll / LL (VC6 里用的I64) 对应新的 long long 类型。
浮点数的内部数据描述支持了新标准,这个可以用 #pragma 编译器指定
除了已经有的 __line__ __file__ 以外,又支持了一个__func__ 可以得到当前的函数名
对于非常数的表达式,也允许编译器做化简
修改了对于/ % 处理负数上的定义,比如老的标准里-22 / 7 = -3,-22 % 7 = -1 而现在-22 / 7 = -4,-22 % 7 = 6
取消了不写函数返回类型默认就是 int 的规定
允许 struct 定义的最后一个数组写做[] 不指定其长度描述
const const int i; 将被当作 const int i; 处理
增加和修改了一些标准头文件, 比如定义 bool 的 定义一些标准长度的 int 的 定义复数的 定义宽字符的有点泛型味道的数学函数 跟浮点数有关的里多了一个 va_copy 可以复制。.. 的参数。 里多了个 struct tmx 对 struct tm做了扩展
输入输出对宽字符还有长整数等做了相应的支持相对于c89的变化
1.增加restrict指针
C99中增加了公适用于指针的restrict类型修饰符,它是初始访问指针所指对象的唯一途径,因此只有借助restrict指针表达式才能访问对象。restrict指针指针主要用做函数变元,或者指向由malloc()函数所分配的内存变量。restrict数据类型不改变程序的语义。
如果某个函数定义了两个restrict指针变元,编译程序就假定它们指向两个不同的对象,memcpy()函数就是restrict指针的一个典型应用示例。C89中memcpy()函数原型如下:
代码: void *memcpy (void *s1, const void *s2,size_tsize);
如果s1和s2所指向的对象重叠,其操作就是未定义的。memcpy()函数只能用于不重叠的对象。C99中memcpy()函数原型如下:代码:void *memcpy(void *restrict s1, const void *restrict s2,size_t size);
通过使用restrict修饰s1和s2 变元,可确保它们在该原型中指向不同的对象。
2.inline(内联)关键字
内联函数除了保持结构化和函数式的定义方式外,还能使程序员写出高效率的代码。函数的每次调用与返回都会消耗相当大的系统资源,尤其是当函数调用发生在重复次数很多的循环语句中时.一般情况下,当发生一次函数调用时,变元需要进栈,各种寄存器内存需要保存。当函数返回时,寄存器的内容需要恢复。如果该函数在代码内进行联机扩展,当代码执行时,这些保存和恢复操作旅游活动会再发生,而且函数调用的执行速度也会大大加快。函数的联机扩展会产生较长的代码,所以只应该内联对应用程序性能有显著影响的函数以及长度较短的函数
3.新增数据类型
_Bool
值是0或1。C99中增加了用来定义bool、true以及false宏的头文件夹,以便程序员能够编写同时兼容于C与C++的应用程序。在编写新的应用程序时,应该使用
头文件中的bool宏。
_Complex and _Imaginary
C99标准中定义的复数类型如下:float_Complex; float_Imaginary; double_Complex; double_Imaginary; long double_Complex; long double_Imaginary.
头文件中定义了complex和imaginary宏,并将它们扩展为_Complex和_Imaginary,因此在编写新的应用程序时,应该使用头文件中的complex和imaginary宏。
long long int
C99标准中引进了long long int(-(2e63 - 1)至2e63 - 1)和unsigned long long int(0 - 2e64 - 1)。long long int能够支持的整数长度为64位。
4.对数组的增强
可变长数组
C99中,程序员声明数组时,数组的维数可以由任一有效的整型表达式确定,包括只在运行时才能确定其值的表达式,这类数组就叫做可变长数组,但是只有局部数组才可以是变长的。
可变长数组的维数在数组生存期内是不变的,也就是说,可变长数组不是动态的。可以变化的只是数组的大小。可以使用*来定义不确定长的可变长数组。
数组声明中的类型修饰符
在C99中,如果需要使用数组作为函数变元,可以在数组声明的方括号内使用static关键字,这相当于告诉编译程序,变元所指向的数组将至少包含指定的元素个数。也可以在数组声明的方括号内使用restrict,volatile,const关键字,但只用于函数变元。如果使用restrict,指针是初始访问该对象的唯一途径。如果使用const,指针始终指向同一个数组。使用volatile没有任何意义。
5.单行注释
引入了单行注释标记"//" ,可以象C++一样使用这种注释了。
6.分散代码与声明
7.预处理程序的修改
a、变元列表
宏可以带变元,在宏定义中用省略号(。..)表示。内部预处理标识符__VA_ARGS__决定变元将在何处得到替换。例:#define MySum(...) sum(__VA_ARGS__) 语句MySum(k,m,n);
将被转换成:sum(k, m, n); 变元还可以包含变元。例:#define compare(compf,。..)compf(__VA_ARGS__) 其中的compare(strcmp,"small","large");将替换成:strcmp("small","large");
b、_Pragma运算符
C99引入了在程序中定义编译指令的另外一种方法:_Pragma运算符。格式如下:
_Pragma("directive")
其中directive是要满打满算的编译指令。_Pragma运算符允许编译指令参与宏替换。
c、内部编译指令
STDCFP_CONTRACT ON/OFF/DEFAULT 若为ON,浮点表达式被当做基于硬件方式处理的独立单元。默认值是定义的工具。
STDCFEVN_ACCESS ON/OFF/DEFAULT 告诉编译程序可以访问浮点环境。默认值是定义的工具。
STDC CX_LIMITED_RANGE ON/OFF/DEFAULT 若值为ON,相当于告诉编译程序某程序某些含有复数的公式是可靠的。默认是OFF。
d、新增的内部宏
__STDC_HOSTED__ 若操作系统存在,则为1
__STDC_VERSION__ 199991L或更高。代表C的版本
__STDC_IEC_599__ 若支持IEC 60559浮点运算,则为1
__STDC_IEC_599_COMPLEX__ 若支持IEC 60599复数运算,则为1
__STDC_ISO_10646__ 由编译程序支持,用于说明ISO/IEC 10646标准的年和月格式:yyymmmL
9.复合赋值
C99中,复合赋值中,可以指定对象类型的数组、结构或联合表达式。当使用复合赋值时,应在括弧内指定类型,后跟由花括号围起来的初始化列表;若类型为数组,则不能指定数组的大小。建成的对象是未命名的。
例: double *fp = (double[]) {1.1,2.2, 3.3};
该语句用于建立一个指向double的指针fp,且该指针指向这个3元素数组的第一个元素。在文件域内建立的复合赋值只在程序的整个生存期内有效。在模块内建立的复合赋值是局部对象,在退出模块后不再存在。
10.柔性数组结构成员
C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员。柔性数组成员允许结构中包含一个大小可变的数组。sizeof返回的这种结构大小不包括柔性数组的内存。包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。
11.指定的初始化符
C99中,该特性对经常使用稀疏数组的程序员十分有用。指定的初始化符通常有两种用法:用于数组,以及用于结构和联合。用于数组的格式:[index] = vol; 其中,index表示数组的下标,vol表示本数组元素的初始化值。
例如: int x[10] = {[0] = 10,[5] = 30}; 其中只有x[0]和x[5]得到了初始化.用于结构或联合的格式如下:
member-name(成员名称)
对结构进行指定的初始化时,允许采用简单的方法对结构中的指定成员进行初始化。
例如: struct example{ int k, m, n; } object = {m = 10,n = 200};
其中,没有初始化k。对结构成员进行初始化的顺序没有限制。
12.printf()和scanf()函数系列的增强
C99中printf()和scanf()函数系列引进了处理long long int和unsigned long longint数据类型的特性。long long int 类型的格式修饰符是ll。在printf()和scanf()函数中,ll适用于d, i, o,u 和x格式说明符。另外,C99还引进了hh修饰符。当使用d, i, o,u和x格式说明符时,hh用于指定char型变元。ll和hh修饰符均可以用于n说明符。
格式修饰符a和A用在printf()函数中时,结果将会输出十六进制的浮点数。格式如下:[-]0xh, hhhhp + d使用A格式修饰符时,x和p必须是大写。A和a格式修饰符也可以用在scanf()函数中,用于读取浮点数。调用printf()函数时,允许在%f说明符前加上l修饰符,即%lf,但不起作用。
13.C99新增的库
C89中标准的头文件
定义宏assert()
字符处理
错误报告
定义与实现相关的浮点值勤
定义与实现相关的各种极限值
支持函数setlocale()
数学函数库使用的各种定义
支持非局部跳转
定义信号值
支持可变长度的变元列表
定义常用常数
支持文件输入和输出
其他各种声明
支持串函数
支持系统时间函数
C99新增的头文件和库
支持复数算法
给出对浮点状态标记和浮点环境的其他方面的访问
定义标准的、可移植的整型类型集合。也支持处理最大宽度整数的函数
首先在此1995年第一次修订时引进,用于定义对应各种运算符的宏
支持布尔数据类型类型。定义宏bool,以便兼容于C++
定义标准的、可移植的整型类型集合。该文件包含在
定义一般类型的浮点宏
首先在1995年第一次修订时引进,用于支持多字节和宽字节函数
首先在1995年第一次修订时引进,用于支持多字节和宽字节分类函数
14.__func__预定义标识符
用于指出__func__所存放的函数名,类似于字符串赋值。
15.其它特性的改动
放宽的转换限制
限制 C89标准C99标准
数据块的嵌套层数15 127
条件语句的嵌套层数8 63
内部标识符中的有效字符个数31 63
外部标识符中的有效字符个数6 31
结构或联合中的成员个数127 1023
函数调用中的参数个数31 127
不再支持隐含式的int规则
删除了隐含式函数声明
对返回值的约束
C99中,非空类型函数必须使用带返回值的return语句。
扩展的整数类型
扩展类型 含义
int16_t 整数长度为精确16位
int_least16_t 整数长度为至少16位
int_fast32_t 最稳固的整数类型,其长度为至少32位
intmax_t 最大整数类型
uintmax_t 最大无符号整数类型
对整数类型提升规则的改进
C89中,表达式中类型为char,short int或int的值可以提升为int或unsigned int类型.
C99中,每种整数类型都有一个级别。例如:long long int 的级别高于int, int的级别高于char等.在表达式中,其级别低于int或unsigned int的任何整数类型均可被替换成int或unsigned int类型。
有必要说明的是,c99的main()函数要求必须返回一个int值给程序的激活者(通常是操作系统)0表示正常推出,非0表示异常。
编辑本段图形编程
基于TC中的graphics.h
Turbo C 提供了非常丰富的图形函数,所有图形函数的原型均在graphics. h中,本节主要介绍图形模式的初始化、独立图形程序的建立、基本图形功能、图形窗口以及图形模式下的文本输出等函数。另外,使用图形函数时要确保有显示器图形驱动程序*BGI,同时将集成开发环境Options/Linker中的Graphicslib选为on,只有这样才能保证正确使用图形函数。图形模式的初始化不同的显示器适配器有不同的图形分辨率。即是同一显示器适配器,在不同模式下也有不同分辨率。因此,在屏幕作图之前,必须根据显示器适配器种类将显示器设置成为某种图形模式,在未设置图形模式之前,微机系统默认屏幕为文本模式(80列,25行字符模式),此时所有图形函数均不能工作。设置屏幕为图形模式,可用下列图形初始化函数:
void far initgraph(int far *gdriver, int far *gmode,char *path);
其中gdriver和gmode分别表示图形驱动器和模式,path是指图形驱动程序所在的目录路径。有关图形驱动器、图形模式的符号常数及对应的分辨率见下表。
图形驱动程序由Turbo C出版商提供,文件扩展名为。BGI。根据不同的图形适配器有不同的图形驱动程序。例如对于EGA、 VGA 图形适配器就调用驱动程序EGAVGA.BGI。
图形驱动器、模式的符号常数及数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━图形驱动器(gdriver) 图形模式(gmode)
─────────────────────色调 分辨率
符号常数数值 符号常数数值
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CGA 1 CGAC0 0 C0 320*200
CGAC1 1 C1 320*200
CGAC2 2 C2 320*200
CGAC3 3 C3 320*200
CGAHI 4 2色640*200
──────────────────────────────
MCGA 2 MCGAC0 0 C0 320*200
MCGAC1 1 C1 320*200
MCGAC2 2 C2 320*200
MCGAC3 3 C3 320*200
MCGAMED 4 2色640*200
MCGAHI 5 2色640*480
──────────────────────────────
EGA 3 EGALO 0 16色640*200
EGAHI 1 16色640*350
──────────────────────────────
EGA64 4 EGA64LO 0 16色640*200
EGA64HI 1 4色640*350
──────────────────────────────
EGAMON 5 EGAMONHI 0 2色640*350
──────────────────────────────
IBM8514 6 IBM8514LO 0 256色640*480
IBM8514HI 1 256色1024*768
──────────────────────────────
HERC 7 HERCMONOHI 0 2色720*348
──────────────────────────────
ATT400 8 ATT400C0 0 C0 320*200
ATT400C1 1 C1 320*200
ATT400C2 2 C2 320*200
ATT400C3 3 C3 320*200
ATT400MED 4 2色320*200
ATT400HI 5 2色320*200
──────────────────────────────
VGA 9 VGALO 0 16色640*200
VGAMED 1 16色640*350
VGAHI 2 16色640*480
──────────────────────────────
PC3270 10 PC3270HI 0 2色720*350
──────────────────────────────
DETECT 0 用于硬件测试
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
使用图形初始化函数设置VGA高分辨率图形模式#include
int main()
{
int gdriver, gmode;
gdriver=VGA;
gmode=VGAHI;
initgraph(&gdriver,&gmode, "c:\\caic\\bgi");
bar3d(100,100, 300,250, 50,1); /*画一长方体*/
getch();
closegraph();
return 0;
}
有时编程者并不知道所用的图形显示器适配器种类,或者需要将编写的程序用于不同图形驱动器,Turbo C提供了一个自动检测显示器硬件的函数,其调用格式为: void far detectgraph(int *gdriver,*gmode);其中gdriver和gmode的意义与上面相同。 自动进行硬件测试后进行图形初始化#include
int main()
{
int gdriver, gmode;
detectgraph(&gdriver,&gmode); /*自动测试硬件*/
printf("the graphics driver is %d, mode is %d\n",
gdriver,gmode); /*输出测试结果*/
getch();
initgraph(&gdriver,&gmode, "c:\\caic\\bgi");
/* 根据测试结果初始化图形*/
bar3d(10,10, 130,250, 20,1);
getch();
closegraph();
return 0;
}
上例程序中先对图形显示器自动检测,然后再用图形初始化函数进行初始化设置,但Turbo C提供了一种更简单的方法,即用driver=DETECT 语句后再跟initgraph()函数就行了。采用这种方法后,上例可改为:
#include
int main()
{
int gdriver=DETECT, gmode;
initgraph(&gdriver,&gmode, "c:\\caic\\bgi");
bar3d(50,50, 150,30, 50,1);
getch();
closegraph();
return 0;
}
另外,Turbo C 提供了退出图形状态的函数closegraph(),其调用格式为: void far closegraph(void);调用该函数后可退出图形状态而进入文本方式( Turbo C 默认方式),并释放用于保存图形驱动程序和字体的系统内存。
基于WIN32 API及其他一些图形库
事实上TC2.0的图形库graphics.h功能有限:256色、640×480的分辨率,已经过时了,因此目前基本上不再使用。而C语言结合WIN32 API可以编写出windows应用程序。实际上我们有更好的选择:MFC、QT、OpenGL、DirectX。其中学习MFC(微软基础类库)、QT需要掌握C++才可以。所以建议学习一下C++然后深入学习一个库。
编辑本段实例
功能:由键盘输入多边形的边数,求其内角和。
程序如下:
#include
int main()
{
/*辨别多边形是否成立,不成立重新执行do-while语句间的命令*/
do
{
int x;
printf("n=");
scanf("%d",&x); /*由键盘输入x的值*/
printf("%d\n",(x-2)*180); /*显示内角和,公式为(x-2)*180*/
/*辨别多边形是否成立,不成立显示“Error”,成立显示“Right”*/
if (x<=2)
printf("Error\n");
else
printf("Right\n");
}
while (x<=2); /*do-while语句*/
getchar();
return 0;
}
功能:由键盘输入两个数,显示器上显示较大数
#include
int big(int,int); /*创建整型变量函数big*/
int main()
{
int x,y;
scanf("%d,%d",&x,&y);
printf("big is %d\n",big(x,y));
/*输出big函数的值,因为main函数与用户自定义函数big无关系,所以printf后的输出项表是big(x,y),而不是big(n1,n2)*/
getchar();
return 0;
}
int big(int n1,int n2) /*用户自定义函数big*/
{
if (n1>n2)
return n1; /*返回n1值*/
else
return n2; /*返回n2值*/
}
功能:由键盘输入一个等腰三角形的层数,画一个这样的三角形
#include
int main()
{
int i,j,n;
printf("n:");
scanf("%d",&n);
for (i=1;i<=n;i++) /*循环n次,每次输出一行*/
{
for (j=1;j<=n-i;j++) /*输出该行前面的空格*/
printf(" ");
for (j=1;j<=2*i-1;j++) /*输出该行中的星号*/
printf("*");
printf("\n");
}
getchar();
return 0;
}
功能:由键盘输入一个最大值,求2到这个最大值中的所有质数(素数) 程序如下:
#include
#include
void main()
{
int n,m,flag,i,j,num=1;
printf("n:");
scanf("%d",&n);
printf("2~%d:\n",n);
for (i=2;i<=n;i++) /*循环查找质数*/
{
flag=1;
m=(int)sqrt(i);
for (j=2;j<=m;j++)
if (i%j==0) /*条件为真时表示不是质数,退出for循环*/
{
flag=0;
break;
}
if (flag==1) /*条件为真时表示i是质数*/
{
printf("M",i);
if (num++==10) /*每行最多输出10个数*/
{
printf("\n");
num=1;
}
}
}
printf("\n");
getchar();
return 0;
}
功能:显示保护屏幕 (此程序只能在TC下编译,在其他编译器编译会报错)
#include
#include
void main()
{
int gdriver=DETECT; /*定义图象驱动器为DETECT*/
int gmode=DETECT; /*定义图象模式为DETECT*/
long n; /*定义长型变量n*/
initgraph(&gdriver,&gmode,"E:\TC\bgi");
/*进入图象状态(警告:""之间的是图象驱动器的路径,建议网友们设置为空,即只有"",或设为编程系统的路径,例路径是C:\TC,那么就是输入C:\TC\bgi)*/
sleep(1); /*暂停一秒,以保证无误差进入图象状态*/
for (n=1;n<=40000000;n++) /*画40000000个圆*/
{
setcolor(rand()); /*作图颜色随机*/
circle(random(639),random(639),25); /*画圆,位置随机,半径为25*/
}
getchar();
return 0;
}
功能:读取一个文件,并以16进制显示 以下为程序源代码:
/* Program 12.6 Viewing the contents of a file */
#include
#include
#include
#define DISPLAY 80
#define PAGE_LENGTH 20
int main(int argc, char *argv[])
{
char filename[80];
FILE *pfile;
unsigned char buffer[DISPLAY - 1];
int count = 0,
lines = 0,
i = 0;
if(argc == 1)
{
printf("Please enter a filename: ");
gets(filename);
}
else
strcpy(filename, argv[1]);
if((pfile = fopen(filename,"rb")) == NULL)
{
printf("Sorry, can't open %s", filename);
return -1;
}
while(!feof(pfile))
{
if(count < sizeof buffer)
buffer[count++] = (unsigned char)fgetc(pfile);
else
{
for(count = 0;count < sizeof buffer;count++)
printf("%02X ", buffer[count]);
printf("| ");
for(count = 0;count < sizeof buffer;count++)
printf("%c", isprint(buffer[count]) ? buffer[count]:'.');
printf("\n");
count = 0;
if(!(++lines%PAGE_LENGTH))
if(getchar() == 'E')
return 0;
}
}
for(i = 0;i < sizeof buffer;i++)
if(i < count)
printf("02X ", buffer[i]);
else
printf("");
printf("| ");
for(i = 0;i < count;i++)
printf("%c", isprint(buffer[i]) ? buffer[i]:'.');
printf("\n");
fclose(pfile);
pause();
return 0;
}
编辑本段经典教材
《The C Programming Language》 《C程序设计语言》本书原著为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的一本介绍C语言的权威经典著作。人们熟知的“hello,World”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。原著第2版根据1987年制定的ANSIC标准做了适当的修订,引入了最新的语言形式,并增加了新的示例,通过简洁的描述、典型的示例,作者全面、系统、准确地讲述了C语言的各个特性以及程序设计的基本方法。对于计算机从业人员来说,本书是一本必读的程序设计语言方面的参考书。
《Expert C Programming》 《C专家编程》展示了最优秀的C程序员所使用的编码技巧,并专门开辟了一章对C++的基础知识进行了介绍。
书中C的历史、语言特性、声明、数组、指针、链接、运行时、内存以及如何进一步学习C++等问题进行了细致的讲解和深入的分析。全书撷取几十几个实例进行讲解,对C程序员具有非常高的实用价值。
《C Traps and Pitfalls》 《C陷阱与缺陷》作者以自己1985年在贝尔实验室时发表的一篇论文为基础,结合自己的工作经验扩展成为这本对C程序员具有珍贵价值的经典著作。写作本书的出发点不是要批判C语言,而是要帮助C程序员绕过编程过程中的陷阱和障碍。
全书分为8章,分别从词法分析、语法语义、连接、库函数、预处理器、可移植性缺陷等几个方面分析了C编程中可能遇到的问题。最后,作者用一章的篇幅给出了若干具有实用价值的建议。
《Pointers on C》 《C和指针》本书提供与C语言编程相关的全面资源和深入讨论。本书通过对指针的基础知识和高级特性的探讨,帮助程序员把指针的强大功能融入到自己的程序中去。 全书共18章,覆盖了数据、语句、操作符和表达式、指针、函数、数组、字符串、结构和联合等几乎所有重要的C编程话题。书中给出了很多编程技巧和提示,每章后面有针对性很强的练习,附录部分则给出了部分练习的解答。
《C: A Reference Manual》 《C参考手册》全书分为两大部分,共24章。第一部分讨论了C语言的所有语言特征,包括词法、预处理机制、声明、类型、表达式、语句以及函数等基本语言特性。第二部分讨论了C语言的标准库,根据它们不同的功能分别详细介绍。为帮助读者理解相关概念,本书在讨论C语言及其标准库的各方面问题时,提供了许多实例和解释。在第一部分的各章中还提供了练习题,书后则给出了主要练习的解答。这些练习的主要目的是帮助读者理解C语言的基本机制及其重要细节,其中并不涉及复杂的程序设计技术与问题。
《C Primer Plus》 本书全面讲述了C语言编程的相关概念和知识。 全书共17章。第1.2章学习C语言编程所需的预备知识。第3到15章介绍了C语言的相关知识,包括数据类型、格式化输入输出、运算符、表达式、流程控制语句、函数、数组和指针、字符串操作、内存管理、位操作等等,知识内容都针对C99标准;另外,第10章强化了对指针的讨论,第12章引入了动态内存分配的概念,这些内容更加适合读者的需求。第16章和第17章讨论了C预处理器和C库函数、高级数据表示(数据结构)方面的内容。附录给出了各章后面复习题、编程练习的答案和丰富的C编程参考资料。
编辑本段类C的中文编程语言
目前已经推出了面向中国人的中文C语言,也就是c语言和O中间语言。
习语言是纯中文C语言,是全仿Turbo C 2.0的,据说支持所有TC2函数(未知实否)。
O中间语言是做到和C语言类似,但是不全兼容,实际上它只是对接下来的O语言开发做铺垫。