编程语言

img dbigbear

C语言小结

发表于2004/10/31 0:48:00  1924人阅读

简介
Johnny.Deng

1. C语言是中级语言:

C语言通常称为中级计算机语言。中级语言并没有贬义,不意味着它功能差、难以使用、

或者比B A S I CP a s c a l那样的高级语言原始,也不意味着它与汇编语言相似,会给使用者带来类似的麻烦。C语言之所以被称为中级语言,是因为它把高级语言的成分同汇编语言的功能结合起来了。

2.   基本组成部分紧凑简洁:只有32个标准的关键字,45个标准的运算符以及9个控制语句;

3.           数据结构丰富移植性好:提供编写结构化程序所需要的各种数据结构和控制结构,与硬件操作有关的数据可通过调用系统提供的库函数实现,方便程序的移植.

4.语言是结构化语言:虽然从严格的学术观点上看, C语言是块结构(block-structured)语言,但是它还是常被称为结构化语言。这是因为它在结构上类似于ALGOL、PASCAL和Modula-2(从技术上讲,块结构语言允许在过程和函数中定义过程或函数。用这种方法,全局和局部的概念可以通过“作用域”规则加以扩展,“作用域”管理变量和过程的“可见性”。因为C语言不允许在函数中定义函数,所以不能称之为通常意义上的块结构语言)。

 

基本知识

 一. 数据类型和算术表达式

  1.C语言有五种基本数据类型:字符、整型、单精度实型、双精度实型和空类型。尽管这几

种类型数据的长度和范围随处理器的类型和C语言编译程序的实现而异,但以bit为例,整数

CPU字长相等,一个字符通常为一个字节,浮点值的确切格式则根据实现而定。

2. C语言的内部运算符很丰富,运算符是告诉编译程序执行特定算术或逻辑操作的符号。C语言有三大运算符:算术、关系与逻辑、位操作。另外, C还有一些特殊的运算符,用于完成一些特殊的任务。

3. 表达式由运算符、常量及变量构成:C语言的表达式基本遵循一般代数规则。

二.程序控制语句

1. 数据的输入与输出

在程序的运行过程中,往往需要由用户输入一些数据,而程序运算所得到的计算结果等又需要输出给用户,由此实现人与计算机之间的交互,所以在程序设计中,输入输出语句是一类必不可少的重要语句,在C语言中,没有专门的输入输出语句,所有的输入输出操作都是通过对标准I/O库函数的调用实现。最常用的输入输出函数有scanf( )printf ( )getechar ( )putchar ( )

2.条件控制语句

在程序的三种基本结构中,第二种即为选择结构,其基本特点是:程序的流程由多路分支组成,在程序的一次执行过程中,根据不同的情况,只有一条支路被选中执行,而其他分支上的语句被直接跳过。C语言中,提供if语句和switch语句选择结构, if语句用于两者选一的情况,而switch用于多分支选一的情形。

3.循环控制语句

循环控制结构(又称重复结构)是程序中的另一个基本结构。在实际问题中,常常需要进行大量的重复处理,循环结构可以使我们只写很少的语句,而让计算机反复执行,从而完成大量类同的计算。C语言提供了while语句、do...while语句和for语句实现循环结构。

三. 函数

人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法,也就是把一个

大问题分解成若干个比较容易求解的小问题,然后分别求解。程序员在设计一个复杂的应用

程序时,往往也是把整个程序划分为若干功能较为单一的程序模块,然后分别予以实现,最

后再把所有的程序模块像搭积木一样装配起来,这种在程序设计中分而治之的策略,被称为

模块化程序设计方法。

C语言中,函数是程序的基本组成单位,因此可以很方便地用函数作为程序模块来实现

C语言程序。利用函数,不仅可以实现程序的模块化,程序设计得简单和直观,提高了程序的易读性和可维护性,而且还可以把程序中普通用到的一些计算或操作编成通用的函数,以供随时调用,这样可以大大地减轻程序员的代码工作量。

1.数说明与返回值

当一个函数没有明确说明类型时, C语言的编译程序自动将整型( i n t)作为这个函数的缺省类型,缺省类型适用于很大一部分函数。当有必要返回其它类型数据时,需要分两步处理:首先,必须给函数以明确的类型说明符;其次,函数类型的说明必须处于对它的首次调用之

