《c03数据类型表达式指针课件》由会员分享,可在线阅读,更多相关《c03数据类型表达式指针课件(70页珍藏版)》请在金锄头文库上搜索。
1、2024/9/91举例:举例: 【例】已知三条边【例】已知三条边a、b、c,求三角形面积。求三角形面积。计算三角形面积的海伦公式:计算三角形面积的海伦公式: 其中:其中:设定义:设定义:整型变量整型变量 a、b、c实型变量实型变量 s 、 area1c03-数据类型表达式指针2024/9/92程序如下:程序如下: # #include math.hinclude math.hmain( )main( ) int a,b,c; int a,b,c; float s,area ; float s,area ; scanf(%d, %d, %d,&a,&b,&c); scanf(%d, %d, %d
2、,&a,&b,&c); s =1.0/2*(a+b+c) ; s =1.0/2*(a+b+c) ; area = sqrt(s*(s-a)*(s-b)*(s-c) ; area = sqrt(s*(s-a)*(s-b)*(s-c) ; printf(area = %8.3f n,area) ; printf(area = %8.3f n,area) ; 程序运行情况如下:程序运行情况如下:3,4,5 area = 6.000 2c03-数据类型表达式指针2024/9/93本章主要内容本章主要内容l l本章介绍本章介绍C语言的基础,包括:语言的基础,包括: 数据类型数据类型 运算符和表达式运算符
3、和表达式l l均是程序设计的基本知识均是程序设计的基本知识l l为什么讨论为什么讨论这些知识这些知识?通常通常程序程序要对数据进行操作处理:要对数据进行操作处理:处理的对象是处理的对象是数据数据通过通过运算符和表达式运算符和表达式进行操作进行操作3c03-数据类型表达式指针2024/9/94例如:例如:【例】计算圆的面积,半径为【例】计算圆的面积,半径为 5 cm。 程序如下:程序如下:main( ) float r r, , areaarea ; ; r r=5 5 ; ; areaarea=3.143.14*r r*r r; ; printf (%fn , areaarea) ; 运算结果
4、是输出运算结果是输出运算结果是输出运算结果是输出圆的面积:圆的面积:圆的面积:圆的面积:78.50000078.500000程序中用到的数据:程序中用到的数据:r、area、5、3.14对数据进行的运算:对数据进行的运算:* 、=4c03-数据类型表达式指针2024/9/95C语言的数据类型语言的数据类型 C数据类型数据类型数组类型数组类型结构体类型结构体类型共用体类型共用体类型枚举类型枚举类型整型整型整型整型 字符型字符型字符型字符型 实实实实型型型型( (浮浮浮浮点点点点型型型型) ) 空类型空类型空类型空类型单精度型单精度型单精度型单精度型 双精度型双精度型双精度型双精度型 基本类型基本
5、类型基本类型基本类型指针类型指针类型构造类型构造类型本章讨论本章讨论本章讨论本章讨论基本类型数据基本类型数据基本类型数据基本类型数据5c03-数据类型表达式指针2024/9/962.2.1 整型数据整型数据 1整型数据的类型整型数据的类型 基本整型数据基本整型数据 int ,分配分配 2 Byte 短整型数据短整型数据 short int,分配分配 2 Byte 长整型数据长整型数据 long int,分配分配 4 Byte整型数据均以整型数据均以二进制补码二进制补码形式存储形式存储问题:问题:为什么要采用补码?为什么要采用补码?如何表示?如何表示?6c03-数据类型表达式指针2024/9/9
6、7计算机中正、负数的表示计算机中正、负数的表示 例如:例如:109 (1101101)2要区别:要区别:109 和和 109 方法是:方法是:将符号也数码化将符号也数码化即:即:正的符号正的符号 用用 0 表示表示 负的符号负的符号 用用 1 表示表示 计算机中的数表示方法是:计算机中的数表示方法是: 符号位符号位二进制数值二进制数值(以以 8bit 为例为例) 109 110 1101 0110 1101109 110 1101 1110 11017c03-数据类型表达式指针2024/9/98问题:计算机计算复杂化问题:计算机计算复杂化例如计算:例如计算: (-19)+(+22)1001 0
7、011 + 0001 0110解决的方法是:解决的方法是: 使用使用反码反码或或补码补码的表示方法(按前述的表示方法(按前述表示的编码称为表示的编码称为原码原码),即能将减法一律),即能将减法一律转换为加法。转换为加法。 需要判断符号是否相同:需要判断符号是否相同:如果相同,结果符号不变,并进行绝对值相加如果相同,结果符号不变,并进行绝对值相加如果相同,结果符号不变,并进行绝对值相加如果相同,结果符号不变,并进行绝对值相加如果不同,结果取绝对值大的数的符号,并进如果不同,结果取绝对值大的数的符号,并进如果不同,结果取绝对值大的数的符号,并进如果不同,结果取绝对值大的数的符号,并进行绝对值相减行
8、绝对值相减行绝对值相减行绝对值相减8c03-数据类型表达式指针2024/9/99原码、反码和补码原码、反码和补码l l正数正数:原码、反码、补码相同原码、反码、补码相同 符号位为符号位为0,数值为对应的二进制数。,数值为对应的二进制数。 109 01101101原原 = 01101101反反 = 01101101补补l l负数负数:原码原码符号位为符号位为1 1,数值为绝对值的二进制,数值为绝对值的二进制数。数。 10911101101原原反码反码符号位为符号位为1 1,数值为绝对值的二进制,数值为绝对值的二进制数各位变反。数各位变反。 10910010010反反 补码补码符号位为符号位为1
9、1,数值为绝对值的二进制,数值为绝对值的二进制数各位变反加数各位变反加1 1。10910010011补补9c03-数据类型表达式指针2024/9/9102. 有符号和无符号整型数据有符号和无符号整型数据 有符号的整型数据有符号的整型数据 signed int 无符号的整型数据无符号的整型数据 unsigned int区别是将区别是将最高位最高位看作符号位还是数据位看作符号位还是数据位例如:例如: 1111 1111 1010 1000作为作为有符号数有符号数使用时,最高为符号位使用时,最高为符号位为负数,值是:为负数,值是:- 88(再求一次补)(再求一次补)作为作为无符号数无符号数使用时,最
10、高为数据位使用时,最高为数据位为无符号的数,值是:为无符号的数,值是:6544810c03-数据类型表达式指针2024/9/911例如:例如:main( )main( ) unsigned int m; unsigned int m; m= m= 6544865448; ; printf(nm= printf(nm=%d%dn,m);n,m); printf(m= printf(m=%u%un,m);n,m); 输出结果:输出结果: m=-88m=65448按有符号数输出按有符号数输出按无符号数输出按无符号数输出11c03-数据类型表达式指针2024/9/912整型数据的类型及规定整型数据的类
11、型及规定l l方括号表示可选项方括号表示可选项l lint 分配分配2 Byte,long分配分配4 Byte类型名称类型名称类型名称类型名称类型符类型符类型符类型符bitbit取值范围取值范围取值范围取值范围整型整型整型整型( (短整型短整型短整型短整型) ) signed signed int int signed signed shortshort int int 1616- -2 215152 21515-1-1(-32768(-3276832767 )32767 )无符号整型无符号整型无符号整型无符号整型unsignedunsigned int int16160 0 2 21616-
12、1-1(0(065535 )65535 )长整型长整型长整型长整型 signed signed longlong int int3232-2-231312 23131- 1- 1无符号长整型无符号长整型无符号长整型无符号长整型 unsigned longunsigned long int int32320 0 2 23232-1-112c03-数据类型表达式指针2024/9/9132.2.2 实型数据实型数据 1实型数据的类型实型数据的类型 单精度实型数据单精度实型数据 float,分配分配4 Byte 双精度实型数据双精度实型数据double,分配,分配 8 Byte2实型数据的存储实型数据
13、的存储 单精度实型单精度实型单精度实型单精度实型指数部分指数部分指数部分指数部分小数部分小数部分小数部分小数部分 小数的符号位小数的符号位指数的符号位指数的符号位1101103 3 1.810 1.810-3-3 - - - -1231012310-6-6 - - - -0.1100.110-3-313c03-数据类型表达式指针2024/9/914实型数据的类型及规定实型数据的类型及规定 l lC C标准并未具体规定各种实型数据所占字节数,也不规标准并未具体规定各种实型数据所占字节数,也不规标准并未具体规定各种实型数据所占字节数,也不规标准并未具体规定各种实型数据所占字节数,也不规定具体小数和
14、指数部分的位数。定具体小数和指数部分的位数。定具体小数和指数部分的位数。定具体小数和指数部分的位数。l l一般而言,小数部分位数多,数据表示的有效数字多,一般而言,小数部分位数多,数据表示的有效数字多,一般而言,小数部分位数多,数据表示的有效数字多,一般而言,小数部分位数多,数据表示的有效数字多,精度就高;而指数部分位数多,则表示的数据范围更大。精度就高;而指数部分位数多,则表示的数据范围更大。精度就高;而指数部分位数多,则表示的数据范围更大。精度就高;而指数部分位数多,则表示的数据范围更大。有效数字的意义?有效数字的意义?类型类型类型类型类型符类型符类型符类型符ByteByte绝对值的范围绝
15、对值的范围绝对值的范围绝对值的范围有效数字有效数字有效数字有效数字单精度型单精度型单精度型单精度型 floatfloat4 41010-37 -37 10 1038387 78 8 位位位位双精度型双精度型双精度型双精度型 doubledouble8 81010-307 -307 101030830815151616位位位位14c03-数据类型表达式指针2024/9/9152.2.3 字符型数据字符型数据 l l字符型数据字符型数据char,分配分配 1 Byte l l字符型数据是指字母、数字、各种符号等字符型数据是指字母、数字、各种符号等用用ASCII值表示的字符值表示的字符l l例如例如
16、 a 是一个是一个char类型数据,称作字符类型数据,称作字符常量,存储:常量,存储:0 1 1 0 0 0 0 115c03-数据类型表达式指针2024/9/9162.3 常量、变量与标准函数常量、变量与标准函数 l主要内容:主要内容: 常量常量 变量变量16c03-数据类型表达式指针2024/9/9172.3.1 常量常量 l l在运行程序的过程中值保持不变的量在运行程序的过程中值保持不变的量1整型常量整型常量 十进制十进制十进制十进制:0909 八进制八进制八进制八进制:0707,以,以,以,以 0 0开头开头开头开头 十六进制十六进制十六进制十六进制:0909,AF/afAF/af,以
17、以以以 0 0x x或或或或 0 0X X 开头开头开头开头例如:例如:100 -8 0 +123100 -8 0 +123010 024 0100 073010 024 0100 0730 0x38 0x10 0X10 0XFF 0x0ax38 0x10 0X10 0XFF 0x0a17c03-数据类型表达式指针2024/9/9181. 整型常量整型常量l l整型常量的类型:整型常量的类型: 根据值大小默认类型。根据值大小默认类型。 整型常量后面加整型常量后面加l或或L,则认为是则认为是long int型型 例如:例如:123L、0L、432l、0x100l注意:注意:l l十六进制常量中可
18、以使用大写字母十六进制常量中可以使用大写字母AF,也可以使用小写字母也可以使用小写字母af。 l l八进制常量中不能出现数字八进制常量中不能出现数字 8 或或 9例如:例如:018、0921非法非法18c03-数据类型表达式指针2024/9/9192. 实型常量实型常量 十进制形式十进制形式十进制形式十进制形式 1.0 1. +12.0 -12.0 0.01.0 1. +12.0 -12.0 0.0 指数形式指数形式指数形式指数形式 1 1e3 1.8e-3 -123E-6 -.1E-3e3 1.8e-3 -123E-6 -.1E-3等价于:等价于:等价于:等价于:1101103 3 1.81
19、0 1.810-3-3 - - - -1231012310-6-6 - - - -0.1100.110-3-3指数只能是整数,而尾数则可以是整数也可以是指数只能是整数,而尾数则可以是整数也可以是小数小数 ,无论指数或尾数均不能省略,无论指数或尾数均不能省略例如:例如:1 1e e、E.5E.5、E-3E-3 非法非法实型常量的类型:默认为实型常量的类型:默认为doubledouble型,后面加型,后面加F F(或或f f),),则强调表示该数是则强调表示该数是float类型类型例如:例如:3.5f f、1e2F F 19c03-数据类型表达式指针2024/9/9203. 字符型常量字符型常量
20、l l可视字符常量可视字符常量可视字符常量可视字符常量 单引号括起来的单个可视字符单引号括起来的单个可视字符单引号括起来的单个可视字符单引号括起来的单个可视字符例如:例如:例如:例如: aa、A A 、+ + 、33、 等等等等 l l转义字符常量转义字符常量转义字符常量转义字符常量 单引号括起来的单引号括起来的单引号括起来的单引号括起来的 与与与与可视字符可视字符可视字符可视字符组合,例如:组合,例如:组合,例如:组合,例如:0000字符串结束标志字符串结束标志字符串结束标志字符串结束标志 n n回车换行回车换行回车换行回车换行 t t跳到下一个输出位置跳到下一个输出位置跳到下一个输出位置跳
21、到下一个输出位置 双引号字符双引号字符双引号字符双引号字符 dddddd dddddd为为为为1 1到到到到3 3位八进制数所代表的字符位八进制数所代表的字符位八进制数所代表的字符位八进制数所代表的字符 xhhxhh hhhh为为为为1 1到到到到2 2位十六进制数所代表的字符位十六进制数所代表的字符位十六进制数所代表的字符位十六进制数所代表的字符20c03-数据类型表达式指针2024/9/9214. 字符串常量字符串常量 l l用双引号括起的一个字符序列用双引号括起的一个字符序列 例如:例如:ABC、123、a、 nt nGood morningl l字符串常量的长度字符串常量的长度 : 所
22、包含的字符个数所包含的字符个数 l l字符串常量的存储方式:字符串常量的存储方式: n nGG o o o o d dmm o o r rn ni i n n g g 00a a00所占存储单元数:所占存储单元数:串长度串长度1例如:例如:字符串字符串结束标记结束标记21c03-数据类型表达式指针2024/9/9225. 符号常量符号常量 l l以标识符来代表的常量以标识符来代表的常量以标识符来代表的常量以标识符来代表的常量l l事先编译预处理命令事先编译预处理命令事先编译预处理命令事先编译预处理命令definedefine定义定义定义定义l l编译时先由系统替换为它所代表的常量,再进行编译时
23、先由系统替换为它所代表的常量,再进行编译时先由系统替换为它所代表的常量,再进行编译时先由系统替换为它所代表的常量,再进行编译编译编译编译例如:例如:例如:例如: # #define define LENLEN 2.52.5main( )main( ) float a,b; float a,b; a= 2*3.14 * a= 2*3.14 *LENLEN; ; b=3.14* b=3.14*LENLEN* *LENLEN; ; printf(a=%f,b=%fn,a,b); printf(a=%f,b=%fn,a,b); 定义符号常量定义符号常量定义符号常量定义符号常量使用符号常量使用符号常量使
24、用符号常量使用符号常量编译前系统进行替换编译前系统进行替换编译前系统进行替换编译前系统进行替换22c03-数据类型表达式指针2024/9/9235. 符号常量符号常量main( ) float a,b; a= 2*3.14 *2.5; b=3.14*2.5*2.5; printf(a=%f, b=%fn,a,b);define是编译预处理命令,必须以是编译预处理命令,必须以“#”开开头头编译预处理命令在第编译预处理命令在第7章讨论。章讨论。替换为替换为替换为替换为23c03-数据类型表达式指针2024/9/9242.3.2 变量变量 1. 变量的有关概念变量的有关概念l l在程序运行过程中,其
25、值改变的数据,称在程序运行过程中,其值改变的数据,称为变量,变量用标识符表示,称为为变量,变量用标识符表示,称为变量名变量名。l l变量必须变量必须“先定义后使用先定义后使用”l l系统为变量分配存储单元,存储变量的值。系统为变量分配存储单元,存储变量的值。 l l编写程序时通过变量名来存、取编写程序时通过变量名来存、取变量值变量值。a a510510变量值变量值变量值变量值为变量分配的为变量分配的为变量分配的为变量分配的存储单元存储单元存储单元存储单元变量名变量名变量名变量名例如:例如:有有变量变量a a它的值是它的值是5 5101024c03-数据类型表达式指针2024/9/9252. 变
26、量定义变量定义变量定义的一般格式:变量定义的一般格式: 数据类型说明符数据类型说明符 变量列表变量列表;例如:例如:int i, j; long k, m; float x,y; char ch1,ch2;必须使用合法的标识符作变量名必须使用合法的标识符作变量名不能使用关键字为变量命名不能使用关键字为变量命名25c03-数据类型表达式指针2024/9/9263. 变量的初始化:变量的初始化: 允许在说明变量的时候对变量赋初值。允许在说明变量的时候对变量赋初值。例如:例如:int a=5,b=10+2; double x=23.568,y ; char ch1=a,ch2=66,ch3=142;
27、 表示定义变量并对变量存储单元赋值。表示定义变量并对变量存储单元赋值。错误的初始化:错误的初始化: int a=3+b,b=5; float m=n=23.16; 26c03-数据类型表达式指针2024/9/9272.5 运算符和表达式运算符和表达式l l主要内容:主要内容: 算术运算符和算术表达式算术运算符和算术表达式 赋值运算符和赋值表达式赋值运算符和赋值表达式 关系运算符和关系表达式关系运算符和关系表达式 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 位运算符和位运算表达式位运算符和位运算表达式 条件运算符和条件表达式条件运算符和条件表达式 逗号运算符和逗号表达式逗号运算符和逗号表达式
28、其他运算符及其运算其他运算符及其运算27c03-数据类型表达式指针2024/9/928运算符的有关概念运算符的有关概念l l作用:作用: 对运算对象完成规定的操作运算对运算对象完成规定的操作运算l l类型:类型: 按运算对象分:按运算对象分:l l单目、双目、三目单目、双目、三目单目、双目、三目单目、双目、三目 按功能分:按功能分:l l算术、赋值、关系、逻辑算术、赋值、关系、逻辑算术、赋值、关系、逻辑算术、赋值、关系、逻辑l l条件、逗号、位、其他条件、逗号、位、其他条件、逗号、位、其他条件、逗号、位、其他28c03-数据类型表达式指针2024/9/929运算符的优先级和结合性运算符的优先级
29、和结合性l l优先级优先级 指各种运算符号的运算优先顺序指各种运算符号的运算优先顺序指各种运算符号的运算优先顺序指各种运算符号的运算优先顺序例如:例如:例如:例如:算术运算优先于关系运算算术运算优先于关系运算算术运算优先于关系运算算术运算优先于关系运算 算术运算中先算术运算中先算术运算中先算术运算中先 * / * / * / * / 后后后后 + - + - + - + -l l结合性结合性 指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向 分为:从左向右分为:从左向右分为:从左向右分为:从左向右( (左结合左结合左结合左
30、结合) )和从右向左和从右向左和从右向左和从右向左( (右结合右结合右结合右结合) )例如:例如:例如:例如:算术运算符为算术运算符为算术运算符为算术运算符为左结合左结合左结合左结合 a-ba-b+ +4 4 赋值运算符为赋值运算符为赋值运算符为赋值运算符为右结合右结合右结合右结合 a= b = 5a= b = 5( C C语言规定见教材语言规定见教材语言规定见教材语言规定见教材 P41 P41 表表表表2.52.5)29c03-数据类型表达式指针2024/9/930本章涉及的运算符本章涉及的运算符+ - * / % + - * / % + - * / % + - * / % + - + -+
31、 - + -+ - + -+ - + -= += -= *= /= %= += -= *= /= %= += -= *= /= %= += -= *= /= %=&= |= = = = = = = = = = = = != & | & | & | & | ! ! ! !& | & | & | & | ?:?:?:?:, , , ,& & & & sizeof sizeof sizeof sizeof ( ( ( (数据类型标识符数据类型标识符数据类型标识符数据类型标识符) ) ) )类型类型类型类型种类种类种类种类算术运算符算术运算符算术运算符算术运算符赋值运算符赋值运算符赋值运算符赋值运算符
32、关系运算符关系运算符关系运算符关系运算符逻辑运算符逻辑运算符逻辑运算符逻辑运算符位运算符位运算符位运算符位运算符条件运算符条件运算符条件运算符条件运算符逗号运算符逗号运算符逗号运算符逗号运算符其他运算符其他运算符其他运算符其他运算符30c03-数据类型表达式指针2024/9/931表达式的有关概念表达式的有关概念l l什么是表达式什么是表达式由由运算符运算符将运算对象连接成的式子,它将运算对象连接成的式子,它描述了一个具体的求值运算过程。描述了一个具体的求值运算过程。l l计算表达式的值计算表达式的值按照运算符的运算规则求值按照运算符的运算规则求值求值时注意运算符的优先级和结合性求值时注意运算
33、符的优先级和结合性l l表达式值的类型表达式值的类型自动转换自动转换强制转换强制转换 31c03-数据类型表达式指针2024/9/932例如:例如:l l表达式:表达式:150+b*2-12.456 b=(+a)-2a /= a *= (a = 2) f=abc -a |+b&c+ max=ab ? a : b a=3,a+=3,a*a 1/(float)a+6 32c03-数据类型表达式指针2024/9/933算术运算算术运算l l算术运算符的优先级算术运算符的优先级 ( ) + - + - - + - * / % + - - 同级同级 同级同级 同级同级 单目单目单目单目 双目双目双目双目
34、 高高高高 低低低低l l没有乘方运算符没有乘方运算符没有乘方运算符没有乘方运算符,要计算,要计算,要计算,要计算a a3 3要写作要写作要写作要写作 a*a*a a*a*a 的连乘,的连乘,的连乘,的连乘,或用标准库函数或用标准库函数或用标准库函数或用标准库函数 pow(apow(a, 3), 3)l l “ “/ /” ”的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数
35、据个整型数据相除时,运算结果也是整型数据 l l“ “%” ”要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两数相除的余数,余数的符号与被除数的符号相同数相除的余数,余数的符号与被除数的符号相同数相除的余数,余数的符号与被除数的符号相同数相除的余数,余数的符号与被除数的符号相同33c03-数据类型表达式指针2024/9/934自增自减运算自增自减运算l l+ + -是是单目运算符单目运算符l l有前缀和后缀有前缀和后缀两种形式两种形式 前缀形式前缀形式: : 先自增先自增( (自减自减) )
36、再引用;再引用;后缀形式后缀形式: : 先引用再自增先引用再自增( (自减自减) );l l功能:功能: 前缀形式前缀形式 + + a a 等价于等价于 a = a + 1a = a + 1 - a a 等价于等价于 a = a a = a 1 1 后缀形式后缀形式 a +a + 等价于等价于 a = a + 1a = a + 1 a a - 等价于等价于 a = a a = a 1 1表达式的值会不同表达式的值会不同34c03-数据类型表达式指针2024/9/935例如:例如:当当 a5 时时 +a 表达式的值为表达式的值为 6,且且 a6 a+ 表达式的值为表达式的值为5 ,且且 a6 b
37、=+a 等价于等价于 a=a+1; b=a 表达式的值为表达式的值为6,且,且 a=6, b=6 b=a+ 等价于等价于 b=a; a=a+1 表达式的值为表达式的值为5,且,且 a=6, b=5 35c03-数据类型表达式指针2024/9/936说明:说明:l l+ 和和和和 - - 的运算对象只能是变量(或运算结果是的运算对象只能是变量(或运算结果是的运算对象只能是变量(或运算结果是的运算对象只能是变量(或运算结果是变量的表达式)变量的表达式)变量的表达式)变量的表达式), , 不能是常量(或运算结果是数不能是常量(或运算结果是数不能是常量(或运算结果是数不能是常量(或运算结果是数值的表达
38、式)。值的表达式)。值的表达式)。值的表达式)。 例如:例如:例如:例如: 5+5+、( (a+2)+a+2)+ 不合法。不合法。不合法。不合法。 l l具有右结合性,结合方向为从右到左。具有右结合性,结合方向为从右到左。具有右结合性,结合方向为从右到左。具有右结合性,结合方向为从右到左。例如:例如:例如:例如: a+a+ 等价于等价于等价于等价于 -( -(a+)a+) l l如果有多个运算符连续出现时,如果有多个运算符连续出现时,如果有多个运算符连续出现时,如果有多个运算符连续出现时,C C系统尽可能多系统尽可能多系统尽可能多系统尽可能多的从左到右将字符组合成一个运算符的从左到右将字符组合
39、成一个运算符的从左到右将字符组合成一个运算符的从左到右将字符组合成一个运算符例如:例如:例如:例如: i + ji + j 等价于等价于等价于等价于 ( ( i+)+ji+)+j -i+-j-i+-j 等价于等价于等价于等价于 -( -(i+)+(-j)i+)+(-j) 36c03-数据类型表达式指针2024/9/937 (1) 自自增增、自自减减运运算算只只能能用用于于变变量量,不不能能用用于于常常量或表达式。量或表达式。 (2) 自自增增、自自减减运运算算比比等等价价的的赋赋值值语语句句生生成成的的目目标标代码更代码更高效高效。 (3) 自增、自减运算常用于循环语句中,使循环控自增、自减运
40、算常用于循环语句中,使循环控制变量自动加或减制变量自动加或减1;还可用于指针变量,使指针指;还可用于指针变量,使指针指向下一个或上一个地址。向下一个或上一个地址。 (4) 表表达达式式中中包包含含有有自自增增、自自减减运运算算时时,特特别别容容易易出错,务请小心。出错,务请小心。 请特别注意:请特别注意:37c03-数据类型表达式指针2024/9/938例例如如,i=1,(+i)+(+i)+(+i)的的值值为为多多少少呢呢?可可能能计计算算出出是是9(=2+3+4),其其实实这这是是错错误误的的。实实际际上上计计算算时时 先先 对对 整整 个个 表表 达达 式式 扫扫 描描 , i 先先 自自
41、 增增 3次次 , 由由1234,因此计算结果应为,因此计算结果应为12(=4+4+4)。 (i+)+(i+)+(i+)的值又是多少呢?分析同上,的值又是多少呢?分析同上,应为应为3,当然表达式计算完成后,当然表达式计算完成后i的值同样改变为的值同样改变为4。 38c03-数据类型表达式指针2024/9/939include stdio.hmain( ) int i, j; i=j=5; printf(i+=%d, j=%dn, i+, j); printf(+i=%d, j=%dn, +i, j); printf(i+=%d, j=%dn, i+, j); printf(+i=%d, j=%
42、dn, +i, j); printf(i=%d, j=%dn, i, j); 39c03-数据类型表达式指针2024/9/940main( ) int a=5; printf(%d %dn,a,a+ ); 说明(续):说明(续):l l对函数参数的求值顺序:对函数参数的求值顺序: Turbo C系统先计算最右边的参数值,系统先计算最右边的参数值,再依次计算左面的参数值。再依次计算左面的参数值。 【例【例2.5】有多个函数参数且为同一变量自增】有多个函数参数且为同一变量自增的运算处理。的运算处理。 输出结果:输出结果: 6 540c03-数据类型表达式指针2024/9/942赋值运算赋值运算l
43、l赋值运算符赋值运算符( (右结合)右结合) = += - -= *= /= %= &= |= = = = l l赋值表达式赋值表达式 将将表达式的值表达式的值存入存入变量变量对应的内存单元中对应的内存单元中m=12b=(+a)-2 m%=3+n 等价于等价于 m=m%(3+n) x *= (x = 5)42c03-数据类型表达式指针2024/9/943说明:说明:l l赋值号左边必须是变量,右边可以是赋值号左边必须是变量,右边可以是C语言语言任意合法的表达式任意合法的表达式例如:例如:n= t +210 等价于:等价于:a= (b=( (b*c)10) )l l赋值号与数学中的等号含义不同赋
44、值号与数学中的等号含义不同例如:例如:数学中数学中 a=b 等价于等价于 b=a C语言中语言中 a=b 不等价于不等价于 b=a43c03-数据类型表达式指针2024/9/944关系运算关系运算l l关系运算符关系运算符关系运算符关系运算符 ( ( ( (左结合)左结合)左结合)左结合) = = = = != != 较高较高较高较高 较低较低较低较低l l关系表达式关系表达式关系表达式关系表达式 用关系运算符将运算对象连接成的式子用关系运算符将运算对象连接成的式子用关系运算符将运算对象连接成的式子用关系运算符将运算对象连接成的式子 例如:例如:例如:例如:1212 =c c 等价于等价于等价
45、于等价于 a = ( b=c )a = ( b=c ) 与与与与 ( (a=b)=c a=b)=c 不等价不等价不等价不等价l l关系运算符优先于赋值,低于算术关系运算符优先于赋值,低于算术关系运算符优先于赋值,低于算术关系运算符优先于赋值,低于算术44c03-数据类型表达式指针2024/9/945说明:说明:l l关系运算的结果应该是关系运算的结果应该是逻辑值逻辑值。C语言用语言用数值用数值用 1 表示表示逻辑真逻辑真, 0 表示表示逻辑假逻辑假例如:例如: 75 的值是的值是 1,57 的值是的值是 0 ab的值是的值是 0, a= z l l逻辑运算符的优先级逻辑运算符的优先级 和结合性
46、:和结合性: !是单目运算符,是单目运算符,右结合右结合,高于算术,高于算术 & 和和 | 是双目运算符,是双目运算符,左结合左结合,高于,高于赋值运算符,低于关系运算符赋值运算符,低于关系运算符47c03-数据类型表达式指针2024/9/948逻辑运算规则逻辑运算规则l l从左到右依次进行逻辑计算从左到右依次进行逻辑计算运算对象为运算对象为非非0 0表示表示逻辑真逻辑真运算对象为运算对象为 0 0 表示表示逻辑假逻辑假l l逻辑运算的结果为逻辑运算的结果为 0 0 或或 1 1例如设:例如设:a=15,b=0,c=-2 a & b & c 结果为结果为0 a | b | c 结果为结果为1
47、(a+c) | b & c 结果为结果为148c03-数据类型表达式指针2024/9/949逻辑运算规则(续)逻辑运算规则(续)l l运算按照运算按照从左至右从左至右的顺序进行,一旦能够的顺序进行,一旦能够确定逻辑表达式的值,就立即结束运算确定逻辑表达式的值,就立即结束运算逻辑运算的短路性质逻辑运算的短路性质例如例如设:设:a=1,b=0,c=-2a & b & c(a+) | + b& -c为为 0,运算终止,表达式,运算终止,表达式值值为为 0为非为非0,运算终止,表达式值为,运算终止,表达式值为 1且且a为为2,b为为0,c为为-2 (b,c保持原值保持原值)49c03-数据类型表达式指
48、针2024/9/950关系与逻辑运算符的应用关系与逻辑运算符的应用l l表示数学公式表示数学公式abc l l判断判断a, b, c三条线段能否组成一个三角形三条线段能否组成一个三角形 l la, b不同时为负不同时为负 a+bc & a+cb & b+caa=0 | b=0!(a0 & b0) ( (a=0)|(a=0&b=0&b=0)a=0)|(a=0&b=0&b=0)ab & bc50c03-数据类型表达式指针2024/9/951位运算符位运算符 & | & | 位逻辑运算符位逻辑运算符移位运算符移位运算符单目单目单目单目l l位运算符的运算对象只能是位运算符的运算对象只能是整型数据整型
49、数据或或字字符型数据符型数据,不能是实型数据,不能是实型数据l l运算对象一律按二进制补码参加运算,并运算对象一律按二进制补码参加运算,并按位进行运算按位进行运算l l位运算的结果是一个整型数据位运算的结果是一个整型数据低于单目、算术运算符,低于单目、算术运算符,高于其他运算符高于其他运算符低于单目、算术和关系运低于单目、算术和关系运算符,高于其他运算符算符,高于其他运算符51c03-数据类型表达式指针2024/9/952位逻辑运算符的运算规则位逻辑运算符的运算规则 l l假设假设ai和和bi均是一个二进制位(均是一个二进制位(bit) 运算对象运算对象运算对象运算对象逻辑运算结果逻辑运算结果
50、逻辑运算结果逻辑运算结果a ai ib bi ia ai i&b&bi ia ai i|b|bi ia ai i bbi iaai i0 00 00 00 00 01 10 01 10 01 11 11 11 10 00 01 11 10 01 11 11 11 10 00 0例如:例如:假设假设a=10,b=010 求求a&b、 a | b、 ab、a52c03-数据类型表达式指针2024/9/953程序如下:程序如下: main( )main( ) int a=10, b=010; int a=10, b=010; printf(%d %dn, printf(%d %dn, a&ba&b,
51、 a|b);, a|b); printf(%d %dn, ab, printf(%d %dn, ab, aa); ); 输出结果:输出结果:8 108 102 -112 -11 0000 0000 0000 1010 0000 0000 0000 1010 & 0000 0000 0000 1000 & 0000 0000 0000 1000 0000 0000 0000 1000 0000 0000 0000 1000即:即:即:即:a&ba&b的值是的值是的值是的值是8 8 0000 0000 0000 1010 0000 0000 0000 1010 1111 1111 1111 010
52、1 1111 1111 1111 0101即:即:即:即: a a的值是的值是的值是的值是- - - -111153c03-数据类型表达式指针2024/9/954移位运算移位运算l l例如:例如:ab-1 等价于等价于 (a+8)(b-1) 例如:例如:假设假设a=10,b=2,求求ab-1 main( ) int a=10, b=2; printf(%d %dn, abab-1a+8b-1); 输出结果:输出结果:40 940 9请自行分析请自行分析请自行分析请自行分析运行结果运行结果运行结果运行结果54c03-数据类型表达式指针2024/9/955条件表达式运算条件表达式运算l l条件运算
53、符:条件运算符:? :l l条件表达式的一般形式条件表达式的一般形式 表达式表达式1 ? 表达式表达式2 : 表达式表达式3例如:例如:m=10 & b-20 ? a : b x=3+a5 ? 100 : 200 l lC语言中唯一的语言中唯一的三目运算符三目运算符,要正确区分用,要正确区分用 ?和和 :分隔的表达式分隔的表达式l l涉及条件运算符的优先级与结合性涉及条件运算符的优先级与结合性55c03-数据类型表达式指针2024/9/956条件运算符优先级条件运算符优先级l l条件运算符优先级高于赋值、逗号运算符,条件运算符优先级高于赋值、逗号运算符,低于其他运算符低于其他运算符 例如:例如
54、: m=10 & b-20 ? a : b x=3+a5 ? 100 : 200等价于:等价于:(m=10 & b-20) ? a : b等价于:等价于:x= ( 3+a5 ) ? 100 : 200 )56c03-数据类型表达式指针2024/9/957条件运算符的结合性条件运算符的结合性 l l条件运算符具有条件运算符具有右结合性右结合性l l当一个表达式中出现多个条件运算符时,当一个表达式中出现多个条件运算符时,应该将位于最右边的问号与离它最近的冒应该将位于最右边的问号与离它最近的冒号号配对配对,并按这一原则正确区分各条件运,并按这一原则正确区分各条件运算符的运算对象。算符的运算对象。 例
55、如:例如:wx ? x+w : xy ? x : y 与与 wx ? x+w : ( xy ? x : y) 等价等价 与与 (wx ? x+w : xy) ? x : y 不等价不等价 57c03-数据类型表达式指针2024/9/958逗号表达式运算逗号表达式运算l l逗号表达式的一般形式逗号表达式的一般形式 表达式表达式1,表达式,表达式2,表达式,表达式nl l 逗号表达式的值逗号表达式的值 从左向右,依次对表达式求值,最后得到从左向右,依次对表达式求值,最后得到从左向右,依次对表达式求值,最后得到从左向右,依次对表达式求值,最后得到表表表表达式达式达式达式n n 的值就是逗号表达式的值
56、的值就是逗号表达式的值的值就是逗号表达式的值的值就是逗号表达式的值例如:例如:例如:例如: a=5, a+, a* 3 表达式表达式表达式表达式值为值为值为值为 18 18,且,且,且,且a=6 a=6 t=1, t+5, t+ 表达式表达式表达式表达式值为值为值为值为 1 1,且,且,且,且t=2 t=2 x=(a=3*5, a*4 ) 赋值表达式赋值表达式赋值表达式赋值表达式的值为的值为的值为的值为6060,且,且,且,且x=60, a=15x=60, a=1558c03-数据类型表达式指针2024/9/959取地址运算符取地址运算符 & 为单目运算符为单目运算符 运算对象只能是变量运算对
57、象只能是变量 运算结果是变量的存储地址运算结果是变量的存储地址 例如有定义例如有定义:int a , student;char ch;可以对变量可以对变量a、ch、student 进行进行&运算:运算:&a &ch &student59c03-数据类型表达式指针2024/9/960长度运算符长度运算符 sizeof 为单目运算符为单目运算符 运算对象只能是运算对象只能是变量名变量名或或数据类型标识符数据类型标识符 运算结果为该变量或该数据类型的长度运算结果为该变量或该数据类型的长度 main( ) int a=5; double x; printf(%d %d ,sizeof(intint),
58、sizeof(a a); printf(%d %d ,sizeof(doubledouble),sizeof(x x); printf(%d %dn,sizeof(floatfloat),sizeof(charchar); 输出结果:输出结果:2 2 2 2 8 88 8 4 4 1 160c03-数据类型表达式指针2024/9/961运算中数据类型的转换运算中数据类型的转换1 数据类型的自动转换数据类型的自动转换l l转换原则:转换原则: 自动将精度低、表示范围小的自动将精度低、表示范围小的运算对象类型向精度高、表示范围大的运算运算对象类型向精度高、表示范围大的运算对象类型转换对象类型转换
59、char, shortchar, shortdoubledoublelonglongfloatfloatunsignedunsignedintint高精度高精度高精度高精度低精度低精度低精度低精度例如有定义:例如有定义:int a; char ch;表达式:表达式:a-ch*2+35La-ch*2+ 35.61c03-数据类型表达式指针2024/9/962赋值运算中的类型转换赋值运算中的类型转换 l l = 小数部分自动补小数部分自动补小数部分自动补小数部分自动补0 0 l l = 自动舍去实型表达式的小数部分(自动舍去实型表达式的小数部分(自动舍去实型表达式的小数部分(自动舍去实型表达式的小
60、数部分(注意不进行注意不进行注意不进行注意不进行四舍五入四舍五入四舍五入四舍五入) l l = l l = 自动截取表达式值的低字节赋值,舍去高字节自动截取表达式值的低字节赋值,舍去高字节自动截取表达式值的低字节赋值,舍去高字节自动截取表达式值的低字节赋值,舍去高字节l l = l l = 自动给高字节补自动给高字节补自动给高字节补自动给高字节补0 0 或或或或补补补补1 162c03-数据类型表达式指针2024/9/963数据类型的强制转换数据类型的强制转换 l l强制转换的一般形式强制转换的一般形式 (类型名类型名) 表达式表达式例如:例如: (int)( b+3*x)%3 1/(floa
61、t)a+6l l注意:注意: (float) 22/5 与与 (float) (22/5) 不同不同l l错误的类型转换:错误的类型转换: (int) b=a+5 b= int (3*a) 63c03-数据类型表达式指针2024/9/9642.4 指针和指针变量指针和指针变量 main() main() main() main()float x;float x;float x;float x; int y; int y; int y; int y; 2.4.1 2.4.1 指针和指针变量的概念指针和指针变量的概念指针和指针变量的概念指针和指针变量的概念变量的两个物理意义变量的两个物理意义 20
62、0020002000200020012001200120012002200220022002200320032003200320042004200420042005200520052005x x x xy y y y变量的内容变量的内容变量的地址变量的地址64c03-数据类型表达式指针2024/9/9652.4 指针和指针变量指针和指针变量 main() main() main() main()int a,b,c;int a,b,c;int a,b,c;int a,b,c; a=5; a=5; a=5; a=5; b=3; b=3; b=3; b=3; c=a c=a c=a c=a +b;+
63、b;+b;+b; 2.4.1 2.4.1 指针和指针变量的概念指针和指针变量的概念指针和指针变量的概念指针和指针变量的概念200020002000200020012001200120012002200220022002200320032003200320042004200420042005200520052005a a a ab b b bc c c c5直接将整数直接将整数直接将整数直接将整数 5 5 5 5 存入变量存入变量存入变量存入变量 a a a a 3直接将整数直接将整数直接将整数直接将整数 3 3 3 3 存入变量存入变量存入变量存入变量 b b b b8直接直接直接直接将变量将
64、变量将变量将变量 a a a a、b b b b 的值取的值取的值取的值取出,相加后存入变量出,相加后存入变量出,相加后存入变量出,相加后存入变量 c c c c 利用变量名利用变量名利用变量名利用变量名存取数据的方式存取数据的方式存取数据的方式存取数据的方式称为称为称为称为“ “直接存取直接存取直接存取直接存取” ”方式。方式。方式。方式。65c03-数据类型表达式指针2024/9/966 C C 语言语言语言语言还提供了对还提供了对还提供了对还提供了对内存单元的内存单元的内存单元的内存单元的“ “间接存取间接存取间接存取间接存取” ”方式方式方式方式p p20002000200020002
65、001200120012001200220022002200220032003200320032004200420042004200520052005200520062006200620062007200720072007a a a ab b b bc c c c532004a a a a和和和和b b b b相加的结果相加的结果相加的结果相加的结果( ( ( (* * * *p p p p= = = =a a a a+ + + +b b b b) ) ) )存放存放存放存放到变量到变量到变量到变量p p p p所指向的所指向的所指向的所指向的内存单元内存单元内存单元内存单元中去。中去。中去。
66、中去。此时此时此时此时c c c c称为指针变量称为指针变量称为指针变量称为指针变量p p p p的的的的目标变量。目标变量。目标变量。目标变量。p p20042004c cp=&c8 main()main()main()main()int a=5,b=3,c,*p;int a=5,b=3,c,*p;int a=5,b=3,c,*p;int a=5,b=3,c,*p; p = &c;p = &c;p = &c;p = &c; *p = a + b; *p = a + b; *p = a + b; *p = a + b; 2.4 指针和指针变量指针和指针变量2.4.1 2.4.1 指针和指针变量
67、的概念指针和指针变量的概念指针和指针变量的概念指针和指针变量的概念 变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针变量的地址称为变量的指针 存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量存放地址的变量称为指针变量66c03-数据类型表达式指针2024/9/967 main()main() int a,*p int a,*p=&a=&a; ; float x,*q float x,*q=&x=&x; ; 20002000200020002001200120012001200220022002200220032003200320032004
68、20042004200420052005200520052006200620062006200720072007200720082008200820082009200920092009a a a ap p p px x x xq q q q20042.4 指针和指针变量指针和指针变量2.4.2 2.4.2 指针变量的定义指针变量的定义指针变量的定义指针变量的定义2000 main() main() main() main()int a,*p;int a,*p;int a,*p;int a,*p; float x,*q; float x,*q; float x,*q; float x,*q; p
69、 p p p = &a= &a= &a= &a; ; ; ; q q q q = &x= &x= &x= &x; ; ; ; 指针变量定义的形式指针变量定义的形式指针变量定义的形式指针变量定义的形式指针变量初始化指针变量初始化指针变量初始化指针变量初始化67c03-数据类型表达式指针2024/9/968 main()main() int a,*p int a,*p=&a=&a; ; float x,*q float x,*q=&x=&x; ; * *p p = 5;= 5; printf( printf(a+3=%dn,a+3=%dn,*p*p+3);+3); 间接存取运算间接存取运算间接存取
70、运算间接存取运算2000200020002000200120012001200120022002200220022003200320032003200420042004200420052005200520052006200620062006200720072007200720082008200820082009200920092009a a a ap p p px x x xq q q q20042.4 指针和指针变量指针和指针变量2.4.3 2.4.3 指针的基本运算指针的基本运算指针的基本运算指针的基本运算2000*p = &a; main() main() main() main()in
71、t a,*p;int a,*p;int a,*p;int a,*p; float x,*q; float x,*q; float x,*q; float x,*q; p p p p = &a= &a= &a= &a; ; ; ; q q q q = &x= &x= &x= &x; ; ; ; 赋值运算赋值运算赋值运算赋值运算568c03-数据类型表达式指针2024/9/969方法方法方法方法1 1 1 1:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的:目标变量值不变,改变指针变量的指向求解。指向求解。指向求解。指向求解。 main( ) mai
72、n( ) main( ) main( ) int a,b, int a,b, int a,b, int a,b,* * * *p1p1p1p1, , , ,* * * *p2p2p2p2, , , ,* * * *p p p p; ; ; ; p1p1p1p1= = = =& & & &a;a;a;a;p2p2p2p2= = = =& & & &b; b; b; b; scanf( scanf( scanf( scanf(%d%d%d%d%d%d%d%d, , , ,p1p1p1p1, , , ,p2p2p2p2);););); if( if( if( if(* * * *p1p1p1p1 *
73、 * * *p2p2p2p2) ) ) ) p p p p= = = =p1p1p1p1; ; ; ; p1p1p1p1= = = =p2p2p2p2; ; ; ; p2p2p2p2= = = =p p p p; printf( printf( printf( printf(a=%d,b=%dna=%d,b=%dna=%d,b=%dna=%d,b=%dn,a,b);,a,b);,a,b);,a,b); printf(printf(printf(printf(max=%d,min=%dnmax=%d,min=%dnmax=%d,min=%dnmax=%d,min=%dn, , , ,* * *
74、*p1p1p1p1, , , ,* * * *p2p2p2p2);););); a ab bp1p1p2p2p p6 68 8a=6,b=8a=6,b=8max=8,min=6max=8,min=62.4 指针和指针变量指针和指针变量【例【例】输入输入a、b两个整数,两个整数,使用指针变量按大小顺序输出使用指针变量按大小顺序输出这两个整数。这两个整数。 69c03-数据类型表达式指针2024/9/970方法方法方法方法2 2 2 2:利用指针变量直接改变目标变量的值:利用指针变量直接改变目标变量的值:利用指针变量直接改变目标变量的值:利用指针变量直接改变目标变量的值求解。求解。求解。求解。 m
75、ain() main() main() main() int a,b,t, int a,b,t, int a,b,t, int a,b,t,* * * *p1p1p1p1, , , ,* * * *p2p2p2p2; ; ; ; p1p1p1p1= = = =& & & &a;a;a;a;p2p2p2p2= = = =& & & &b; b; b; b; scanf( scanf( scanf( scanf(%d%d%d%d%d%d%d%d, , , ,p1p1p1p1, , , ,p2p2p2p2);););); if( if( if( if(* * * *p1p1p1p1 * * * *p
76、2p2p2p2) ) ) ) t= t= t= t=* * * *p1p1p1p1; ; ; ; * * * *p1p1p1p1= = = =* * * *p2p2p2p2; ; ; ; * * * *p2p2p2p2=t;=t;=t;=t; printf( printf( printf( printf(a=%d,b=%dna=%d,b=%dna=%d,b=%dna=%d,b=%dn,a,b);,a,b);,a,b);,a,b); printf(printf(printf(printf(max=%d,min=%dnmax=%d,min=%dnmax=%d,min=%dnmax=%d,min=%dn, , , ,* * * *p1p1p1p1, , , ,* * * *p2p2p2p2);););); a a、*p1*p1b b、*p2*p2p1p1p2p2t t6 68 8a=8,b=6a=8,b=6max=8,min=6max=8,min=62.4 指针和指针变量指针和指针变量6 68 86 670c03-数据类型表达式指针