1、1,第2章 数据类型、运算符与表达式,2,内容提要,基本数据类型; 常量和变量; 标识符命名; 常用运算符和表达式; 运算符的优先级与结合性,3,例2.1一个简单的C程序例子,#include /*函数功能:计算两个整数相加之和入口参数:整型数据a和b返回值: 整型数a和b之和*/ int Add(int a, int b) return (a + b); /*主函数*/ main() int x, y, sum = 0;printf(“Input two integers:“); /*输入两个整型数x和y*/scanf(“%d%d“, (背诵),程序特点 函数(Function)是C程序的基
2、本单位,即C程序是由函数构成的. 函数的一般形式由首部和函数体组成函数名(参数) 变量声明部分;执行语句部分; 函数的名字为main的函数,称主函数。只能有一个.一个程序总是从main函数开始执行的 除main函数外,其它函数都是在执行main函数时被调用执行的;包括用户自定义函数和库函数 C语言的书写格式与规则(教材15页),4,续,#include int Add(int a, int b) return (a + b);main() int x, y, sum = 0;printf(“Input two integers:“); scanf(“%d%d“, ,思考: Q:#include
3、 作用? A:#include是编译预处理命令, stdio.h是系统提供的头文件,作用是该头文件包含到本文件中. Q:本程序中有几个函数? A:main函数和add函数还有吗? Q: 函数的结构? A: 函数名(参数) 变量声明部分;执行语句部分; Q: main的函数的作用? A: 是主函数。只能有一个.一个程序总是从main函数开始执行的 除main函数外,其它函数都是在执行main函数时被调用执行的;包括用户自定义函数和库函数,5,C程序常见符号分类,关键字(Keyword) 又称为保留字,C语言中预先规定的具有固定含义的一些单词 int,return等 见附录B 标识符(Identi
4、fier) 系统预定义标识符,main,库函数名printf 等 用户自定义标识符,Add, x, y 等 运算符(Operator) 34种,详见附录D 分隔符(Separator) 空格、回车/换行、逗号等 其它符号 大花括号“”和“”通常用于标识函数体或者一个语句块 “/*”和“*/”是程序注释所需的定界符,6,常见符号示例,#include int Add(int a, int b) return (a + b);main() int x, y, sum = 0;printf(“Input two integers:“); scanf(“%d%d“, ,思考: Q:哪几个是关键字(Ke
5、yword) ? A:int, return Q:哪几个是标识符(Identifier)? A:系统预定义标识符,main 库函数名printf , scanf用户自定义标识符,函数名Add,变量名 x, y ,sum等 Q:哪几个是运算符(Operator)? A: = + Q:哪几个是分隔符? A: , 空格 回车 Q:其它符号的含义? A:大花括号 和 :通常用于标识函数体或者一个语句块 /*和*/程序注释所需的定界符 “Input two.:” 双引号是字符串定界符%d:格式转换说明符 55页 n:转义字符 23页,7,标识符命名,由英文字母、数字和下划线组成,大小写相关 不可以是数字
6、开头 直观,见名知意,便于记忆和阅读 最好使用英文单词或其组合 切忌使用汉语拼音 下划线和大小写通常用来增强可读性 variable_name (UNIX 风格) variableName (Windows 风格) 不允许使用关键字作为标识符的名字 int, float, for, while, if等教材21页,8,数据类型(Data Type),什么是数据(Data)? 定义一:数据是客观事物的符号表示。 定义二:能输入到计算机中并被计算机程序处理的符号的总称。程序处理的数据有常量(Constant)和变量(Variable)两种基本的数据形式。(教材22-28页) 数据为什么要区分类型?
7、主要的目的是便于对它们按不同的方式和要求进行处理 不同的的数据类型区别包括 合法的取值范围 数据表示形式 占用内存空间大小 可参与的运算种类,9,数据类型的分类 教材18页,空类型,数据类型,基本类型,构造类型,指针类型,整型int,实型(浮点型)float,字符型char,枚举类型,数组类型,结构体类型,共用体类型,单精度实型,双精度实型,基本整型,长整型,短整型,无符号整型,长双精度实型,本章只介绍基本类型,10,常量:在程序的运行过程中,其值不能改变的量。 直接常量:有不同的类型。整型常量 1 实型常量 -12.45 字符型常量 a字符串常量:是一对双引号括起来的字符序列。如“Input
8、 two integers:“,常量,教材22页,11,变量 教材26页,变量:在程序的运行过程中,其值可以改变的量。 特点: 变量有名字,用用户自定义的标识符来标识变量名. 变量在内存中占据一个具体的存储单元,该单元用变量名标识.该内存单元存放的数据称为变量的值 变量声明:声明为某种具体类型 变量定义语句格式:数据类型关键字 变量名1,变量名2, int i = 1,sum = 0;注意:1.声明的顺序无关紧要2.声明变量,是初始化变量的最好时机,不被初始化的变量,其值为危险的随机数3.变量必须先定义,后使用(?)。所有变量必须在第一条可执行语句前定义,例,例,12,例1:求半径r分别为5和
9、5.3圆的周长,#include main() int r1=5,cf1;float r2=5.3;cf1=2*3*r1;printf(“cf1 = %dn“, cf1); printf(“cf2 = %fn“, 2*3.14*r2); ,Page 12,变量名? 提示:哪些是前面提到的标识符?,13,例2:求半径r分别为5和5.3圆的周长,#include main() int r1=5,cf1;float r2=5.3;cf1=2*3*r1;printf(“cf1 = %dn“, cf1); printf(“cf2 = %fn“, 2*3.14*r2); ,Page 13,运行结果: cf
10、1=30 cf2=33.284001,变量定义语句有几条?,运行结果是什么?,为什么得到这样的输出的格式?,14,格式输出函数printf(),格式输出函数 printf(格式控制字符串, 输出值参数表); 输出若干个任意类型的数据printf(“a=%d b=%f“, a, b);,输出表列 (输出其值),普通字符 (原样输出),printf()的各种格式转换说明符见教材55页表3-1,15,变量为什么要先定义?,启发:与数据类型不同有关系变量的数据类型决定了编译程序(编译器)为其分配的内存单元的字节数,数据的存放形式,该变量的合法取值范围及可参与的运算.数据类型的不同体现在哪些方面? 合法
11、的取值范围 数据表示形式 占用内存空间大小 可参与的运算种类 下面详细介绍各种数据类型,16,数据类型的分类 教材18页,空类型,数据类型,基本类型,构造类型,指针类型,整型int,实型(浮点型)float,字符型char,枚举类型,数组类型,结构体类型,共用体类型,单精度实型,双精度实型,基本整型,长整型,短整型,无符号整型,长双精度实型,本章只介绍基本类型,17,用关键字int表示,所占内存根据计算机结构的不同而有区别,在大多数机器上占4个字节。 整型常量:整常数 123,-345,0 ;0x”或者“0X”开始的整型常数是十六进制0x12 整型变量:存储整型常量的变量,基本数据类型:整型,
12、类型 关键字 所占内存(字节) 数值范围 I/O格式符 有符号 基本 int 与计算机结构有关 %d 短整 short int 2 -3276832767 %hd 长整 long int 4 -231(231-1) %ld 无符号 unsigned int 2 065535 %u unsigned short 2 同上 %hu unsigned long 4 0(232-1) %lu(见附录C),18,数据类型修饰符,Short: 短型 Long: 长型 Signed 有符号 一般缺省都是有符号的,所以这个修饰符通常省略 unsigned他们是无符号的整数 教材19页,19,基本数据类型:实型
13、(浮点型),实型(浮点型):一般占内存4个字节长 类型 关键字 所占内存(位) 数值范围 有效数字 I/O格式符 单精度 float 4 10-37 1038 7 %f 双精度 double 4 10-307 10308 16 %f 长双精度 Long double 8 10-4931 104932 19 %f (见附录C) 实型常量十进制形式: 0.123, 123.456 ,-16.5指数形式:1.23e2 代表 123102 实型变量:存储实型常量的变量,20,基本数据类型:字符型,字符常量 单引号括起来的一个字符,如:a, D, ?, $ 转义字符 如: n (换行) 教材23页表2-
14、2 字符变量 用来存放字符常量 例:char c1,c2; c1=a; c2=A; 字符数据在内存中的存储形式 以ASCII码存储(见附录E),占1字节,用7个二进制位,Page 20,21,基本数据类型:字符型,字符串(常量)1.是一对双引号括起来的字符序列。如“How do you do”; “China”; “a”2.字符串的存储方式,3.字符常量与字符串常量不能混淆所以:char c; c=“a“;,22,整型数据在内存的存储方式,整型数据占内存2或4个字节。,23,实型(浮点型)数据在内存的存储方式,110.011(B) =+0.110011(B)2+ 11(B),N= 数符尾数2阶
15、符阶码 尾数的位数决定数的精度 阶码的位数决定数的范围,浮点型数据占内存4或8个字节,24,字符型数据在内存的存储方式,字符型数据,在内存占一个字节(8位)采用ACSII码(American Standard Code for Information Interchange) 美国信息交换标准码 见附录E包括128个常用字符,用7位二进制编码,从0到127其中控制字符:032,127;普通字符:94个。例如:“a”字符的编码为1100001,对应的十进制数是97;09 30H39H 4857AZ 41H5AH 6590az 61H7AH 97122,25,例3:求半径r分别为5和5.3圆的周长
16、,#include main() int r1=5,cf1;float r2=5.3;cf1=2*3*r1;printf(“cf1 = %dn“, cf1); printf(“cf2 = %fn“, 2*3.14*r2); ,Page 25,有哪几种类型的变量? 变量名是?,26,格式输入函数引入 例4:从键盘输入半径r的值(实数),求圆的周长。,#include main() float r,cf;printf(“Input the radialn”)scanf(“%f“, ,Page 26,运行结果: cf=33.28,程序运行结果完整吗? scanf()的功能?,27,格式输入函数sca
17、nf(),格式输入函数scanf(格式控制字符串, 参数地址表); scanf(“%d,%f”, ,scanf()的各种格式转换说明符见教材57页表3-2,28,C常用运算符及表达式,算术运算符 关系运算符 逻辑运算符 位运算符 赋值运算符 条件运算符 逗号运算符 指针运算符 求字节运算符 强制类型转换运算符 分量运算符 下标运算符 其他 表达式:用运算符和括号将操作数(也称运算对象)连接起来, 符合c语法规则的式子.,29,例: 从键盘输入两个整数,找出其值大的数,并求其平均值,并输出。,#include main() int a,b,aver,max;printf(“Input the a
18、,b “);scanf(“%d,%d“, ,用到了哪些运算符?,赋值运算符 算术运算符 关系运算符,30,赋值运算符 与赋值表达式,赋值运算符: = 作用是将一个数据赋给一个变量赋值表达式: 例: a=5 变量的值是5,整个表达式值为5 复合的赋值运算符:C语言中有10种复合运算符:+=, -=, *=, /=, %= 等 例:a+=3 等价于 a=a+3 x*=y+8 等价于 x=x*(y+8),31,算术运算符,算术运算符与算术表达式基本的算术运算符:+, -, *, /, %其中:/运算符两侧若为整数,则结果为整数,舍去小数部分并“向零取整”。若有一个数为实数,结果为double型.5/
19、2=2 5.0/2=2.5%运算符两侧必须为整数 ,结果为余数如: 7%4=3,32,关系运算符,,=,=,=,!= 大于,大于等于,小于,小于等于,等于,不等于 关系运算符运算出的结果为0和非0 0,表示假,即该关系不成立 非0,表示真,即该关系成立 绝大多数编译器,关系运算得到的非0结果为1,但是不要利用这个1,33,逻辑运算符,逻辑运算也被称为布尔(Boolean)运算 36页表2-8与 & a & b当且仅当两者都为真,则结果为真,用1 表示或 | a | b只要两者中有一个为真,结果就为真非! ( !a );如果a是0,结果非0;如果a是非0,结果是0 并不改变a的值,34,练习,例
20、:有一分段函数y=f(x), 当-30时 y= 2x-1, 当x=0时 y=0 编程实现输入一个x值,输出y值。,35,思考:还记得这个程序吗?,#include main() int a,b,aver,max; printf(“Input the a,b “); scanf(“%d,%d“, ,思考:如果输入的是3和4,那运行结果是?,例:从键盘输入两个整数,找出其值大的数,并求其平均值,并输出。,注意: 变量定义时的数据类型 算术运算符 格式输出函数,36,思考:如何修改才能得完全正确的结果?,#include main() int a,b,max; float aver;printf(“
21、Input the a,b “);scanf(“%d,%d“, ,例:从键盘输入两个整数,找出其值大的数,并求其平均值,并输出。,注意: 变量定义时的数据类型 算术运算符 格式输出函数,37,实例:运算符的使用,判断某一年year是否是闰年的条件是满足下列两个条件之一: 能被4整除,但不能被100整除; 能被400整除;,(year % 4 = 0) & (year % 100 != 0) | (year % 400 = 0),用到了几种运算符? 赋值运算符? 算术运算符? 关系运算符? 逻辑运算符?,38,增1和减1运算符,增1和减1运算符i+, +i 即 i=i+1i-, -i 即 i=i
22、-1区别:i+先引用,后增值, +i 先增值,后引用. 说明: 自增自减运算符(+,-)只能用于变量,不能用于常量和表达式。5+,(a+b)+都是错的. 避免歧义.最好增加括号如:i+j= (i+)+j而不是i+(+j).,39,main() int i=5; int x,y; i+; printf(“i=%dn”,i);x=i+; y=i; printf(“x=%d,y=%dn”,x,y); ,例:增1运算符的使用,main() int i=5; int x,y; +i; printf(“i=%dn”,i);x=+i; y=i; printf(“x=%d,y=%dn”,x,y); ,40,自
23、动类型转换,1、赋值中的类型转换在进行赋值操作时,当赋值运算符(=)两侧类型不一致时,会发生类型转换。类型转换的原则是:将右侧表达式的值转换为左侧变量的类型。 注意:将取值范围小的类型转为取值范围大的类型是安全的反之是不安全的。反之,转换后的结果必然是错误的,例如:浮点数转为整数,会截掉小数部分,非四舍五入。具体结果与机器和实现方式有关。 2、表达式中的类型转换不同种数据类型的运算结果,是两种类型中取值范围更大的那种。long double double float long int short char,教材44页,41,类型强制转换 可以通过“(类型)表达式”的方式把表达式的值转为任意类型
24、,#include /*例2.7 教材40页*/ main() int m = 5;printf(“m / 2=%dn“, m/2);printf(“(float)(m/2) = %fn“, (float)(m/2);printf(“(float)m/2 = %fn“, (float)m/2);printf(“m = %dn“, m); ,m/2 = 2 (float)(m/2) = 2.000000 (float)m/2 = 2.500000 m = 5,42,逗号运算符与逗号表达式,格式: 表达式1,表达式2 求解顺序及结果: 先求解1,再求解2,最终结果为表达式2的值 例 a=3*5,a
25、*4 最终结果为60 (逗号运算符的优先级低于赋值运算符)(a=3*5,a*4),a+5 结果为:20,43,优先级,( ) - . ! + - + - * & (类型) sizeof * / % + - = = != & | & | ? : = += -= *= /= %= &= = |= = ,用括号来控制运算顺序更直观、方便,并减少出错的概率,44,结合性,多数运算符为左结合. 少数为右结合: 一元运算符 赋值运算符 条件运算符教材46页 表2-12,45,*宏常量 (符号常量) :用一个标识符代表一个常量 其定义的一般形式 #define 标识符 字符串宏名:在宏定义中的标识符 宏替换
26、:将程序中出现的宏名替换成字符串的过程.,宏常量 (符号常量),自学教材22页,46,宏常量的使用,例2.2 :计算圆的周长和面积 #include #define PI 3.14159 #define R 5.3 main() printf(“area = %fn“, PI * R * R);printf(“circumference = %fn“, 2 * PI * R); ,area = 88.247263 circumference = 33.300854,自学教材22页,47,基本数据类型:枚举类型 (自学教材25页),枚举 :一一列举,用于某些量仅由有限个数据值组成 枚举类型:描述
27、的是一组整型值的集合,用关键字enum来定义这种类型main()enum response no, yes, none;enum response answer;answer = yes; if (answer = yes)printf(“Today is Tuesday.n“);elseprintf(“Today is NOT Tuesday.n“);,大括号内的标识符为整型常量,称为枚举常量,该语句为枚举类型声明语句,枚举标记,枚举变量,该语句为枚举变量定义语句,48,思考题,1.常量和变量的含义以及使用规则 2.简述常见基本数据类型的关键字、合法的取值范围和数据占用内存空间大小. 3.字符常量与字符串常量的区别. 4.简述常见的运算符的功能. 5.”变量必须先定义,后使用”的原因是是什么? 6.举例说明什么是”标识符的命名的大小写相关”? 7.习题2.1,2.2,2.3(作业),