第2章+数据类型运算符和表达式.ppt

上传人:本田雅阁 文档编号:3423301 上传时间:2019-08-23 格式:PPT 页数:98 大小:1.28MB
返回 下载 相关 举报
第2章+数据类型运算符和表达式.ppt_第1页
第1页 / 共98页
第2章+数据类型运算符和表达式.ppt_第2页
第2页 / 共98页
第2章+数据类型运算符和表达式.ppt_第3页
第3页 / 共98页
第2章+数据类型运算符和表达式.ppt_第4页
第4页 / 共98页
第2章+数据类型运算符和表达式.ppt_第5页
第5页 / 共98页
点击查看更多>>
资源描述

《第2章+数据类型运算符和表达式.ppt》由会员分享,可在线阅读,更多相关《第2章+数据类型运算符和表达式.ppt(98页珍藏版)》请在三一文库上搜索。

1、第2章 数据类型、运算符与表达式,C语言程序设计基础,复习回顾,C语言的特点 C语言程序格式特点及基本结构 C语言的上机步骤 .C , .obj , .exe 的区别,一个简单的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:“); scanf(“%d%d“, /*输出x和y相加之和*/ ,本章内容提要,基本数据类型; 常

2、量和变量; 标识符命名; 常用运算符和表达式; 运算符的优先级与结合性 变量的地址和指向变量的指针,本章重点,C语言的数据类型及其使用范围 字符串常量与字符常量的区别 转义字符的使用 C语言中的运算符和表达式,及各类数据的混合运算 掌握变量的地址和指向变量的指针,本章难点,不同数据类型的使用范围 赋值运算符和赋值表达式 数据的隐式转换问题 逗号运算符和逗号表达式 运算符的优先级问题 指针变量,第一讲 数据类型,C程序常见符号分类,关键字(Keyword) 又称为保留字,C语言中预先规定的具有固定含义的一些单词 标识符(Identifier) 系统预定义标识符 用户自定义标识符 运算符(Oper

3、ator) 34种,详见附录B 分隔符(Separator) 空格、回车/换行、逗号等 其它符号 大花括号“”和“”通常用于标识函数体或者一个语句块 “/*”和“*/”是程序注释所需的定界符 数据(Data) 变量(Variable) 常量(Constant),2.1 C语言的数据类型(Data Type),数据为什么要区分类型? 不同类型的数据代表不同的 数据表示形式 合法的取值范围 占用内存空间大小 可参与的运算种类 从基本数据类型到抽象数据类型 无数据类型 基本数据类型 构造数据类型 抽象数据类型,数据类型决定: 1. 数据占内存字节数 2. 数据取值范围 3. 其上可进行的操作,数据类

4、型,整型,字符型,实型,有,无,有,3.4e-383.4e38,有,有,说明:数据类型所占字节数随机器硬件不同而不同,上表以IBM PC机为例: 请看int和unsigned int,基本数据类型,标识符 定义:用来标识变量、常量、函数等的字符序列 组成: 只能由字母、数字、下划线组成,且第一个字母必须是字母或下划线 大小写敏感 不能使用关键字 不可以是数字开头 长度:最长32个字符 命名原则: 见名知意 不宜混淆 如 l 与 I , o 与 0,2.2 常量与变量,例:判断下列标识符号合法性 sum Sum M.D.John day Date 3days student_name #33 l

5、otus_1_2_3 char ab _above $123,M.D.John,3days,#33,char,$123,ab,-标识符,下划线和大小写通常用来增强可读性 variablename variable_name VariableName, variableName 某些功能的变量采用习惯命名 如:for语句所采用的循环变量习惯用i, j, k,Windows 风格,UNIX 风格,一般用大写字母 是宏定义预处理命令,不是C语句 直接常量: 整型常量 请点击: 实型常量 请点击: 字符常量 请点击: 字符串常量 请点击:,如 #define PRICE 30,定义:程序运行时其值不能

6、改变的量(即常数) 分类: 符号常量:用标识符代表常量 定义格式: #define 符号常量 常量,例 符号常量举例(ch2_1.c) #define PRICE 30 main() int num,total; num=10; total=num*PRICE; printf(“total=%d“,total); ,运行结果:total=300,常量,符号常量:定义一个标识符来表示的常量。 【例2】 #define PRICE 20 /*宏定义语句*/ main( ) float num; float sum; /*变量定义*/ num=6.0; sum=num* PRICE; printf(

7、“sum=%f”,sum); /*输出结果*/ ,说明:1、符号常量的值在其作用域内不能改变,也不能再赋值; 2、使用符号常量,可以做到一改全改; 3、还可以起到一定的注释作用。,直接常量:直接可以看得到数据的常量。 【例1】已知每千克牛肉的价格为20元,买6斤需要多少钱。 main( ) float sum; /*变量定义*/ sum=20.0*6; /*给变量赋值*/ printf(“sum=%dn”,sum); /*输出结果*/ ,运行结果:(屏幕显示) Sum=120.000000,三种形式: 十进制整数:由数字09和正负号表示.如 123,-456,0 八进制整数:由数字0开头,后跟