前。只有这样,C编译程序才能为返回非整型的值的函数生成正确代码

2.数的作用域规则

“语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据

的规则。C语言中的每一个函数都是一个独立的代码块。一个函数的代码块是隐藏于函数内部的,

不能被任何其它函数中的任何语句(除调用它的语句之外)所访问(例如,用g o t o语句跳转

到另一个函数内部是不可能的)。构成一个函数体的代码对程序的其它部分来说是隐蔽的,它

既不能影响程序其它部分,也不受其它部分的影响。换言之,由于两个函数有不同的作用域,

定义在一个函数内部的代码数据无法与定义在另一个函数内部的代码和数据相互作用。

C语言中所有的函数都处于同一作用域级别上。这就是说,把一个函数定义于另一个函数

内部是不可能的。

3.函数的调用与参数

如果一个函数要使用参数,它就必须定义接受参数值的变量。一般说来,有两种方法可以把参数传递给函数。第一种叫做“赋值调用”(call by value),这种方法是把参数的值复制到函数的形式参数中。这样,函数中的形式参数的任何变化不会影响到调用时所使用的变量。

把参数传递给函数的第二种方法是“引用调用”(call by reference)。这种方法是把参数

的地址复制给形式参数,在函数中,这个地址用来访问调用中所使用的实际参数。这意味着,

形式参数的变化会影响调用时所使用的那个变量。除少数情况外,C语言使用赋值调用来传递参数。这意味着,一般不能改变调用时所用变量的值。

切记,传给函数的只是参数值的复制品。所有发生在函数内部的变化均无法影响调用时使用的变量。

[例]

main ( )

