? 第一章 C语言概述
? 第二章 数据类型、运算符与表达式
? 第三章 最简单的 C程序设计
? 第四章 逻辑运算和判断选取控制
? 第五章 循环控制
? 第六章 数组
? 第八章 编译预处理
? 第九章 指针
? 第十章 结构体与共用体
? 第十二章 文件的基本操作
? 第十三章 位运算
第一代, 机器语言 ==〉 是一种 CPU机器语言。由数
字 0,1组合而成。
优点,机器可直接执行,速度快。
缺点,程序长,难记,难理解,不易查错。
第二代,汇编语言 ==〉 用助记符描述的指令系统。
如,Mov Ax,[bp+4]
push d1,
优点,比机器语言较易理解,执行速度快。
缺点,难度大,非专业人士难以掌握。
一、程序设计语言的发展
§ 1.1 C语言简介
第三代,面向过程的高级语言 ==〉 或称算法语言。如,
Fortran,Basic,Pascal,C 等等。
优点,灵活,易于理解,容易查错。
缺点,对大型程序而言维护性较差,对“拟定”好
的
程序难以扩充,修改(所谓牵一而动百)。
第四代, 非过程化的高级语言 ==〉 是一种面向对象的设计
语言,如,C++,Java 等等。
优点,灵活、易于理解、维护、修改、扩充。
缺点,掌握难度较大。
第五代,可视化多媒体程序设计工具。具有面向对象的思
想,如,Visual C++,Visual Basic,Delphe等等。
二, C语言发展过程
?1,1960年出现了 Algol60语言, 但该语言主
要面向问题, 与硬件较远, 故英国剑桥大
学推出了 CPL(Combined Programming
Language)
? 2,1967年, Matin Richards对 CPL进行改进,
简化, 推出了 BCPL (Basic Combined
Programming Language)
? 3,1970年, 美国贝尔实验室 Ken Thomson
以 BCPL为基础, 再次简化 推出了 B语言,
并写了第一个 UNIX系统 。
? 4,1972年美国贝尔实验室 D.M,Ritchie 在 B
语言基础上设计出了 C语言, 并用其将
UNIX系统全部改写并实现 。
? 5,经进一步改进, 至 1977年出现了与具体
机器无关的 C编译文本, 从而使 C语言广
泛应用, 各种机器皆可使用 。
? 6,1978 年, 美国 Brain W.Kernighan 与
Dennis,M,Ritchie 联合出版一书, The C
Programming Language,成为 ANSI C
之基础 。
7,1983年,美国标准化协会 (ANSI) 制定了 ANSI C。
注,以 ANSI C 为基础,
不同机器有不同版本,尤其是函数均应参考
相应的机器。
特别说明,
C语言的编译环境有多种
如,Turbo C,Borland C,Microsoft C 等
§ 1.2 C语言的特点
2 简洁、紧凑、方便,表达能力强
32个关键字,9种控制语句,主要用小写字母。
1,应用面广
C语言是一种过程化的语言。
既可编写系统软件 (如,DOS,UNIX);
又可编写应用软件。
3.运算符丰富 (共有 34种运算符。 )
除了最基本的+、-,×, ÷, %等运算外,
还将括号、赋值、类型强制转换等均作为运算符。
4.数据类型丰富,结构化程度高
除基本类型外,有指针,结构体、共同体等类型。
5.语法严格,灵活
如:数据类型可相互通用:整型、字符型通用。
6,可与机器硬件打交道
直接访问内存地址,具有, 高,,, 低,
级语言的功能。
7,生成目标代码质量高,执行效率高。
8.语言简洁,可移植性好
可移植性优于汇编语言。
§ 1.3 简单的 C程序介绍
为了更好、更快地掌握 C程序,我们先看几个 C
语言程序,
例 1,#include <stdio.h>
main( )
{
printf ("Hello!\nThis is a C program\n");
}
运行结果,
Hello!
This is a C program,
例 2,/* Example for add program */
#include <stdio.h>
main ( )
{int a,b,sum; /*这是定义变量 */
a=123; b=456; /*给变量赋值 */
sum=a+b; /*求两个数之和 */
printf("a+b= %d\n",sum);
}
运行结果,
a+b=579
例 3,/* Example for Function program */
#include <stdio.h>
main( ) /* 主函数 */
{ int a,b,c; /*定义变量 */
scanf(― %d,%d‖,&a,&b); /*输入变量 a和 b的值 */
c=max(a,b); /*调用 max函数,将得到的值赋给 c*/
printf(― max=%d‖,c;) /*输出 c的值 */
}
int max (x,y)
{ int x,y; /*对形参 x,y作类型定义 */
int z; /*max函用到的变量 z,也要加以定义 */
z=y;
if (x>y) z=x;
return (z); /*将 z的值返回,通过 max带回调用处 */
}
通过实例,初步看到 C的程序结构,
?1,预处理部分,#include <stdio.h>
? 2,C程序全部由一个一个的函数构成。至少有
且仅有一个主函数 main ( )也称为主程序,其
内容在其后的一对花括号 {}内,其它函数可
被主函数调用或相互调用。 其它函数可为 C
函数库中函数,也可为用户定义的函数。
? 3,/*…………….*/ 为注释部分。
? 5,{}是程序段的括号
? 4,; 是语句的结束符
? 6,函数的执行一定从 main ( )开始。
建议,为便于阅读,养成良好的程序书写风格。
?1、每一对 { }上下对齐;
? 2、每一对 { }都对应于段首和段尾;
? 3、每一行只写一条语句;
? 4、每一对 {}内的语句左对齐;
? 5、不同的语句段采用缩进格式以示区别;
? 6、关健语句要有注释。
几种供参考的书写风格,
§ 2.1,数据类型
著名计算机科学家 沃思 提出,
程序=数据结构+算法
例如, 学生各科成绩及总分排队问题。
?成绩的存放 ––– 以数组形式
? 排队方法 –––– 算法
在此,存放数据的方式直接反映了一种程序
语言的数据表达能力 。
数据的存储方式又称之为,数据类型 。
? C语言对程序中要用到的每一个变量
都要事先指定它的数据类型!
为什么要指定数据类型?
1.不同类型的数据在内存中占据不同
长度的存储区。
2.不同类型的数据取值范围不同。
3.不同类型的数据有不同的操作。
C语言的 数据类型丰富,有,
1.基本类型
2.构造类型
3.指针类型
4.空类型
整型
字符型
浮点型 单精度 双精度
数组
结构体
共用体
枚举
短整型
长整型
§ 2.2 常量与变量
2.2.1 常量和符号常量
常量 ?? 程序运行过程中不能被改变的量。
一般的数据显式写法均表示常量。
如程序中,
20 ? 整型常量
15.8 ? 浮点型常量
'a' ? 字符常量
例, #define PRICE 30
main ( )
{
int num,total;
num=10;
total=num*PRICE;
printf("total=%d",total);
}
符号常量 ? 用一个符号表示一个常量
符号常量 (一般用大写,以区分变量 )
此程序中 PRICE 为常量符号,它的值为 30
2.2.2 变量
变量 ? 程序执行过程中可以改变它的值。变
量包括 变量名 和 变量值 。
变量名 ? 用标识符命名,对应一定数量的内存存贮
单元,其单元数视变量类型而定。
标识符的作用 ? 可用来作为变量名、常量名、
函数名、类型名、文件名等。
标识符 ? 由字母、数字、下划线组成且由字母
或下划线开头的字符串。
2.2.3 标识符
如, _sum,sum,stu_name,price等为合法的标识符。
建议,采用具有一定意义的英文单词、缩写作
为标识符
注意,1,C语言区分大小写
2.标识符的长度一般不超过 8个字符
如,Price 和 price,系统会认为是两个
不同的标识符。
具体情况视不同系统而定。
在 C语言中,变量须先定义,后使用
变量一旦被定义,其类型便确定 即可在编译时为
其分配相应数量的单元。
若没有定义变量直接写成,
student=_num30; 则编译时会指出未定义错误。
如, int student_num /*变量定义 */
student_num=30;
是合法的。
§ 2.3整型数据
2.3.1 整型常量
整型常量 (或称 整型常数 )
C语言提供了三种形式的 整型常量,
? 十进制
如, 256,308,- 120等
以数字 0开头表示的整数
例, 0235,0146,- 012等,
0235=2× 82+ 3× 8+ 5= 15710
0146= 1× 82+ 4× 8+ 6= 10210
- 012=- (1× 8+ 2)=- 1010
?十六进制
以 "0x"开头的整型数
如, 0x16,0x28
? 八进制
2.3.2 整型变量
一、分类,
分为四种,基本型, 短整型, 长整型, 无符号型
1.基本型,
用,int‖定义,占 2个字节 (16位 )。
2.短整型,
用,short int‖或, short‖定义,占 2个字
节 (16位 )。
注意, int 与 short int 是等价的。
3.长整型,
用,long ‖或, long int ‖定义,占 4个字
节 (32位 )。
4.无符号型,
用,unsigned‖定义
不存放符号,数据不带符号数。
无符号整型:,unsigned int‖
无符号短整型:,unsigned short int‖
无符号长整型:,unsigned long int‖
注意:如无指定,则为有符号数。
提醒,
各数据的取值范围,
int,short int,—— ?32768(或 ?32767) ~ +32767
long int,—— ?2147483648 ~ +2147483647
unsigned int,unsigned short int,—— 0 ~ 65535
unsigned long int,—— 0 ~ 4294967295
上述各种类型的取值范围有所不同,与机器和编译
环境有关。
二、定义方法
整型变量分别以下列方式定义
1,基本整型,
int a,b,c;
或,int a;
int b,c;
2,短整型
short int a,b,c;
或,short a,b,c;
3,长整型
long int 或 long a,b,c;
4,无符号型
unsigned a,b,c;
unsigned short a,b,c;
unsigned long a,b,c;
例 1:#include <stdio.h>
main ( )
{int a,b,c,d; /*指定 a,b,c,d为整型变量 */
unsignd u; /*指定 u为无符号整型变量 */
a=12; b= –24; u=10;
c=a+u; d=b+u;
printf("a+u=%d,b+u=%d\n",c,d);
}
运行结果为,
a+u=22,b+u= –14
思考,
若有语句,u=a+b;
情况会怎样?
涉及到的问题:数据类型转换。
提示,
例 2,#include <stdio.h>
main ( )
{int a,b; /*指定 a,b为整型变量 */
unsignd u; /*指定 u为无符号整型变量 */
a=65536; /*超出 a的充许范围 */
b= ?32;
u=a+b;
printf("a=%d,u=%d\n",a,u);
}
运行结果为,
a=0,u= –32
例 3,#include <stdio.h>
main ( )
{int a,b; /*指定 a,b为整型变量 */
unsignd c; /*指定 u为无符号整型变量 */
a=32768; /*超出 a的范围 */
b=?32;
c=a+b;
printf("a=%d,c=%a\n",a,c);
}
运行结果为,
a=?32768,a+b= 32736
三、关于整型常量
程序中出现的整型常数,系统按以下规则分配
变量 (内存单元 )或赋值给相应变量
1,当常数 (量 )在 – 32768~32767之间,则可赋给 int,
short int 变量。
2,若超越,而在 –2147483648~2147483647之间,则
可赋给 long int 变量。
3,若 int,short int 长度相同,则二者皆可赋值。
4,一个非负整数 <65535 则可赋给 unsigned int。
5,一个常数后加 ' l',或 'L',表示长整数, 如 123l,主
要用于函数调用时形、实参数传递。
§ 2.4 实型数据
2.4.1 实型常量
有二种表示形式
1,十进制形式
如, 0.126,523.64 等
2,指数形式
对于较大或较小的数,可用指数形式
0.0000126 1.26E –5
1260000 1.26E+6 或 1.26e+6
分为单精度型 (float)与双精度型 (double)。
如, float x,y,z; (单精度 )
double a,b,c; (双精度 )
一般地, 单精度占 4字节内存单元 ;
双精度占 8字节内存单元,
2.4.2 实型变量
注意, 不同机器对实型变量的有效数字长度的限制
如, pc机,单精度一般为 7位,双精度 15位
单精度数值,± 3.4× (10–38~1038)
双精度数值,± 1.7× ( 10–308~10308)
例 1,/*exp6.c*/
#include<conio.h>
main()
{ float a,b,c,d;
a=123456.666;
b=1234567.777;
c=12345678.888;
d=123456789.999;
printf("a=%f\nb=%f\nc=%f\nd=%f\n",a,b,c,d);
}
运行结果,
a=123456.664062
b=1234567.750000
c=12345679.000000
d=123456792.000000
例 2,/*exp4.c*/
#include<stdio.h>
#include<conio.h>
main()
{ float a,b,c;
clrscr();
a=3.4*10e1;
b=3.4*10e37;
c=3.4*10e38;
printf("a=%f\nb=%f\nc=%f\n",a,b,c);
getch();
}
运行结果,
a=340.000000
b=339999995214436425000000000000000000000.0 (整数位为 39位)
c=+INF
例 3,/*exp5.c*/
#include<stdio.h>
#include<conio.h>
main()
{ float a,b,c;
clrscr();
a=3.4e1;
b=3.4e37;
c=3.4e38;
printf("a=%f\nb=%f\nc=%f\n",a,b,c);
getch();
}
运行结果,
a=34.000000
b=33999999014383402400000000000000000000.00
c=339999995214436425000000000000000000000.0 (整数位为 39位)
§ 2.5 字符型数据
用一对单引号括起来的单个字符。
如, ' a ',' A ',二者不一样,
2.5.1 字符常量
注意,下面两种字符不能作为单引号中间的字符。
1、单引号本身, ‘
2、反斜杠, \
以 " \"开头后接一个字符或 n 个字符代表了一
种特殊字符常量。 –––转义字符 。
如, \ n ––换行,\ r –– 回车
其它如下表,
字符形式
\n
\t
\v
\b
\r
\f
\\
\'
\ddd
\xhh
功能
换行
横向跳格 (即跳到下一个输出区 )
竖向跳格
退格
回车
走纸换页
反斜杠字符,\”
单引号 (撇号 )字符
1到 3位 8进制数所代表的字符
1到 2位 16进制数所代表的字符
注意, \ 表示 ASCII码字符
三位八进制
如, \ 101 –– 表示字母 A
又, \ x 十六进制 ASCII 字符
\ x 41–– 表示字母 A
定义方式为,
char c1,c2;
c1= ' A '; /*给变量赋值 */
c2= ' B ';
2.5.2 字符变量
用来存放 一个字符 的变量占一个字节,
一个字符存入一个字符变量。其对应单元存
放的是其 ASCII码,即 ASCII码的二进制形式。
由此, 字符变量中的数据是一整型数据。输出
时既可输出字符,亦可输出整数,且字符变量可作整
数运算。
2.5.3 字符数据的实际存放形式
例 1,#include <stdio.h>
main ( )
{ char c1,c2;
c1=97;
c2=98;
printf (‖c1=%c,c2= %c",c1,c2);
}
运行结果, c1=a,c2= b
问题, 若 c1,c2的取值范围超出了 ASCII码表的值,
会产生什么后果?
例 2,# incdude<stdio.h>
main ( )
{ char c1,c2,c3,c4;
c1=256; c2=257; c3=?1; c4= ?2;
Printf("c1=%c,c2=%c,c3=%c,c1,c2,c3,c4);
}
运行结果,c1=,c2=,c3=,c4=,
结论, ? 从 256开始,依次得新取 ASCII码的值。
? ?1~?256相当于 ASCII码的 255~0值。
? 取值分段
ASCII码 ASCII码 ASCII码
?256 ?1 0 255 256 511
例 3,#include <stdio.h>
main ( )
{ char c1,c2;
c1= ' a ';
c2=' b ';
c1=c1– 32; c2=c2– 32;
printf (‖c1=%c,c2=%c",c1,c2);
}
运行结果 c1=A,c2= B
思考,若有 c1=c1?256; c2=c2?256;
则结果怎样?
例 4,/*---exp3.c---*/
#include <stdio.h>
main ( )
{ int i;
char c;
i= 32769;
c='a';
printf ("c=%c,c=%d \n",c,c);
printf ("i=%c,i=%d \n",i,i);
}
运行结果, c=a,c=97
i=,i= ?32769
? 系统将 int型的整型变量的最高位,作为符号 。
这时对 0~255之间的字符可输出对应的 ASCII
码字符 。 但对不在 0~255之间的整数, ASCII
字符按上面的规律与整数对应, 但整数的取
值不应超过范围, 否则会有错误 。 字符最高
位为 1,则作为负数输出 。
? 由此最好用 unsigned int 存放字符整数 (ASCII)。
注,
仍然要注意变量的取值范围,
0~65535
用双引号括起来的字符串。
例, "Good Morning! "
注意 'A' 与 "A"是不同
字符串存放时,在最后加上 "\0" –– 空字符。
于是,
Good Morning ! \0
2.5.4 字符串常量
― A ‖存储方式为 A \0 但 ‘ A’存储方式为, A
注意, 1,字符串长度 =实际字符个数 +1,但最
后 \0不输出,
printf (" Good Morning! ")
此处不需写 \0。
2,单个字符的字符串不能赋给字符变量。
例, char c;
c= " a "; 是错误的。