8、数字07表示.如0123,011 十六进制整数:由0x开头,后跟09,af,AF表示. 如0x123,0Xff,例 12 与 12L,例 30000 为int型 65536 为long int 型,整型常量的类型 根据其值所在范围确定其数据类型 在整常量后加字母l或L,认为它是long int 型常量,问题: 0123 = ( )10 0x123 = ( )10 0Xff = ( )10,整型常量(整常数),表示形式: 十进制数形式:(必须有小数点) 如0.123, .123, 123.0, 0.0, 123. 指数形式:(e或E之前必须有数字十进制数;指数必须为整数)如12.3e3 ,123

9、E2, 1.23e4 , e-5 , 1.2E-3.5,实型常量的类型 默认double型 在实型常量后加字母f或F,认为它是float 型,实型常量(实数或浮点数),定义:用单引号括起来的单个普通字符或转义字符.,字符常量的值:该字符的ASCII码值,如 101 -A 012 -n 376 - x61 -a 60 -0 483 -(),例: A-101-x41-65,如 A65, a97, 048 , n10,如 a A ? n 101,转义字符:反斜线后面跟一个字符或一个代码值表示,例 转义字符举例(ch2_001.c,ch2_004.c) main() printf(“101 x42 C

10、n“); 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”); ,运行结果: 屏幕显示:= 打印机输出:,字符常量,字符常量与字符串常量不同,定义:用双引号(“”)括起来的字符序列 存储:每个字符串尾自动加一个 0 作为字符串结束标志,例: char ch; ch=“A”;,字符串常量,概念:其值可以改变的量 变量名与变量值 变量定义的一般

11、格式: 数据类型 变量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; /Illegal use of floating point in

12、 function main,变量定义位置:一般放在函数开头,变量,占字节数随机器不同而不同,一般占一个机器字 shortintlong 可用sizeof(类型标识符)测量,实型变量 float:占4字节,提供7位有效数字 double:占8字节,提供1516位有效数字 example,字符型变量 字符变量存放字符ASCII码 char与int数据间可进行算术运算,例1: float a; a=111111.111; /* a=111111.1*/ 例2: double b; b=111111.111; /* b=111111.111*/,例 a=D; /* a=68; */ x=A+5; /

13、* x=65+5; */ s=!+G /* s=33+71; */,没有字符串变量,用字符数组存放,整型变量,【exp2.7】一个较大实数加一个较小实数。 main() float x=7.24356E10, y; y=x+54; printf(“x=%en“,x); printf(“y=%en“,y); ,程序执行的结果为: x=7.24356E10 y=7.24356E10,进行计算时,要避免一个较大实数和一个较小实数相加减。,【exp2.8】实型数据的溢出 main() float a,b,c,d; a=1.2E33; b=0.5E-22; c=0.25E-21; d=a/b; d=d*