{

int t =10;

printf("%d %d ",s q r ( t ) ,t ); /* sqr(t)是函数调用,t是实参* /

}

int sqr(x) /* 函数定义,x是形式参数* /

int x;

{

x = x * x ;

return (x);

}

在这个例子里,传递给函数sqr( )的参数值是复制给形式参数x的,当赋值语句x = x * x执行

时,仅修改局部变量x。用于调用s q r ( )的变量t,仍然保持着值1 0。

执行程序:

R U N 

100 10

四.数组

数组是一个由若干同类型变量组成的集合,引用这些变量时可用同一名字。数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素,数组可以是一维的,也可以是多维的。一维数组的一般说明形式如下:type-specifier var_name [size];

C语言中,数组必须显示地说明,以便编译程序为它们分配内存空间。在上式中,类型说明符指明数组的类型,也就是数组中每一个元素个数,一维数组的总字节数可按下式计:sizeof( 类型) *数组长度= 总字节数。

显然,一维数组的最普通的用法是作为字符串。在C语言中,字符串被定义为一个以空字

符终结的字符数组。空字符以‘ / 0’来标识,它通常是不显示的。因此,在说明字符数组时,

必须比它要存放的最长字符串多一个字符。例如,假如要定义一个存放长度为1 0的字符串的

数组s,可以写成:char s[11];

这样就给字符串末尾的空字符保留了空间。尽管C语言并不把字符串定义为一种数据类型,但却允许使用字符串常量。字符串常量是由双引号括起来的字符表。不必向字符串的末尾加空字符, C编译程序会自动完成这一工作。

C语言支持多串操作函数,最常用的有:

名字功能

strcpy(s1 s2) 将s 2拷贝到s 1

strcat(s1 s2) 将s 2连接到s 1的末尾

strlen ( s1 ) 返回s 1的长度

strcmp ( s1,s2 ) 若s 1与s 2相等,返回值为0

s1 < s2,返回值小于0

s1 > s2,返回值大于0

[例]

# include <stdio.h>

main ( )

{

char s1[80],s2[80]; /*定义字符数组* /

gets (s1); /*输入字符串* /

gets (s2);

printf ("lengthsf: %d %d /n" ,s t r l e n ( s 1 ) ,s t r l e n ( s 2 ) ) ;

if (!strcmp(s1,s2))

printf ("the strings are equal /n");

s t r c a t ( s 1 ,s 2 ) ;

printf ("%s/n",s 1 ) ;

}

我认为,当两个串相等时,函数strcmp( )将返回False,因而当测试串的等价性时,要像前

例中的那样,必须用逻辑运算符!将测试条件取反。

当程序运行并以“hello”和“hello”这两个串作为输入时,其输出为:

RUN 

hello 

hello 

lengths:5 5

The strings are equal

h e l l o h e l l o

五.指针

指针是C语言的精华部分,通过利用指针,我们能很好地利用内存资源,使其发挥最大的

效率。有了指针技术,我们可以描述复杂的数据结构,对字符串的处理可以更灵活,对数组

的处理更方便,使程序的书写简洁,高效,清爽。但由于指针对初学者来说,难于理解和掌

握,需要一定的计算机硬件的知识做基础,这就需要多做多练,多上机动手,才能在实践中

尽快掌握,成为C的高手。

如果将变量的地址保存在内存的特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针对所指向变量的访问,也就是一种对变量的“间接访问”。

1.指针与数组

变量在内存存放是有地址的,数组在内存存放也同样具有地址。对数组来说,数组名就是数组在内存安放的首地址。指针变量是用于存放变量的地址,可以指向变量,当然也可存放数组的首址或数组元素的地址。

2.指针数组

这类数组存放的全部是指针,分别用于指向某类的变量,以替代这些变量在程序中的使用,增加灵活性。指针数组定义形式:

类型标识*数组名[数组长度]

如: char *str[4];

3.指向指针的指针

一个指针变量可以指向整型变量、实型变量、字符类型变量,当然也可以指向指针类型变量。当这种指针变量用于指向指针类型变量时,我们称之为指向指针的指针变量,这话可能会感到有些绕口,但你想到一个指针变量的地址就是指向该变量的指针时;这种双重指针的含义就容易理解了。

4.Main函数的参数

从函数参数的形式上看,包含一个整型和一个指针数组。数组的各指针分别指向一个字符串。是接收到的指针数组的各指针是从命令行的开始接收的,首先接收到的是命令,其后才是参数。

5.跟指针有关的数据结构另有诸如函数指针、数组指针等等。

六.位操作

1.特色

与其它语言不同,C语言支持全部的位操作符( Bitwise Operators)。因为C语言的设计目的是取代汇编语言,所以它必须支持汇编语言所具有的运算能力。位操作是对字节或字中的

位(bit)进行测试、置位或移位处理,这里字节或字是针对C标准中的char和int数据类型而言

的。位操作不能用于float、double、long double、void或其它复杂类型。下表给出了位操作

的操作符。位操作中的AND、OR和NOT(1的补码)的真值表与逻辑运算等价,唯一不同的

是位操作是逐位进行运算的。

2.  操作符

3.  应用

位操作通常用于设备驱动程序,例如调制解调器程序、磁盘文件管理程序和打印机驱动程序。这是因为位操作可屏蔽掉某些位,如奇偶校验位(奇偶校验位用于确保字节中的其它位不会发生错误通常奇偶校验位是字节的最高位)。通常我们可把位操作A N D作为关闭位的手段,这就是说两个操作数中任一为0的位,其结果中对应位置为0。例如,下面的函数通过调用函数read_modem( ),从调制解调器端口读入一个字符,并将奇偶校验位置成0。

七.另外

C的内容要点还包括结构体与共用体以及输入、输出和文件系统等内容,由于篇幅所限,就不总结了。

学习体会及心得

一、编程语言的学习重在实践,多动手多动脑。

二、C和C++相互参照,比较学习,将更利于对编程的理解。

三、寻找解决问题的方法:1.求助于书 2.求助于帮助系统 3.求助于身边高手 4.求助于网上资料 5.运用自己的知识体系和思维能力去创新。

四、在开始学习时先提出一个很有意思的题目,比如做出在一个立方体内有一万个小球在自由运动、碰撞,(然后还可以在缀上“粘性”)的东东。然后如何去做呢,就从大体的讲起,然后一个个渐渐具体明白。当然问题必须是有阶梯性的。这种方法我最喜欢了。

 

 

 

 

 

 

 

 

 

 

 

阅读全文
0 0

相关文章推荐

img
取 消
img