1、第2章 数据类型、 运算符与表达式,学习目标,理解常量和变量的概念。熟悉C语言的基本数据类型:整型、实型和字符型数据的表示及范围。掌握C语言的基本运算符及表达式。,2.1 引言,程序数据结构算法 程序 :编写程序的目的是利用计算机完成 某一问题的求解任务 数据:数据是计算机程序在运行时的处理对象 算法:对数据的求解操作通过程序步骤,既算法反映出来,2.2 C语言的字符集和词法约定,#include #define PI 3.14 void main() int choice;float radius, area, perimeter;scanf(“%d,%f“, ,【例2-1】一个C程序实例,
2、根据用户的选择,计算以radius为半径的圆的面积或周长。,2.2.1 C语言的字符集,字符是组成语言的最基本元素。 C语言的字符集由字母,数字,空格,标点和特殊字符组成: 1.字母: 大小写字母共52个 2.数字: 09共10个 3.空白符:空格符、制表符、换行符等统称为空白符 4. 标点和特殊字符:包括表示一条语句结束的“;”以及逗号表达式中的“ ,”等。,2.2.2 C语言词汇,C语言使用的词汇分为六类,1. 标识符:就是用来标识变量名、符号常量名、函数名、类型名、文件名等的有效字符序列。,在使用标识符时需要注意以下几点:1)标识符命名应尽量作到见名知意。 2)C语言的标识符大小写字母敏
3、感,即代表不同的变量。 例如PI和pi会被认为是两个不同的标识符。 3)标识符的长度受不同版本的C语言编译系统以及具体计算 机系统的限制。,2.2.2 C语言词汇,C语言的关键字分为以下几类: 1)类型说明符。用于定义、说明变量、函数或其他数据结构的类型。 2)语句定义符。用于表示一个语句的功能。 3)预处理命令字。用于表示一个预处理命令。,2.关键字:关键字是由C语言规定的具有特定意义的字符串,通常也称为保留字。附录B,如例2-1中用到的float等。,如例2-1中用到的if。,如例2-1中用到的include。,C语言的词汇,3运算符C语言中含有相当丰富的运算符。运算符与变量、函数一起组成
4、表达式,完成各种运算功能。4分隔符在C语言中采用的分隔符有逗号和空格等。逗号主要用在类型说明和函数参数表中,分隔各个变量。空格多用于语句各单词之间,作间隔符。5常量 C语言中使用的常量可分为数字常量、字符常量、字符串常量、符号常量、转义字符等多种。,C语言的词汇,6. 注释符1)以“/*”开头并以“*/”结尾的串,用来注释一段;例2-1中,“/*选择1,计算面积*/” 2)用“/”注释一行。例2-1中的:if(choice=2) 后的“/选择2,计算周长”,2.3 常量和变量,2.3.1 常量 概念:在程序运行过程中,其值不发生改变的 量称为常量。 常量数据的类型一般为基本类型中的一种, 如:
5、 整型常量:3,0,-1 实型常量:1.2,-2.345 字符常量:a,1,从使用形式上看,常量包括字面常量和符号常量,1)字面常量。直接以数据值表示的常量,称字面 常量或直接常量例2-1中的2便是一个字面常量。2)符号常量。以标识符号(以下简称标识符)表示的常量称为符号常量,例2-1中的PI就是一个符号常量,并且在使用之前需通过#define命令定义。定义后,在程序中,PI将一直代表3.14。,为什么要引 入符号常量,2.3 常量和变量,2.3.2 变量 概念:在程序运行过程中值可以改变的量,称为变量。 例2-1中, choice,radius等为变量。执行程序的输入语 句后,这两个变量依次
6、保存2和1.0,即变量值分别为2和 1.0。执行程序的输入语句后,2和1.0分别送入&choice,&radius中。要区别开变量名和变量值以及变量的地址这三个概念。,2.4 数据类型(Data Type)(p15),数据类型,基本类型,构造类型,指针类型,空类型,整型,实型(浮点型),字符型,枚举类型,数组类型,结构体类型,共用体类型,单精度实型,双精度实型,短整型,基本整型,长整型,2.4.2整型数据,1整型常量 即表示整数的常量,C语言中的整数有3种表示形式: 1)十进制形式。如99,-1。 2)八进制形式。以数字0打头:如012,0。 3)十六进制形式。以0x(0X)打头:如0x12,
7、0Xff。 常见错误: 1)把表示八进制和十六进制的0和0x误写成o和ox。 2)八进制中出现超过“7”的数。,2.整型变量,有符号整型(signed int):通常简写为int,在内存中占两个字节。int型变量的范围为-3276832767。 无符号整型(unsigned int):可简写为unsigned。在内存中占两个字节,unsigned变量的范围为065535。 有符号短整型(signed short int):可简写为short,范围与int相同。 无符号短整型(unsigned short int):可简写为unsigned short,范围与unsigned int相同。 有符
8、号长整型(signed long int):可简写为long,在内存中占四个字节,范围为-231231-1。 无符号长整型(unsigned long int):可简写为unsigned long,范围为0232-1。,【例2-2】请观察下面程序的运行结果,#include void main() short n=32768;printf(“n=%d“,n); 程序运行结果: n=-32768,例2-2思考,请观察下面程序的运行结果,#include void main() unsigned short n=32768;printf(“n=%d“,n); 程序运行结果: n=32768,2.4
9、.2 实型数据,1实型常量 1)十进制数形式:由数码0 9和小数点组成。例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230等均为合法的实数。注意:小数点不能缺。 2)指数形式:123e3,1.23e5,123.E3,0.123E6。指数形式的规范化形式为:尾数中小数点左边有且只能有一位零数字。,注意:,e(E)前一定要有数字(尾数) e(E)后一定要有整数(指数或阶码) 尾数和e(E)之间不能有任何分隔符,常见的错误书写形式: E1 原因:阶码标志E之前无数字。 53.-E3 原因:负号位置不对。 2.7E 原因:无阶码。,2.实型变量,实型数据在内存中的存放形式
10、:,所以实型数据-111.1101B在内存中的存放形式为:,单精度型float 单精度型占4个字节内存空间 只能提供七位有效数字。双精度型double 双精度型占8 个字节内存空间 可提供16位有效数字。,实型变量分为两类,【例2-3】分析观察以下程序的运行结果,#include void main() float f;double d;f=111111.111111;d=111111.111111;printf (“f=%fnd=%fn“,f,d ); ,程序运行结果: f=111111.109375 d=111111.111111,2.4.4 字符型数据,1字符常量字符常量有两种表示方法:
11、 1)普通表示形式,用单引号括起的单个字符。如A,a,$, 等。2)转义字符表示形式。 转义字符有以下三种用法: 表示控制字符,表示特殊字符,表示所有字符,,常用的转义字符及其含义,【例2-4】转义字符的使用举例,#include void main() printf (“NumtNamen“);printf (“x31t101n“); ,程序运行结果(其中代表一个空格): NumName 1A,2字符型变量,用以保存字符类型数据的变量为字符型变量。例如: char c1;,字符型变量的类型说明符,字符型变量,字符型变量保存的是字符数据的ASCII码, 字符型变量在内存储器中只占一个字节。,【
12、例2-5】字符变量的赋值举例,#include void main() char c1,c2,c3,c4;c1=A; c2=65; c3=x41; c4=101; printf(“c1=%c;c2=%c;c3=%c;c4=%cn“,c1,c2,c3,c4);printf(“c1=%d;c2=%d;c3=%d;c4=%dn“, c1,c2,c3,c4); ,程序运行结果: c1=A;c2=A;c3=A;c4=A c1=65;c2=65;c3=65;c4=65,【例2-6】 大小写字母的转换,#include void main() char c1, c2;c1=a;c2=A;printf(“%c
13、 %cn“ , c1, c2 );c1=c1-32; /小写字母转大写字母c2=c2+32; /大写字母转小写字母printf(“%c %cn“ , c1, c2 ); ,程序运行结果: a A A a,3字符串常量,用一对双引号括起来的零个或多个字符序列称为字符串。字符串的长度是指该字符串的有效字符个数,不包括双引号以及字符串结束标志。示例:字符串: Teacher实际串长为7 ,占了8字节空间(字符串结束标志也占一个字节)。,常见错误:,1)混淆单个字符和只包含一个字符的字符串的区别。例:char ch=“c“; 语句错误,字符串“c“ 在内存中占两个字节空间,char类型变量ch占一个字
14、节内存空间。正确的书写形式为:char ch=c; 2)以为存在包含零个字符的字符数据。例:char ch=;只有包含零个字符的空串,但没有包含零个字符的空字符常量,正确的书写形式应该为:char ch=0。如果想把一个空格字符保存到ch变量中,空格字符也要表示出来,例如:char ch=; (其中“”代表键入一个“空格”),2.5 运算符及表达式,算术运算符 + - * / % + - 关系运算符 = | & 赋值运算符 = 及其复合赋值运算符 条件运算符 ?: 逗号运算符 , 指针和取地址运算符 * & 求字节运算符 sizeof 强制类型转换运算符 (类型) 分量运算符 . - 下标运算
15、符 其他运算符 例如( ),语言的运算符分为以下几类:,表达式:由运算符和运算对象组成的合法式子。,2.5.2 算术运算符和算术表达式,1. C语言中基本的算术运算符,注意:,1)参与运算的对象数。2)参与运算对象的类型。需要注意的是取模运算,即求余数运算%,要求 两侧的操作对象均为整型数据。3)运算结果的类型。C语言规定:两个整数相除,其结果也为整数,小 数部分被舍弃。例如,5/2得2,结果为整型。,【例2-7】字符型数据的算术运算,#include void main() char c; /定义字符型变量int n; /定义整型变量c=9; /将字符9赋值给c n=c-0; /将c中的字符
16、变成数字9后赋给n printf(“%c %dn“,c,n ); ,程序运行结果:9 9,字符,数字,2自增、自减运算符及其表达式,在使用自增、自减运算符时,需要注意以下几点:,1)+和-只能用于变量,不能用于常量和表达式。例如以下用法是错误的:a+;+ (a+b); #define ONE 1 ONE+;2)出现多个运算符时,编译器在处理时尽可能多的从左到右将若干个字符组合成一个运算符。i+j应解释为(i+)+j,而不是i+(+j)。3)在C语言中调用函数时,实际参数的处理顺序是从右到左。,【例2-8】 分析观察下面程序的运行结果,#include void main() int i=1;p
17、rintf(“ %d, %d“ ,i , i+); ,程序运行结果: 1,1P23 思考题,2.5.3赋值运算符和赋值表达式,1赋值运算符在c语言中,用 = 表示赋值运算符,它的作用是将右侧表达式的值赋给左侧变量。例如: a = 3 /常数3赋给变量a a = b + c + 1 /算术表达式的结果赋给变量a,左边只能取变量,不能为常量或表达式;,右边可取变量、常量或任意表达式。,2变量初始化,定义变量时给变量赋予初值称为变量初始化。 例如:int i = 0; 定义i为整型变量,同时初始化为0float f = 2.25; 定义f为单精度实型变量,同时初始化为为2.25char c = 0;
18、 定义c为字符型变量,同时初始化为字符0,分清初始化和赋值语句赋值的概念,int i=0; 是初始化 int i; i=0; 是赋值 i=j=k=0; 正确 int i=j=k=0;错误,用同一值初始化几个变量的正确的写法应该为:int i=0, j=0, k=0;,3复合的赋值运算符,复合赋值运算的一般格式为: 变量 双目运算符 = 表达式,等同与: 变量 = 变量 双目运算符 (表达式)例如:c+=32 等同与 c=c+32 z*=a-b 等同与 z=z*(a-b),2.5.4 逗号运算符和逗号表达式,逗号表达式一般的形式:表达式1, 表达式2, 表达式3, ., 表达式n表达式n的值就是
19、逗号表达式的最终取值。,2.6 运算符的优先级和结合性,对于多个运算符组成的表达式进行求值运算时,需要根据运算符的优先级别、高低次序和结合性执行。 一般规则是: 1)按运算符的优先级高低次序执行。C语言中,运算符的运算优先级共分为15级。在表达式中优先级较高的先于优先级较低的进行运算。例如,先乘除后加减,如果有括号,则先计算括号。例如:+i,j - -2)如果一个运算对象(或称操作数)两侧运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。 例1:x=y=z 例2:sizeof i+C语言中各运算符的结合性分为左结合性(自左至右)和右结合性(自右至左)两种。,2.7 C语言中的数据类型
20、转换,以下情况需要进行数据类型转换: 不同数据类型的运算对象进行混合运算需要将一个表达式的结果转换成期望的类型时,就需要依据数据类型转换规则进行转换。,2.7.1 混合运算时的类型转换规则,1)综向箭头表示必定会进行的转换如float型数据必先转换为double型数据,然后同另外操 作数进行运算;依此类似,如有char型或short型数据, 必先转换得到int型,然后运算。 2)横向箭头表示当运算对象为不同类型数据时的转换方向如int同unsigned数据运算,int型转换为unsigned型后方可进行运算转换。int同double数据运算,int直接转换为double型后进行运算,不能理解为
21、先转化为unsigned int型,然后转换为long int型,最后再转换为double型。,2.7.2 赋值时的类型转换,当赋值运算符两侧的类型不同时,需进行类型转 换,这种转换也是系统自动进行的。 具体转换原则见课本说明,依据赋值运算符左侧 数据的类型而定。(p26),2.7.3 强制类型转换,在C语言中,允许强制类型转换,将某一数据的 数据类型转换为指定的另一种数据类型。 强制转换运算符组成的运算表达式的一般形式为:(类型名)(表达式)例如: (int)(x + y) 将x+y的值转换成整型,即取整数部分。 (float)x + y 将x转换成单精度型。,小结,掌握C语言的基本词汇 掌
22、握常量和变量的概念,符号常量的定义形式,了解引入符号常量的意义 熟悉三种基本数据类型:整型、实型和字符型的基本特征和用法 掌握如何实现变量的定义、赋值和初始化 掌握算术运算符、逗号运算符、赋值运算符及其相关表达式 理解运算符的优先级和结合性 理解C语言中的数据类型转换问题,P27: 2.2、2.3的(2)、(4)、(5)P27: 2.4、2.7、2.8P27: 2.6、2.9的(1)、(3)、(5),作业,条件运算符要求有3个操作对象,称三目(元)运算符,它是c语言中唯一的一个三目运算符。条件表达式的一般形式为: 表达式1?表达式2表达式3 条件运算符的执行顺序:先求解表达式1,若为非0(真)
23、则求解表达式2,此时表达式2的值就作为整个条件表达式的值。若表达式1的值为0(假),则求解表达式3,表达式3的值就是整个条件表达式的值。 max = (ab) ? a : b 执行结果就是将条件表达式的值赋给max。也就是将a和b二者中大者赋给max。 (2) 条件运算符优先于赋值运算符,因此上面赋值表达式的求解过程是先求解条件表达式,再将它的值赋给max。 条件运算符的优先级别比关系运算符和算术运算符都低。因此 max = (a b) ? a : b 括号可以不要,可写成 max = a b ? a : b 如果有 a b ? a : b+1 相当于a b ? a : (b+1), 而不相当
24、于(ab ? a : b)+1。,(3) 条件运算符的结合方向为“自右至左”。如果有以下条件表达式: a b ? a : c d ? c : d相当于a b ? a : (c d ? c : d) 如果a=1,b=2,c=3,d=4,则条件表达式的值等于4。 (4) 条件表达式还可以写成以下形式: ab? (a=100) : (b=100) 或 ab? printf(“%d“,a) : printf(“%d“,b); 即“表达式2”和“表达式3”不仅可以是数值表达式,还可以是赋值表达式或函数表达式。上面第二个条件表达式相当于以下if-else语句: if(ab) printf(“%d“, a)
25、; else printf(“%d“, b);,(5) 条件表达式中,表达式1的类型可以与表达式2和表达式3的类型不同。如x? a: b x是整型变量,若x=0,则条件表达式的值为b。表达式2和表达式3的类型也可以不同,此时条件表达式的值的类型为二者中较高的类型。如 xy? 1 : 1.5 如果xy,则条件表达式的值为15,若xy,值应为1,由于15是实型,比整型高,因此,将1转换成实型值1.0。 (6) 条件表达式不能取代一般的if语句,只有在if语句中内嵌的语句为赋值语句(且两个分支都绐同一个变量赋值)时才能代替if语句。如以下if语句就无法用一个条件表达式代替. if (ab) printf(“%d“,a); else printf(“%d“,b);但可以用下面的语句代替: printf (“%d“, ab? a : b ); 即将条件表达式的值输出,