14、c; printf(“c=%fn “,d); ,结果: Floating point:Overflow,改:d=a*c;d=d/b; 或: d=a/b*c;,/*ch2_5.c*/ #define PRICE 12.5 main() 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.500000, ch1=d,例子,结论: 允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,同样也允许对

15、整型变量赋以字符值,把整型量按字符量输出。 注意: 因字符量存放为单字节,所以当整型量按字符型量处理时,只有低八位字节参与处理。,本次课回顾,基本数据类型,int 整数,在目前绝大多数机器上占4个字节。TC2中是2个字节 float 单精度浮点数,一般是4个字节长 double 双精度浮点数,一般是8个字节长 char 字符,一般是1个字节长 用来表示256个ASCII字符,或者0255的整数,ASCII字符表1,数据类型修饰符,short short int,短整数,一般2个字节长。通常简写为short long long int,长整数,一般是4个字节长。通常简写为long long do

16、uble,长双精度(高精度)浮点数,一般是16个字节长。 signed 用来修饰char、int、short和long,说明他们是有符号的整数(正整数、0和负整数)。一般缺省都是有符号的,所以这个修饰符通常省略 unsigned 用来修饰char、int、short和long,说明他们是无符号的整数(正整数和0),3.4e-383.4e38,基本数据类型,注:对于其它系统中设基本整型占用内存字节数为n, 其值域为:-2n-1(2n-1-1);无符号整型变量的值域为:0 (2n-1)。,常数(Constant),整型常数 18、-31 长整型常量 123l、123L、123456l、123456

17、L 无符号型常量 123u、 123U 浮点常数 十进制小数形式 123.45、456.78 指数形式 1e-2、4.5e3 单精度实型常量 123.45f、 456.78F、1e-2f、4.5e3F 长双精度型常量 123.45l、 456.78L、1e-2l、4.5e3L,八进制与十六进制常数,以数字“0”开始的整型常数是八进制数 022、-037 010和10大小不一样 因为八进制并不常用,所以此种表示法比较少见 以“0x”或者“0X”开始的整型常数是十六进制 AF和af用来表示十进制的1015 十六进制的形式比较常用,尤其在进行位一级的控制的时候 0x12、-0x1F, -0x1f,字

18、符(Character)常数,字符常数的表示方法 a,A,5,%,$ 单引号内只能有一个字符,除非用“”开头 就是一个普通整数,也可以参与各种数学运算 每个字符具有一个0255之间的数值,可从ASCII表查出 注意:5和整数5的区别 字符的数学运算在密码学内用得比较多,字符常数,转义字符 一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示,字符串(String)常数,用双引号括住的由0个或多个字符组成的字符序列 “I am a string“ “表示空字符串 转义字符也可以在字符串中使用 引号只作为字符串开始和结束的标志 C语言内部用0表示字符串的结束 除注释外,是唯一可以出现中文的地方

19、 “x“和x是不同的 里定义了一系列专门的字符串处理函数,使用变量要注意,不要对变量所占的内存空间字节数想当然 用sizeof获得变量或者数据类型的长度 现场演示程序在Turbo C2.0下的运行结果,注意!,#include main() printf(“Data type Number of bytesn“); printf(“- -n“); printf(“char %dn“, sizeof(char); printf(“int %dn“, sizeof(int); printf(“short int %dn“, sizeof(short); printf(“long int %dn“,

