《数据类型运算符和表达式课件》由会员分享,可在线阅读,更多相关《数据类型运算符和表达式课件(19页珍藏版)》请在金锄头文库上搜索。
1、第三章 数据类型、运算符和表达式 词类之一 常量 词类之二 变量 词类之三 运算符词类之四 表达式 各种词类的数据类型3.1 C语言的数据类型 数据类型:是指数据在计算机中存放的形式。 不同类型的数据有不同的加工方法。 C语言的数据类型分类 参看下表。 1数据类型、运算符和表达式 C语言的数据类型表 带符号整型 (简称整型) 带符号整型 带符号短整型(简称短整) 带符号长整型(简称长整) 整型 无符号整型 (简称无符号整型) 无符号整型 无符号短整型(简称无符号短整) 无符号长整型(简称无符号长整) 基本类型 单精度型 实型 双精度型 字符型 数据类型 数组型(字符串型) 构造类型 结构型 共
2、用型 指针型 空类型2数据类型、运算符和表达式3.2 常量与变量一、常量与符号常量一、常量与符号常量(1)常量 直接写在程序清单中的数据,分为整型、实型、字符型、字符串。(2)符号常量 用名字来替代常量。 【定义方法】#define 符号常量名 常量 【注】符号常量名:用户任取的一个标识符。 标识符 :字母开头的字母、数字、下划线等组成,长度8或32。 符号常量通常用大写字母组成,以便区别其他的对象,如变量名。 符号常量性质是常量,不能象变量那样给其赋新值。二、变量二、变量(1)变量 利用数据定义语句在程序中定义的对象,用来存放数据。(2)变量名 标识符(通常用小写字母组成) ,在定义时确定的
3、。(3)变量值 变量中存放的数据,通过输入、初始化、赋值获得。(4)变量数据类型 变量中能存放的数据类型,在定义时确定的。【注】变量名区分字母大小写的!如ccw、Ccw、CCw、CCW是不同变量名。 标识符不能是关键字(C语句中使用的英语单词) C语言的关键字请参考附录B,P365(后续课程会一一介绍)。3数据类型、运算符和表达式3.3 整型数据一、整型常量及其表示方法【表示方法】有3种。 十进制整数 通常形式的整数 例如 +12、 -12、 12。 八进制整数 以0开头的八进制整数 例如 +012、 -012、 012。 十六进制整数 以0x开头的十六进制整数 例如+0x12、-0x12、0
4、x12。二、整型变量【作用】存放整型数据。【定义方法】存储类型符 数据类型符 变量名1=初值,变量名2=初值,.; 其中:方括号中内容是可以省略的,变量名是标识符,初值是常量或常量表达式。 数据类型符可以是下列任一种: 整型 短整型 长整型 无符号整型 无符号短整型 无符号长整型类型符 int short long unsigned int unsigned short unsigned long字节数 4(2) 2 4 4(2) 2 4【功能】定义某种数据类型的变量,分配内存,并赋予初值。【注】int、unsigned int在VC中为4字节。三、整型常量的数据类型在VC中整型常量均为带符号
5、长整型【注 】在VC中整型常量后可以加字母L或l,如1L、12000L。通用的数据定义语句复习内存的概论复习四种数制间的转换方法4数据类型、运算符和表达式3.4 浮点(实)型数据一、浮点型常量的表示方法【表示方法】(1)普通的十进制实数,带小数点。如0.0、-123.、.456 (2)指数形式(在字母E或e的后面写上10的方次),如12.3E3、1e-5。二、浮点型变量【定义方法】存储类型符 数据类型符 变量名=初值,.; 其中:数据类型符 可以是下列任一种: 单精度浮点型 float 占4字节 范围:10-3710+38 (7位有效数字) 双精度浮点型 double 占8字节 范围:10-3
6、0710+308(16位有效数字) 变量名 用户给出的标识符,初值是常量或常量表达式。【功能】定义某种数据类型的变量,并赋予初值。 【注】浮点型常量不区分单、双精度。 赋值时有效数字超出将截去多余数字。 例如,赋予单精度实型变量时, 1234.56789变成1234.568。3.5 字符型数据一、字符常量【表示方法】(1)可显示字符。用单引号()括住单个字符。 如0、 A、 a。(2)所有字符(包括不可显示字符)。 用单引号括住“转义字符”,常用转义字符参看右表。ntvbradddxhh回车换行符Tab符垂直制表符左退一格符回车符响铃符号单引号双引号反斜杠13位8进制数ddd 对应的ASCII
7、字符12位16进制数hh 对应的ASCII字符通用的数据定义语句5数据类型、运算符和表达式二、字符型变量【定义方法】存储类型符 数据类型符 变量名=初值,.; 其中:数据类型符只能是char,占用的内存字节数是1。 变量名是标识符,初值是常量或常量表达式。【功能】定义字符型的变量,并赋予初值。【注】字符型数据在内存中实际存放的是对应字符的ASCII代码值(0127)。 因此,字符型数据可以看成带符号或无符号的整型数据。 而整型数据只要不超出范围(0127),也可以看成是字符型数据。【例】#include stdio.h 【说明】整型、实型、字符型合称数值型数值型 void main() int
8、 i; char c=97; i=A; printf(%c,%dn,c,i); /* 程序是正确的,输出结果是:a,65*/ 三、字符串常量(简称字符串)【表示方法】双引号()括住的若干个字符(包括转义字符)。【例】 、1、1.23、abc、n、nnxyz 。 【注】(1)字符串在内存的存放规则是:按顺序依次存放字符串中每个字符的ASCII 代码值,最后自动存放一个“0”,其值为0,称为字符串结束标记符。 (2)字符串长度字符串中的字符数目。 (3)字符串占用的内存字节数字符串长度1。 (4)无字符的字符串称为空字符串,简称空串。空串长度为0,占用1个字节。 (5)字符串与字符常量是不同的。
9、a和a是不同的数据类型,占用字节数不同。 (6) C中没有字符串变量,是用字符型数组来存放的,以后介绍。介绍常用字符的ASCII代码AZ、az、09通用的数据定义语句6数据类型、运算符和表达式3.6 变量赋初值【方法】在定义变量时,给出初值。【注】初值是常量或已经定义过的符号常量、或由它们组成的表达式(常量表达式), 其数据类型与变量的数据类型要一致。【例】#define PI 3.14159 错误的 int i=10,j=-6+1,k; int i=10,j=i+1; float f=1.2345,s=0.0-0.1,x1,x2=PI+1; float f=1.2345,s=0.0-f; c
10、har c1=a,c2=A+1,c3; char c1=a,c2=c1+1;3.7 各种基本数据类型的数据之间混合运算【规则】 double float 横向:必定先转换 纵向:沿箭头按需要转换 表达式计算时 long 就长不就短就长不就短 unsigned int short、char【例】设有定义: char c=1; int i=2; long L=3L; float f=4.0; 计算“c*i/L+f”的过程是: (1)c*i c转换成int型,和i相乘,运算结果是int型 (2)(c*i)/L c*i转换成long型,和L相除,运算结果是long型 (3)(c*i/L)+f (c*i
11、/L)和f转换成double型,相加,运算结果是double型 最后对基本类型的数据给一个小结表。 此处用大写。 因为小写字母l和数字1相似。7数据类型、运算符和表达式基本数据类型的小结数据类型数据类型符占用字节数数值范围整型int4(或2)同长整型(或短整型)短整型short2-32768(-215)+32767(215-1) 长整型Long4-2147483648 (-231) +2147483647 (231-1) 无符号整型unsigned int4(或2)同无符号长整型(或短整型)无符号短整型unsigned short2065535 (216-1)无符号长整型unsigned lo
12、ng404294967295(232-1)单精度实型float4-10371038(7位有效数字)双精度实型double8-1030710308 (16位有效数字)字符型char10+127(-128+127)8数据类型、运算符和表达式 3.8 算术运算符与算术表达式 基本算术运算符(+ - + - * / %) 一、C的运算符 算术运算符 增1减1运算符(+ -) 关系运算符( = = .) 指针运算符(& * + -) 注:掌握运算符必须掌握:运算符、对象数目、运算符的位置、对象的类型、 运算规则、运算结果的类型、 优先级、结合性。9数据类型、运算符和表达式 二、算术运算符 【说明】 (1
13、)优先级:单目 双目 (3)模运算结果符号与被除数相同。 *、/、% 、 例如,28 10 8(商为2) (2)除运算的结果与除数、被除数的数据类型有关。 28-10 8(商为-2) 两个都是整型,则为整除,只取商的整数部分。 -28 10-8(商为-2) 例如,28/102 -28-10-8(商为2) 28.0/10=2.8 28/10.0=2.8 28.0/10.0=2.8 名称对象数与位置运算符对象类型运算规则结果类型结合性取正单目前缀整型、实型或字符型取原值与运算对象的类型相同(就长不就短)自右向左取负取负值 加双目中缀相加自左向右 减相减乘*相乘除/相除或整除模 %整型或字符型整除取
14、余数整型10数据类型、运算符和表达式三、强制运算符【优先级】单目算术、强制 双目算术【例】 (float)(7%3)的结果是1.000000 7位有效数字 (double)(5/2)的结果是2.0000 16位有效数字 (int)(3.7+2.2)的结果是5 【注】其后无括号,仅对第一个数据起作用,如(int)3.7+2.2的结果是5.2四、自增自减运算符名称对象数与位置运算符对象类型运算规则结果类型结合性强制转换单目前缀(类型符)(表达式)数值型表达式值转换成指定的数据类型类型符的数据类型自右向左名称对象数与位置运算符对象类型运算规则结果类型结合性增1单目前缀+字符型整型等变量变量加1后再使
15、用变量同运算对象的类型自右向左本身无单目后缀+使用变量后变量再加1减1单目前缀-变量减1后再使用变量单目后缀-使用变量后变量再减111数据类型、运算符和表达式【优先级】+、-、单目算术、强制 双目算术【例】#include stdio.h void main() int k=3; printf(%dn,+k); 输出结果是4,k为4 printf(%dn,k+); 输出结果是4,k为5 【注】(1)注意理解后缀+、-的加减1的时间。 i=3; k=i+; k为3、i为4 i=3; k=(i+)+(i+)+(i+) k=3+3+3=9、i=3+1+1+1=6 结论:后缀的+和-是所在的表达式全部
16、计算结束后,再进行加减1的运算。 (2)自左向右尽可能地选取多个运算符组成复合运算符。 k=1; k+k+k 相当于(k+)+(k+)+k,结果是3,k为3。 (3)+和-只能作用于变量,不能作用于表达式。 k=1; +k相当+(+k),其中(+k)是正确的,但+(+k)是错误的。 (4)注意TC中函数参数的计算顺序是自右向左的(VC中是自左向右)。 k=1; printf(“%d,%d”,k,k+); 输出结果是2,1(VC中是1,1)。五、算术表达式 表达式 :用运算符将合适的运算对象连接起来的式子。 表达式值 :表达式的最终运算结果值。 表达式类型(两种分类):表达式值的数据类型、最后一
17、个运算符的类型。 运算符的运算对象 :常量、变量、表达式(常量、变量看成表达式特例)。 表达式运算的转换规则:就长不就短。 算术表达式 :用算术运算符将合适的运算对象连接起来的式子。12数据类型、运算符和表达式3.9 赋值运算符与赋值表达式一、赋值运算符【注】(1)前一个运算对象只能是变量,后一个运算对象是表达式(或常量、变量)。 (2)赋值时的转换规则是:就左不就右。 当字节数少的值赋予字节数多的变量时,不会出错;反之,可能会出错。【例】int k; k=3.99; k为3。 float f; f=3; f为3.000000 unsigned short u=65535; short k;
18、k=u; k为-1 long L=32768; short s; s=L; s为-32768名称对象数与位置运算符对象类型运算规则结果类型结合性赋值双目中缀左边:变量右边:表达式任何基本类型计算表达式值转换成变量的数据类型后赋予变量变量的数据类型自右向左1 1 1 1 1 1 1 11 1 1 1 1 1 1 11 0 0 0 0 0 0 00 0 0 0 0 0 0 00 00 0复习:带符号整数与无符号整数13数据类型、运算符和表达式二、复合赋值运算符【优先级】 +、-、+、-、强制 双目算术 赋值 就长不就短,转为双精度 所有赋值运算符的优先级相同。【注】后5个将在第12章“位运算”介绍
19、。 右边表达式自动加圆括号。【例】int k=3; k-=3; k为0。 int k=3; float f=3.0; f*=3; f为9.000000 k*=1+2; int k=-5; k/=2; k为-2 相当于“k=k*(1+2);” long L=5; L%=8L; L为5L名称对象数与位置运算符对象类型运算规则结果类型结合性加赋值双目中缀+=左边:变量右边:表达式任何基本类型X+=Y 相当于 X=X+(Y)变量的数据类型自右向左X-=Y 相当于 X=X-(Y)减赋值-=X*=Y 相当于 X=X*(Y)乘赋值*=除赋值/=X/=Y 相当于 X=X/(Y)模赋值%=整型X%=Y 相当于
20、X=X%(Y)位与赋值双目中缀&=左边:变量右边:表达式整型X&=Y 相当于 X=X&(Y)整型X|=Y 相当于 X=X|(Y)位或赋值|=位按位加赋值=X=Y 相当于 X=X(Y)位左移赋值=X=Y 相当于 X=X=X=Y 相当于 X=X(Y)常见的警告型错误:float f; f=1.0+2.0;14数据类型、运算符和表达式 三、赋值表达式 赋值表达式: 用赋值运算符连接变量和表达式组成的式子。 赋值表达式的值: 赋予左边变量的值。 赋值表达式的类型: 左边变量的数据类型。 【注】(1)赋值表达式也是表达式,可以出现在赋值运算符的右边。 例如,int k1=1,k2=2,k3; k3=k2
21、=k1=5; k3=k2=k1=5相当于k3=(k2=(k1=5); 结果k3、k2、k1均为5。 注:定义变量时的初值只能是常量(或常量组成的表达式) 下列定义语句是错误的:int k1=k2=k3=5; (2)赋值运算符的左边只能是变量,不能是表达式。 例如,int k1=1,k2; k2=k1+2=3; k2=k1+2=3相当于k2=(k1+2)=3),赋值运算符的左边是表达式。 【例】int a=2; 计算表达式“a+=a-=a*a”和变量a的值。 a+=a-=a*a相当于a+=(a-=a*a)。 先算a-=a*a,相当于a=a-(a*a),表达式计算结果是-2,a是-2。 再算a+=
22、(-2),相当于a=a+(-2),表达式计算结果是-4,a是-4。 3.10 逗号运算符与逗号表达式 一、逗号运算符 运算符是“,”; 双目中缀、运算对象是表达式。 运算规则是先计算左边的表达式,再计算右边的表达式。 运算结果是右边表达式的值;类型是右边表达式的数据类型。 结合性是自左向右的。15数据类型、运算符和表达式 二、逗号表达式 逗号表达式: 用逗号运算符连接两个表达式组成。 逗号表达式的值: 右边表达式的值。 倒数第2 逗号表达式的类型:右边表达式的数据类型。 倒数第1【注】不是所有的逗号都是逗号运算符。 例如,int k=5,j=6; printf(%d,%d,k,j+1);【说明
23、】运算符的优先级:+、-、+、-、强制 双目算术 赋值 逗号 各种赋值运算符是同级的、多个逗号运算符也是同级的。【例】 3+5,4+2,3+1 逗号表达式值为4。 int a,b,c; a=3,b=4,c=5 逗号表达式值为5,变量a、b、c值依次为3、4、5。 int a,b,c; c=(a=3,b=4) 赋值表达式值为4,变量a、b、c值依次为3、4、4。 int x,a; x=(a=3,3*6) 赋值表达式值为18,变量a、x值依次为3、18。 int x,a; x=a=3,3*6; 逗号表达式值为18,变量a、x值均为3。 int a=3,b=4,c=5; printf(%d,%d,%
24、dn,a,b,c); 输出结果是3,4,5 printf(%d,%d,%dn,(a,b,c),b,c); 输出结果是5,4,5【编程经验】不要自找麻烦,使用一些难以理解的表达式。 (1)int n=5,a=12; a%=(n%=2) 结果n为1、a为0、表达式为0。 (2)int a=16; a+=a-=a*=a 结果a为0、表达式为0。 16数据类型、运算符和表达式第三章习题答疑(一) 3.3 十进制带符号整数转换成八、十六进制整数。 通用验证程序清单如下: #include #include ”stdio.hstdio.h” void main() void main() int x= i
25、nt x= ? ? ; ; printf( printf(”%o %xn%o %xn”,x,x); ,x,x); /* /* 以八、十六进制输出以八、十六进制输出 */*/ 其中:? 是对应的带符号整数。 输出结果是4字节八进制整数 十六进制整数 17数据类型、运算符和表达式3.7 字符加密(用后4个字母) 提示:每个字母+4即是后4个字母 不能是W、X、Y、Z。3.9 已知各变量的值,计算某个表达式的值。 通用验证程序清单如下: #include #include ”stdio.hstdio.h” void main() void main() 每次换成新表达式每次换成新表达式 ? xx;
26、xx; xx=( xx=( 表达式表达式 ) ); /* /* 计算表达式值存入计算表达式值存入xx */xx */ printf( printf(”% %? ?nn”,xx);,xx); 其中:? 表达式对应的数据类型符(需事先判断) ? 表达式为整型,则?为int ?为d 表达式为实型,则?为float ?为f第三章习题答疑(二)18数据类型、运算符和表达式3.10 写出程序运行的输出结果,上机验证。 (计算4个整型表达式值输出)3.12 a=12,n=5,n=5。计算某表达式后,求变量a的值。 通用验证程序清单如下: #include #include ”stdio.hstdio.h” void main() void main() short a=12,n=5; short a=12,n=5; 表达式表达式; printf( printf(”%dn%dn”,a);,a); 其中:表达式 每次换成新表达式 输出结果是变量a的值。 第三章习题答疑(三)19数据类型、运算符和表达式