1、程序设计基础,第一章 数据类型与表达式,1.1 C程序简介,1.1 C程序简介,1.1.1 C语言发展历史,产生背景 产生过程 时间:19721973 地点:美国贝尔实验室 目的:UNIX操作系统 设计人: Ken.Thompson和Dennis.M.Ritchie C标准 标准C: K&R合著The C Programming Language ANSI C: 1983年 87 ANSI C: 1987年 1990年国际标准的ANSI C,1.1 C程序简介,CPU指令系统,由0、1序列构成的指令码组成 如:10000000 加10010000 减,用助记符号描述的指令系统 如 ADD A,
2、 B,面向机器的语言,程序设计是数据被加工的过程,客观世界可以分类,对象是类的实例 对象是数据和方法的封装 对象间通过发送和接受消息发生联系,程序设计关键是定义类,并由类派生对象,1.1 C程序简介,1.1.2 C语言特点, 语言简洁、紧凑、灵活 运算符和数据类型丰富 程序设计结构化、模块化 生成目标代码质量高 可移植性好,1.1 C程序简介,32个关键字,:(由系统定义,不能重作其它定义) auto break case char const continue default do double else enum extern float for goto if int long regi
3、ster return short signed sizeof static struct switch typedef unsigned union void volatile while,1.1 C程序简介,9种控制语句,if( )else for( ) while( ) dowhile( ) continue break switch goto return,1.1 C程序简介,34种运算符:,算术运算符:+ - * / % + - 关系运算符: = != 逻辑运算符:! & | 位运算符 : | & 赋值运算符:= 及其扩展 条件运算符:?: 逗号运算符:, 指针运算符:* & 求字节
4、数 :sizeof 强制类型转换:(类型) 分量运算符:. - 下标运算符: 其它 :( ) -,1.1 C程序简介,1.1.3 C程序格式和结构特点,例1.1 第一个程序 Hello,World!,/* example1.1 The first C Program*/ #include main() printf(“Hello,World!”); ,输出: Hello,World!,1.1 C程序简介,例1.2,/* example1.1 calculate the sum of a and b*/ #include /* This is the main program */ main()
5、 int a,b,sum;a=10;b=24;sum=add(a,b);printf(”sum= %dn“,sum); /* This function calculates the sum of x and y */ int add(int x,int y) int z;z=x+y; return(z); ,运行结果: sum=34,1.1 C程序简介,格式特点,习惯用小写字母,大小写敏感 不使用行号,无程序行概念 可使用空行和空格 常用锯齿形书写格式,main( ) . ,main( ) int i , j , sum;sum=0;for(i=1; i10;i+)for(j=1;j10;j
6、+)sum+=i*j ;printf(“%dn”,sum); ,优秀程序员的素质之一: 使用TAB缩进 对齐 有足够的注释 有合适的空行,1.1 C程序简介,结构特点,函数与主函数 程序由一个或多个函数组成 必须有且只能有一个主函数main() 程序执行从main开始,在main中结束,其它函数通过嵌套调用得以执行。 程序语句 C程序由语句组成 用“;”作为语句终止符 注释 /* */为注释,不能嵌套 不产生编译代码,例: /*This is the main /* of example1.1*/ */,编译预处理命令,1.1 C程序简介,1.1.4 C程序的上机步骤,C程序开发步骤,程序代码
7、的录入, 生成源程序*.c,语法分析查错,翻译 生成目标程序*.obj,与其它目标程序或库 链接装配,生成可执行 程序*.exe,file.exe,1.2 C语言的数据类型,数据类型是计算机程序设计中的一个非常重要的概念,数据类型规定了一个以值为其元素的数据集,即规定了该类型中数据的定义域。,1.2 C语言的数据类型,C 数据类型:,1.2.1 C语言的数据类型,1.2 C语言的数据类型,1.2.2 基本数据类型,整型,字符型,实型,有,无,说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例,1.3 常量与变量,1.3.1 标识符 定义:用来标识变量、常量、函数等的字符序列
8、 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字 长度:最长32个字符 命名原则: 见名知意 不宜混淆 如l与I, o与0,例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 lotus_1_2_3 char ab _above $123,M.D.John,3days,#33,char,$123,ab,1.3 常量与变量,1.3.2 常量,定义:程序运行时其值不能改变的量(即常数) 分类: 符号常量:用标识符代表常量 定义格式: #define 符号常量 常量,如 #de
9、fine PRICE 30,例 符号常量举例(ch2_1.c)#define PRICE 30 main() int num,total;num=10;total=num*PRICE;printf(“total=%d“,total); ,运行结果:total=300,一般用大写字母 是宏定义预处理命令,不是C语句 直接常量: 整型常量 请点击: 实型常量 请点击: 字符常量 请点击: 字符串常量 请点击:,整型常量(整常数),1.3 常量与变量,三种形式: 十进制整数:由数字09和正负号表示.如 123,-456,0 八进制整数:由数字0开头,后跟数字07表示.如0123,011 十六进制整数
10、:由0x开头,后跟09,af,AF表示. 如0x123,0Xff,各种进制之间的转换:,二进制、八进制、十六进制转换成十进制方法:按权相加,1.3 常量与变量,二进制、八进制、十六进制转换成十进制,方法:按权相加,十进制转换成二进制、八进制、十六进制,方法:连续除以基,从低到高记录余数,直至商为0,1.3 常量与变量,1.3 常量与变量,二进制与八进制之间的转换,二进制转换成八进制:从右向左,每3位一组(不足3位左补0),转换成八进制八进制转换成二进制:用3位二进制数代替每一位八进制数,例 (1101001)2=(001,101,001)2=(151)8,例 (246)8=(010,100,1
11、10)2=(10100110)2,000 0 001 1 010 2 011 3 100 4 101 5 110 6 111 7,1.3 常量与变量,二进制与十六进制之间的转换,二进制转换成十六进制:从右向左,每4位一组(不足4位左补0),转换成十六进制十六进制转换成二进制:用4位二进制数代替每一位十六进制数,0000 0 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F,例 (11010101111101)2=(0011,0101,0
12、111,1101)2=(357D)16,例 (4B9E)16=(0100,1011,1001,1110)2=(100101110011110)2,1.3 常量与变量,问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10,整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量,例 12 与 12L,例 30000 为int型65536 为long int 型,1.3 常量与变量,实型常量(实数或浮点数),表示形式: 十进制数形式:(必须有小数点) 如0.123, .123, 123.0, 0.0, 123. 指数
13、形式:(e或E之前必须有数字;指数必须为整数)如12.3e3 ,123E2, 1.23e4 , e-5 , 1.2E-3.5,实型常量的类型 默认double型 在实型常量后加字母f或F,认为它是float 型,1.3 常量与变量,字符常量,定义:用单引号括起来的单个普通字符或转义字符.,如 a A ? n 101,字符常量的值:该字符的ASCII码值,如 A65, a97,048 , n10,转义字符:反斜线后面跟一个字符或一个代码值表示,如 101 -A 012 -n376 - x61 -a60 -0 483 -(),例: A-101-x41-65,例 转义字符举例 main() prin
14、tf(“101 x42 Cn“);printf(“I say:“How are you?“n“);printf(“C Programn“);printf(“Turbo C“); ,运行结果:(屏幕显示) A B C Isay:”How are you?” C Program Turbo C,例 main() printf(“Yb=n”);,运行结果: 屏幕显示:=,1.3 常量与变量,字符串常量,定义:用双引号(“”)括起来的字符序列 存储:每个字符串尾自动加一个 0 作为字符串结束标志,字符常量与字符串常量不同,例: char ch;ch=“A”;,例: char ch;ch=A;,1.3
15、常量与变量,1.3.3 变量,概念:其值可以改变的量 变量名与变量值 变量定义的一般格式:数据类型 变量1,变量2,变量n;,决定分配字节数 和数的表示范围,合法标识符,例:int a,b,c;float data;,变量初始化:定义时赋初值,例:int a=2,b,c=4;float data=3.67;char ch=A;int x=1,y=1,z=1;int x=y=z=1;,变量的使用:先定义,后使用,例1 int student;stadent=19; /Undefined symbol stadent in function main,例2 float a,b,c;c=a%b; /
16、Illegal use of floating point in function main,变量定义位置:一般放在函数开头,1.3 常量与变量,整型变量,占字节数随机器不同而不同. shortintlong 可用sizeof(类型标识符)测量,实型变量 float:占4字节,提供7位有效数字 double:占8字节,提供1516位有效数字,例1: float a;a=111111.111; /* a=111111.1*/ 例2: double b;b=111111.111; /* b=111111.111*/,字符型变量 字符变量存放字符ASCII码 char与int数据间可进行算术运算,例
17、 a=D; /* a=68; */x=A+5; /* x=65+5; */s=!+G /* s=33+71; */,没有字符串变量,用字符数组存放,1.3.4 数据类型转换,1.3 常量与变量,当要对不同数据类型的数据进行操作时,应首先将其转换成相同的数据类型,然后进行操作。,例子,1.3 常量与变量,#define PRICE 12.5main() int num=3;float total;char ch1,ch2=D;total=num*PRICE;ch1=ch2-A+a;printf(“total=%f,ch1=%cn”,total,ch1);,运行结果: total=37.50000
18、0, ch1=d,1.3 常量与变量,所谓隐式类型转换就是在编译时由编译程序按照一定规则自动完成,而不需要人为干预。,隐式转换 什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换 运算转换规则:不同类型数据运算时先自动转换成同一类型,1.3 常量与变量,显示类型是直接将某数据强制转换成指定的数据类型。,一般形式:(类型名)(表达式)例: (int)(x+y)(int)x+y(double)(3/2)(int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例
19、main() float x;int i;x=3.6;i=(int)x;printf(“x=%f,i=%d”,x,i); 结果:x=3.600000,i=3,精度损失问题,1.4 C语言的运算符与表达式,赋值表达式:进行赋值操作,如变量的初始化,就是一个赋值过程; 算术表达式:进行一般的计算,如加、减、乘、除等; 关系表达式:进行比较判断; 逻辑表达式:进行逻辑比较判断; 条件表达式:进行条件满足与否的判断; 逗号表达式:实际上是一种复杂运算,可用包含多个算术表达式。,1.4.1 C语言运算符与表达式基础知识,1.4 C语言的运算符与表达式,学习运算符应注意,1.4 C语言的运算符与表达式,运
20、算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符优先级别 结合方向 结果的类型,1.4.2 赋值运算符和表达式,1.4 C语言的运算符与表达式,简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式)赋给一个变量,例 a=3;d=func();c=d+2;,复合赋值运算符 种类:+= -= *= /= %= = = &= = |= 含义: exp1 op= exp2 exp1 = exp1 op exp2,1.4 C语言的运算符与表达式,说明(1):,结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等
21、,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 3=x-2*y;a+b=3;,例 float f; int i;i=10; f=i; 则 f=10.0,例 int i; i=2.56; /结果i=2;,例: a=b=c=5a=(b=5)a=5+(c=6)a=(b=4)+(c=6)a=(b=10)/(c=2),/表达式值为5,a,b,c值为5,/ b=5;a=5,/表达式值11,c=6,a=11,/表达式值10,a=10,b=4,c=6,/表达式值5,a=5,b=10,c=2,1.4 C语言的运算符与表达式,说明(2):,结合方向:自右向左优先级: 12左侧必须是变
22、量,不能是常量或表达式,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,赋值表达式的值与变量值相等,且可嵌套,例: a=12; a+=a-=a*a,例: int a=2; a%=3; a+=a*=a-=a*=3;,/a=-264,/a=0,1.4 C语言的运算符与表达式,1.4.3 算术运算符和表达式,基本算术运算符: + - * / % 结合方向:从左向右 说明: 两整数相除,结果为整数 %要求两侧均为整型数据,例 5/2 =-5/2.0 =,例 5%2 =-5%2 =1%10 =5%1 =5.5%2,2,-2.5,1,-1,1,0,(),1.4 C语言的运算符与表达式,自增、
23、自减运算符+ -,作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),例 j=3; k=+j; j=3; k=j+; j=3; printf(“%d”,+j); j=3; printf(“%d”,j+); a=3;b=5;c=(+a)*b; a=3;b=5;c=(a+)*b;,/k=4,j=4,/k=3,j=4,/4,/3,/c=20,a=4,/c=15,a=4,1.4 C语言的运算符与表达式,自增、自减运算符+ -,作用:使变量值加1或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使
24、用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),说明: + - 不能用于常量和表达式,如5+,(a+b)+ + -结合方向: 自右向左,例 -i+ -(i+)i=3; printf(“%d”,-i+); /-3,例 -i+i=3; printf(“%d”,-i+);,1.4 C语言的运算符与表达式,1.4.4 条件运算符与表达式,一般形式: expr1 ? expr2 : expr3 执行过程 功能:相当于条件语句,但不能取代一般if语句,例 求 a+|b|printf(“a+|b|=%dn”,b0?a+b:a-b);,例 (a=b)?Y:N(x%2=1)?1:0(x=0)?
25、x:-x(c=a & c=z)?c-a+A:c,条件运算符可嵌套如 x0?1:(x0?-1:0) 优先级: 13,结合方向:自右向左如 ab?a:cd?c:d ab?a:(cd?c:d) expr1、expr2、expr3类型可不同,表达式值取较高的类型,例 x?a:b /x=0,表达式值为b; x0,表达式值为axy?1:1.5 /xy ,值为1.0; xy ,值为1.5,1.4 C语言的运算符与表达式,1.4.5 其他运算符,逗号运算符和逗号表达式 格式:(表达式1,表达式2) 求解顺序及结果: 先求解表达式1,再求解表达式2 ,最终结果为表达式2的值例:(a=15,b=a*5),求字节数运算符 sizeof(double)=8 float b10 ; sizeof(b)=40 sizeof(char)=1,1.4 C语言的运算符与表达式,位运算符,按位取反运算符,按位取反运算符就是将其操作对象中的所有二进制位全部改变状态,即“逢0变1,逢1变0”。 例:八进制数0217,(即二进制10001111),其按位取反后为八进制数0160,(即二进制01110000)。,左移运算符 右移运算符,按位“与” 按位“或” 按位“异或”,