20、 sizeof(long); printf(“float %dn“, sizeof(float); printf(“double %dn“, sizeof(double); ,变量声明,使用变量的基本原则 变量必须先定义,后使用 所有变量必须在第一条可执行语句前定义 声明的顺序无关紧要 一条声明语句可声明若干个同类型的变量 声明变量,是初始化变量的最好时机 不被初始化的变量,其值为危险的随机数 char esc = a; int i = 1; int sum = 0; float eps = 1.0e-5;,实型数据提供的有效数字位数,float型数据提供7位有效数字 double型数据提供1

21、6位有效数字 使用不当导致舍入误差,#include main() float a; double b; a = 123456.789e4; b = 123456.789e4; printf(“%fn%fn“,a,b); ,数据在内存中的存储格式,整型 实型 字符型,char型与int型之间的关系,小写字母转换为大写字母,#include main() char ch = b; ch = b - 32; printf(“%c, %dn“, ch, ch); ,#include main() char ch = b; ch = b - (a - A) ; printf(“%c, %dn“, ch

22、, ch); ,小结,C语言的数据类型分为标准类型、构造类型、指针类型、空类型等四大类; 常量与变量:变量必须先定义,后使用;常量有直接常量和符号常量两种形式。C语言规定标识符只能由字母、数字和下划线3种字符组成,并且第一个字符必须为字母或下划线。 整型数据:分为短整型(short)、长整型(long)和基本整型(int)3种。根据是否存放符号,又可分为:无符号(unsigned)数和有符号(signed)数。整型常量有3种形式:八进制(前缀0)、十进制(无前缀)、十六进制(0x为前缀)。整型常量还可以加后缀u、U和l、L来表示无符号数和长整型。 实型数据:分为单精度(float)、双精度(d

23、ouble)、长双精度3种。实型常量都是双精度型,可以用十进制小数和指数形式表示。 字符型数据:在内存中以ASCII码形式存放。字符型数据可以作为整型数据使用,整型数据也可以作为字符型数据使用,相互转换的一句是ASCII码表,练习,(1)以下选项中合法的标识符是 A) 1-1 B)11 C)-11 D)1 (2)以下选项中不能作为C 语言合法常量的是( )。 A)cd B)0.1e+6 C)“a“ D)011 (3)若函数中有定义语句:int k;,则 A)系统将自动给k赋初值0 B)这时k中值无定义 C)系统将自动给k赋初值-1 D)这时k中无任何值 (4)以下选项中,能用作数据常量的是 A

24、)o115 B) 0118 C)1.5e1.5 D) 115L (5)以下叙述中正确的是( )。 A)C 程序的基本组成单位是语句 B)C 程序中的每一行只能写一条语句 C)简单C 语句必须以分号结束 D)C 语句必须在一行内写完 (6)计算机能直接执行的程序是( )。 A)源程序 B)目标程序 C)汇编程序 D)可执行程序 (7)以下选项中正确的定义语句是( )。 A)double a; b; B)double a=b=7; C)double a=7, b=7; D)double, a, b; (8)C 源程序中不能表示的数制是()。 A)二进制 B)八进制 C)十进制 D)十六进制,1、C

25、 2 、A 3 、B 4 、D 5 、C 6 、D 7 、C 8 、A,填空 (10)若整型变量a 和b 中的值分别为7 和9,要求按以下格式输出a 和b 的值: a=7 b=9 请完成输出语句:printf (“ 【7】 ”,a,b);。 (11)若变量x、y已定义为int类型且x的值为99,y的值为9,请将输出语句printf(【7】,x/y);补充完整,使其输出的计算结果形式为:x/y=11,printf(“a=%dnb=%d”,a,b);,printf(“x/y=%d”,x/y);,第二讲 运算符和表达式,运算符和表达式,运算符功能 与运算量关系 要求运算量个数 要求运算量类型 运算符

26、优先级别 结合方向 结果的类型,学习运算符应注意,基本算术运算符: + - * / % 结合方向:从左向右 优先级: -(负号运算符) -* / % - + -(减) (2) (3) (4) 说明: “-” 为单目运算符(负号)时,右结合性 两整数相除,结果为整数,如运算量中有一个是实型,则结果为双精度实型 %要求两侧均为整型数据,例 5/2 = -5/2.0 =,例 5%2 = -5%2 = 1%10 = 5%1 = 5.5%2,算术运算符和表达式,2,-2.5,1,-1,1,0,(),现场演示课本例2.13,补充:,常用的标准数学函数,在C语言中,当要引用标准数学函数库时,通常在程序开头加

27、上预处理,文件包含处理命令#include,或#include”math.h”.,C程序: #include #include ”math.h” main() int a=3,b=4,c=5; double area=0,s=0; s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c); printf(“narea=%fn”,area); ,作用:使变量值加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

28、”,+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或减1 种类: 前置 +i, -i (先执行i+1或i-1,再使用i值) 后置 i+,i- (先使用i值,再执行i+1或i-1),说明: + - 不能用于常量和表达式,如5+,(a+b)+ + -结合方向: 自右向左 优先级:- + - - * / % - + -(减) (2) (3) (4),例 -i

29、+ -(i+) i=3; printf(“%d”,-i+); /-3,例 -i+ i=3; printf(“%d”,-i+);,自增、自减运算符+ -,现场演示课本例2.14,简单赋值运算符 符号: = 格式: 变量标识符=表达式 作用:将一个数据(常量或表达式或函数)赋给一个变量,复合赋值运算符 种类:+= -= *= /= %= = &= = |= 含义: exp1 op= exp2 exp1 = exp1 op exp2,例 a=3; d=func(); c=d+2;,赋值运算符和表达式,结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表达式,赋值表达式的值与变量值相等,

30、且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例 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=5 a=(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):,结合方向:自右向左 优先级: 14 左侧必须是变量,不能是常量或表

31、达式,赋值表达式的值与变量值相等,且可嵌套,赋值转换规则:使赋值号右边表达式值自动转换成其左边变量的类型,例: a=12; a+=a-=a*a,例: int a=2; a%=4-1; a+=a*=a-=a*=3;,/a=-264 等价于a=a+(a=a-(a*a),/a=0 等价于a=a+(a=a*(a=a-(a=a*3),说明(2):,注:复合赋值符的优先级和赋值运算符相同(14),结合性也相同(右结合性).使用复合赋值符的目的是简化程序,提高编译效率,并产生质量较高的目标代码.,例2.15,类型转换,在进行赋值操作时,会发生类型转换 将取值范围小的类型转为取值范围大的类型是安全的 反之是不

32、安全的 如果大类型的值在小类型能容纳的范围之内,则平安无事 但是,浮点数转为整数,会丢失小数部分,非四舍五入 反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关。避免如此使用,隐式转换 什么情况下发生 运算转换-不同类型数据混合运算时 赋值转换-把一个值赋给与其类型不同的变量时 输出转换-输出时转换成指定的输出格式 函数调用转换-实参与形参类型不一致时转换 运算转换规则:不同类型数据运算时先自动转换成同一类型,不同类型数据间的转换,char ch; int i; float f; double d;,ch/i + f*d - (f+i),例 1,一般形式:(类型名)(表达式) 例:

33、(int)(x+y) (int)x+y (double)(3/2) (int)3.6 说明:强制转换得到所需类型的中间变量,原变量类型不变,例 main() float x; int i; x=3.6; i=(int)x; printf(“x=%f,i=%d”,x,i); 结果:x=3.600000,i=3,精度损失问题,显式转换(强制转换),例2.16和2.17,字符串与数值类型之间的转换,int i = “123“ 这样用是不行地 atof(),atoi(),atol() 把字符串转为double,int和long 定义在stdlib.h中 sprintf() 可以用来把各种类型的数值转为

34、字符串 定义在stdio.h中,自动类型转换,同种数据类型的运算结果,还是该类型 不同种数据类型的运算结果,是两种类型中取值范围更大的那种 long double double float long int short char 把数据赋值给另外一种类型变量也会发生自动类型转换 从小到大,顺利转换 从大到小,可能丢失信息(好的编译器会发出警告),类型强转,消除从大到小的警告 l = (long)i; 可以通过“(类型)表达式”的方式把表达式的值转为任意类型 强转时,你必须知道你在做什么 强转与指针,并称C语言两大神器,用好了可以呼风唤雨,用坏了就损兵折将,#include main() int

35、 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); ,形式:表达式1,表达式2,表达式n 结合性:从左向右 优先级: 15 逗号表达式的值:等于表达式n的值 用途:常用于循环for语句中,例 a=3*5,a*4 a=3*5,a*4,a+5 例 x=(a=3,6*3) x=a=3,6*a 例 a=1;b=2;c=3; printf(“%d,%d,%d

36、”,a,b,c); printf(“%d,%d,%d”,(a,b,c),b,c);,/a=15,表达式值60,/a=15,表达式值20,/赋值表达式,表达式值18,x=18,/逗号表达式,表达式值18,x=3,/1,2,3,/3,2,3,逗号运算符和表达式,例: #include main() int x,y=7; float z=4; x=(y=y+6,y/z); printf(“x=%dn“,x); ,运行结果:x=3,关系运算符 种类:= != 结合方向:自左向右 优先级别:,例 ca+b /c(a+b) ab!=c /(ab)!=c a=bc /a=(bc),关系表达式的值:是逻辑值“

37、真”或“假”,用1和0表示,例 int a=3,b=2,c=1,d,f; ab (ab)=c b+cb f=abc,/表达式值1,/表达式值1,/表达式值0,/d=1,/f=0,关系运算符和表达式,例 若a=0; b=0.5; x=0.3; 则 a=x=b的值为,0,例 5278在C中是允许的, 值为,0,例 int i=1, j=7,a; a=i+(j%4!=0); 则a=,2,例 a0 结果为 A100 结果为,1,0,关系运算注意(1),例 注意区分“=”与“=” int a=0,b=1; if(a=b) printf(“a equal to b”); else printf(“a no

38、t equal to b”);,例 应避免对实数作相等或不等的判断 如 1.0/3.0*3.0=1.0 结果为 可改写为:fabs(1.0/3.0*3.0-1.0)1e-6,0,关系运算注意(2),会出现警告,但不影响运行结果,逻辑运算符 种类: ! & | 逻辑运算真值表,C语言中,运算量: 0表示“假”, 非0表示“真”, 运算结果: 0表示“假”, 1表示“真”,逻辑运算符和表达式(1),例 ab&xy a=b|x=y !a|ab,优先级:,结合方向:,/ (a=x) & (x=b),/(ab)&(xy),/(a=b)|(x=y),/(!a)|(ab),逻辑运算符和表达式(2),优先级:

39、,结合方向:,例 a=4;b=5; !a a&b a|b !a|b 4&0|2 53&2|84-!0 c&d,值为1,值为0,值为1,值为1,值为1,值为1,/(53)&2|(8(4-(!0) 值为1,逻辑运算符和表达式(3),短路特性:逻辑表达式求解时,并非所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的解时,才执行该运算符,例 a (m=ab)&(n=cd),/结果m=0,n=1,逻辑运算符和表达式(4),实例,ch是英文大写字母 (ch = A) & (ch = Z) 判断某一年year是否是闰年的条件是满足下列两个条件之一: 能被4整除,但不能被100整除; 能

40、被400整除; (year % 4 = 0) & (year % 100 != 0) | (year % 400 = 0),一般形式: 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)?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、e

41、xpr3类型可不同,表达式值取较高的类型,例 x?a:b /x=0,表达式值为b; x0,表达式值为a xy?1:1.5 /xy ,值为1.0; xy ,值为1.5,条件运算符与表达式,优先级,( ) - . ! + - + - * & (类型) sizeof * / % + - = = != & | & | ? : = += -= *= /= %= &= = |= = ,优先级,能背下优先级表的人凤毛麟角 用括号来控制运算顺序更直观、方便,并减少出错的概率,结合性,多数运算符为左结合 少数为右结合: 一元运算符 赋值运算符 条件运算符,第二讲 小结,本讲主要介绍了C语言中的运算符和表达式,以

42、及各运算符的优先级和结合性.重点介绍+了,-,*,/,%,+,-,以及逗号运算符、复合赋值运算符和强制类型转换运算符,(1)若有表达式(w)?(-x):(+y),则其中与w 等价的表达式是( )。 A)w=l B)w=0 C)w!=l D)w!=0 (2)执行以下程序段后,w 的值为( )。 int w=A, x=14, y=15; w=(x | y),以下表达式中,值不为6的是 A) x*=x+1 B) x+,2*x C)x*=(1+x) D)2*x,x+=2 (4)以下不能正确表示代数式2ab/cd的C 语言表达式是( )。 A)2*a*b/c/d B)a*b/c/d*2 C)a/c/d*

43、b*2 D)2*a*b/c*d (5)表达式(int)(double)(5/2)+2.5)的值是【5】 (6)设变量a 和b 已正确定义并赋初值。请写出与a-=a+b 等价的赋值表达式 【6】 。,练习,1、 D 2 、 C 3 、 D 4 、 D,4,a=a-(a+b) 或 (a=-b),(7)有以下程序 #include Main() int a=1,b=2,c=3,d=0; if(a= =1 程序运行后的输出结果是 A)1,2,3 B)1,3,2 C)1,3,3 D)3,2,1,答案: C,练习,第三讲 变量的地址和指向变量的指针,为什么引入指针的概念,使程序简洁、紧凑、高效 指针为函数

44、提供修改变量值的手段 指针为C的动态内存分配系统提供支持 指针为动态数据结构(如例链表、队列、二叉树等)提供支持,有效地表示复杂的数据结构 指针可以改善某些子程序的效率,变量与地址,程序中: int i; float k;,内存中每个字节有一个编号-地址,i,k,编译或函数调用时为其分配内存单元,变量是对程序中数据 存储空间的抽象,1 、指针的概念,指针:一个变量的地址 指针变量:专门存放变量地址的变量叫,2000,指针,指针变量,变量的内容,变量的地址,指针与指针变量,含义,含义: 取变量的地址 单目运算符 优先级: 2 结合性:自右向左,含义: 取指针所指向变量的内容 单目运算符 优先级:

45、 2 结合性:自右向左,两者关系:互为逆运算 理解,i_pointer-指针变量,它的内容是地址量 *i_pointer-指针的目标变量,它的内容是数据 &i_pointer-指针变量占用内存的地址,i_pointer &i &(*i_pointer) i *i_pointer *(&i),i_pointer = &i = &(*i_pointer) i = *i_pointer = *(&i),&与*运算符,直接访问:按变量地址存取变量值 间接访问:通过存放变量地址的变量去访问变量,例 i=3; -直接访问,3,例 *i_pointer=20; -间接访问,20,直接访问与间接访问,例 k=

46、i; -直接访问 k=*i_pointer; -间接访问,10,例 k=i; k=*i_pointer;,例子图解,指针变量与其所指向的变量之间的关系,指针变量的定义 一般形式: 存储类型 数据类型 *指针名;,合法标识符,指针变量本身的存储类型,指针的目标变量的数据类型,表示定义指针变量 不是*运算符,例 int *p1,*p2; float *q ; static char *name;,注意: 1、int *p1, *p2; 与 int *p1, p2; 2、指针变量名是p1,p2 ,不是*p1,*p2 3、指针变量只能指向定义时所规定类型的变量 4、指针变量定义后,变量值不确定,应用前必须先赋值,2 、指针变量,一般形式:存储类型 数据类型 *指针名=初始地址值;,赋给指针变量, 不是赋给目标变量,例 int i; int *p=,变量必须已说明过 类型应一致,例 int i; int *p=,用已初始化指针变量作初值,例 main( ) int i

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1