首页计算机计算机软件C语言程序设计 03 第2章 数据类型、运算符与表达式.pptx

03 第2章 数据类型、运算符与表达式.pptx

页数:67页文件大小:386.7 KB来源: C语言程序设计ppt课件

本课件覆盖C语言的数据基础:先说明关键字与标识符规则,再梳理基本类型、构造类型、指针类型与空类型构成的类型体系;随后讲解常量与符号常量、整型数据的补码表示、实型与字符型数据的存储特点,最后归纳各类运算符的优先级与结合性。

第2章 数据类型、运算符与表达式,讲解掌握C的几种基本数据类型、掌握标识符的概念、熟练掌握整型长整型、短整型、无符号整型数据等内容
2.2 数据类型概述,讲解常量和符号常量
2.1 关键字和标识符,讲解什么是关键字已被C语言本身使用、ANSI C的关键字doubledefaultc等内容
查看本课件的文字版(共 67 页,供检索与复制)

第1页:第2章 数据类型、运算符与表达式

第2章 数据类型、运算符与表达式

掌握C的几种基本数据类型;

2.掌握标识符的概念,熟悉变量和符号常量先定义后使用特点;

3.熟练掌握整型长整型、短整型、无符号整型数据和单精度、双精度浮点数的定义与存储特点;

4.熟练掌握字符型数据的的定义与存储特点,并熟悉整型数据与字符型数据间的关系;

5.掌握定义变量的同时,赋初值的方法;

6.掌握不同类型数据间的混合运算规则;

7.掌握不同运算符的使用特点、优先级与结合性;

8.掌握各种表达式的含义与使用要点。

教学要求第2章数据类型、运算符与表达式

第2页:2.2 数据类型概述

2.2 数据类型概述

3常量和符号常量2.4整数类型2.5实数类型2.6字符类型2.7变量及其定义2.8运算符和表达式2.1关键字和标识符结束

第3页:2.1 关键字和标识符

2.1 关键字和标识符

什么是关键字已被C语言本身使用,不能作其它用途使用的字,例如不能用作变量名、函数名等。

ANSI C的关键字doubledefaultconstcontinuecharcasebreakautoC89 32个ifgotoforfloatexternenumelsedosizofstaticsignedshortreturnregisterlongintwhilevolatilevoidunsigneduniontypedefswitchstructinline_Bool_Complex_ImaginaryrestrictC99增加的5个

第4页:标识符用来标识变量

标识符用来标识变量

标识符号合法性判断举例sumSumM.D.Johnstud_namea>b$123_daydaycharDate3dayslotus_1_2#332.1关键字和标识符良好习惯:见名知意!

  • 常量、函数等的字符序列。
  • 组成规则
  • 由字母"a~z,A~Z"、数字"0~9"、下划线"_"组成
  • 第一个字符必须是字母或"_"
  • 大小写字母表示不同意义
  • 只有前31(63)个字符有效
  • 不能使用C语言的关键字。

第5页:2.2 数据类型概述

2.2 数据类型概述

C语言程序中所用到的每一个量(常量、变量及函数等)都是程序的基本操作对象,它们都隐式地或显式地与一种数据类型相联系(属于某种数据类型)。

  • 根据数据的性质和用途将其分为不同的类型。
  • 每种类型都表明它的可能取值范围及能进行的运算。
  • 大体上可划分为基本的数据类型和导出的数据类型两种。(见数据类型总表)

第6页:2.2 数据类型概述C语言

2.2 数据类型概述C语言

数据类型基本类型指针类型构造类型空类型void字符型char布尔型bool整型(整数类型)实型(浮点型)单精度型float双精度型double长双精度long double数组结构体struct共用体union枚举型enum短整型short整型int长整型long双长整型longlong注:红色是C99所增加的。

第7页:2.2 数据类型概述

2.2 数据类型概述

  • 数据类型决定:
  • 数据占内存字节数
  • 数据取值范围
  • 其上可进行的操作

第8页:2.3 常量与符号常量

2.3 常量与符号常量

  • 常量程序运行时其值不能改变的量称为常量(即常数)。
  • 分类整型常量、实型常量、字符常量。
  • 判别常量的类型,可通过书写形式来判别。
  • 编译处理(后面再详细解释)
  • 在编译时,常量一般会被处理为机器指令的一部分,它位于程序区,不会占据动态数据区位置
  • 有的系统,也将部分常量分配到静态数据区中。

第9页:符号常量

符号常量

main(){ floatr=10,c,s; c=2*PAI*r; s=PAI*r*r; printf("c=%3.1f\ns=%3.1f",c,s); } 2.3常量与符号常量c=2*3.14*r ; s=3.14*r2; 等价于运行结果:c=62.8s=3
  • 是用标识符表示的常量。
  • 作用见名知意,一改全改(保持一致)。
  • 定义格式#define符号常量常量
  • 是宏定义(预处理命令),不是C语句(见后面)
  • 一般用大写字母。
  • 例#definePAI3.14//注意:行末没有分号

第10页:2.4 整数类型

2.4 整数类型

整型数据分类根据占用内存字节数的不同进行分类:取值范围字节数类型名(关键字)类型-32768~ 32767即-215~ (215-1)2signedshortint短整型有符号4(TC:2)signedint(灰色可省略)基本整型-231~ (231-1)4signedlongint长整型C99新加,VC不支持8signedlonglongint双长整型0 ~ 65535即0~ (216-1)2unsigned shortint短整型无符号4(2)unsignedint基本整型0~ (232-1)4unsigned longint长整型C99新加,VC不支持8unsigned longlongint双长整型取值范围如何得到?

第11页:整型常量的三种表示形式

整型常量的三种表示形式

八进制由数字0开头,后跟数字0~7表示。如:0123,011(前加0,与通常含义有别)

动手算一算0123=()10011=()10-0678=()100x123=()100xff=()10-0Xa2b=()102.4整数类型839错误291255-2603

  • 十进制由数字0~9和正负号表示。如:123,-456,0
  • 十六进制由0x开头,后跟0~9,a~f,A~F表示。如:0x123,0Xff

第12页:整型常量的类型确定

整型常量的类型确定

根据其值所在范围确定其数据类型(short,int,long)如:23456在(-32768~32767)之间,用2字节存放;

45678超(-32768~32767)范围,用4字节存放;

查阅整型数据分类的取值范围可确定其类型。

在Turbo C中,常量后加l或L,认为是long型;

例:30000为int型,12为int型(2字节),65536l为long型,12L为long型(4字节);

在VisualC++中,int和longint都为4字节,没必要用longint类型。

第13页:整型数据的内部表示

整型数据的内部表示

  • 数值的表示方法
  • 原码最高位为符号位,其余各位为数值本身的绝对值。
  • 反码正数:反码与原码相同;负数:符号位为1,其余位对原码取反。
  • 补码正数:原码、反码、补码相同;负数:最高位为1,其余位为原码取反,再整个数+1。

第14页:举例用一字节表示数

举例用一字节表示数

(更多字节道理相同)2.4整数类型补码反码原码数值000001110000011100000111+7111110011111100010000111-7000000000000000000000000+0000000001111111110000000-0前提:字节数-1-2…-127-1281111111111111110…100000011000000001…1261270000000000000001…011111100111111110000000 ~01111111[-128~+127]范围解释

第15页:负数补码转换成十进制数

负数补码转换成十进制数

(补码的补码)最高位不动,其余位取反加1;

(补码的补码)例:补码11111001取反10000110加110000111(原码)=-73.整型数据在存中用补码存放例:短整型数100和-100在内存中表示(短整型数在VC中占用2个字节内存,其它如基本整型占用4个字节,道理相同。

)2.4整数类型0010011000000000100-1000011100111111111

第16页:2.5 实数类型简称实型或浮点型

2.5 实数类型简称实型或浮点型

与整型统称为算术类型。

一、实型数据分类根据占用内存字节数的不同,可分为以下几类:取值范围有效数字占字节数类型名(关键字)类型±(3.4×10-38~ 3.4×1038)6~74float单精度±(1.7×10-308~ 1.7×10308)15~168double双精度±(1.7×10-308~ 1.7×10308)16VC: 8long double长双精度±(1.2×10-4932~1.7×104932)19TC:10

第17页:实型常量的表示形式

实型常量的表示形式

例如:1.25342e4、12.5342E3、125.342e2都表示实数12534.2说明表示不唯一。

规范的指数形式(谭书定义不一样0.125342e5)小数点左边有一位非0数字,如:1.25342e

  • 实型常量即实数(或浮点数),有两种表达形式。
  • 十进制形式
  • 由数码0~9和小数点组成(必须有小数点)
  • 例如:3.14、0.15、.123、123.、123.0、
  • 指数形式<尾数>E(或e)<整型指数>

第18页:实型常量的类型确定

实型常量的类型确定

在实型常量后加字母f或F,认为它是float型;如:34.2f为float型;.5F为float型。

加字母l或L,认为它是double型;如:12.56l为double型;2.5E3L为double型

  • 默认double型
  • 如果不指明类型,C编译系统把实型常量都按double处理,分配8个字节
  • 在VisualC++中,longdouble也为8个字节,所以常量后无需加任何字母。

第19页:实型常量的舍入误差在内存

实型常量的舍入误差在内存

中,可以精确的存放一个整数,不会有误差,这是由于整型数值的范围较小;

而实型的数值的范围较大,用有限的存储单元存储,能提供的有效数字总是有限的,因此有效数字以外的数字将被舍去,由此可能产生误差。

如:float类型只有6~7位有效数字123456.1234e5=12345612340.0其中超出有效数字被舍去。

2.5实数类型问题:用程序计算1.0/3*3 = 1?准确不准确

第20页:实型数据的内部表示在计算机内部

实型数据的内部表示在计算机内部

实型数据的存储当然还是以二进制形式存储,并且以浮点形式存放的。即用以下四个部分表示一个实数

  • 数符:这个数的符号,是正还是负数,占一位
  • 尾数:规格化的数字(即0.*******形式)。位数越多精度越高
  • 阶符:指数的符号,占一位。表示尾数中小数点的移动方向。
  • 阶码:指数(整数),即尾数中小数点移动位数。位数越多,值域越宽。

第21页:例:实数3.14159在内存

例:实数3.14159在内存

中的存放形式例中用十进制数来示意,实际是用二进制数:实数的值= (数符)二进制尾数×2(阶符)二进制阶码在4个字节(32位)中,各用几位来表示小数和指数,C标准无具体规定,由各C编译系统自定。

  • 小数(尾数)部分位数愈多,精度愈高
  • 指数(阶码)位数愈多,能表示的数值范围愈大。2.5实数类型1+0.314159+
  • 阶码/1
  • 阶符\10+
  • 尾数I0.314159×
  • 数符\+实质:科学计数法

第22页:2.6 字符类型简称字符型

2.6 字符类型简称字符型

包含ASCII字符集。

一、字符集与字符代码目前大多数系统采用ASCII字符集,只能使用其中的字符程序才能识别的。

各种字符集的基本集包括了127个字符。

详见《谭书》附录B(ASCII字符表)。

二、字符常量的定义用一对单引号(不是双引号)括起来的单个字符。

例如:'A'、'1'、'+'等。

第23页:字符常量的值字符型常量是按整数形式存储

字符常量的值字符型常量是按整数形式存储

占一个字节,其值是该字符的ASCII码值。(C99把其归为整型类)例如:'A'—65,'a'—97,'0'—48,'\n'—10

C语言允许使用一种“特殊形式”的字符常量,就是以“\”开头的转义字符。(见常用转义字符)

ASCII中一些特殊字符(控制符,如回车等),无法从键盘上直接输入,可以用转义字符的方式表示。

第24页:'\101'—'A''\012'—'\n

'\101'—'A''\012'—'\n

常用转义字符及含义2.6字符类型含义符号反斜线\\响铃\a水平制表\t垂直制表\v3位8进制数代表的字符\ddd2位16进制数代表的字符\xhh注意区别:0'0' '\0' '

  • ' '\376'—'
  • '(TC)'\x61'—'a''\60'—'0''\483'—(错)
  • 注意:若反斜杠或单引号本身作为字符常量,必须使用转义字符'\\'、'\''。
  • '0 48 0 32含义符号换行\n回车\r退格\b换页\f单引号\'双引号\"

第25页:字符串常量用双引号("")括起来

字符串常量用双引号("")括起来

存储每个串尾自动加一个'\0'作为串结束标志例:字符串"China"在内存中□C□h□i□n□a□\0空串""在内存中□\0

字符串常量与字符常量差别'a'与"a"在存储上的差别:'a'-□a,"a"-□a□\0例:charch;ch="a";是错误的!

charch;ch='a';是正确的!

  • 的字符序列

第26页:字符串中转义字符的作

字符串中转义字符的作

main(){ printf("1234567890123456789\n"); printf("abcd\tabcd\b123\n"); printf("1234\t1234\r\\abcd\tab\n"); } 运行结果:2.6字符类型1234567890123456789abcdabcd12341234\abcdab123

第27页:2.7 变量及其定义

2.7 变量及其定义

  • 变量概念在程序运行过程中,其值可以被改变的量。它们可与数据类型结合起来分类。
  • 变量名每个变量都必须有一个名字──变量名;变量命名遵循标识符命名规则。
  • 变量值在程序运行过程中,变量值存在内存中;在程序中,通过变量名来引用变量的值。

第28页:变量的存储

变量的存储

若变量在一个存储单元存不下,则可以使用多个存储单元。当使用多个存储单元时,则第一个存储单元的地址(首地址)就作为变量的地址。

  • 每一个变量都使用存储单元来存储其值
  • 当程序需要处理该变量时,就到存储单元中读取其值(读取操作并不改变存储单元的内容)。
  • 为了便于存储管理,给每个存储单元分配一个序号,这个序号叫做地址。
  • 对变量的操作依据地址进行(可读可写)。

第29页:变量的定义

变量的定义

例:inti,j,k;//定义三个整型变量i、j、kfloatx,y;//定义两个实型变量x、ydoublez;//定义一个双精度变量zcharc,e;//定义两个字符变量c、e

  • 在程序中,常量可以不经说明而直接引用,而变量则必须先定义后使用。
  • 定义的一般格式类型名变量1[,变量2,…,变量n]

第30页:变量初始化变量初始化就是在定义变量时

变量初始化变量初始化就是在定义变量时

赋初值。

例:inta=2,b,c=4;//b不赋值初值随机floatdata=3.67;charch='A';intx=1,y=1,z=1;intx=y=z=1;(错!)//注意变量定义的语法格式,不要想当然。

第31页:变量的使用及定义位置

变量的使用及定义位置

main(){ inta,b=2; floatdata; a=1; data=(a+b)*1.2; printf("data=%f\n",data); } 2.7变量及其定义先定义,在函数开头;后使用可执行语句
  • 先定义,后使用
  • 定义位置一般放在函数开头
  • 例1:正确的变量定义与使用。

第32页:2:不正确的变量定义位置

2:不正确的变量定义位置

main(){ inta,b=2; a=1; floatdata; data=(a+b)*1.2; printf("data=%f\n",data); }
  • (对比例1)

第33页:变量的基本操作赋值与引

变量的基本操作赋值与引

  • 用(写与读)八、变量定义的作用按类型分配存储空间,以后可按名字操作变量。如:inti= 1
  • 分配四个字节的空间
  • 对i的赋值与引用就是对这四个字节的赋值与引用。

第34页:简单变量

简单变量

例:floata=123456.789;//a=123456.7doubleb=123456.789;//b=123456.7892.7变量及其定义有效数字

  • 整型变量
  • 占字节数随机器不同而不同(见2.5整数类型)
  • short≤int≤long
  • 可用sizeof(类型标识符)测量变量所占字节数2.实型变量(见2.5实数类型)
  • float:占4字节,提供7位有效数字(试过)
  • double:占8字节,提供15~16位有效数字

第35页:字符型变量

字符型变量

例:整型数据与字符型数据间的关系a='D';x='A'+5;s='!'+'G'4.注意

  • 字符变量存放字符ASCII码
  • char与int数据间可进行算术运算;(C99归整型)
  • 没有字符串变量!
  • 字符串用字符数组存放。

第36页:常变量在定义变量时

常变量在定义变量时

如果加上关键字const,则变量值在程序运行期间不能改变,这种变量称为常变量。

C99允许使用常变量,如:constinta=3;注意,在定义常变量时必须同时对它初始化。

  • 常变量与常量比较
  • 常变量具有变量的基本属性(有类型、占空间)
  • 两者都是不变量。
  • 常变量有名字的而常量没有。
  • 有名字的常变量就便于在程序中被引用。

第37页:常变量与符号常量比较

常变量与符号常量比较

#definePI3.14//定义符号常量constfloatpi=3.14;//定义常变量

  • PI和pi都代表3.14,在程序中都能使用
  • PI只是用符号常量代表一个串,在预编译时仅是进行字符替换,没有类型,不分配存储单元
  • pi具有变量的基本属性,占用存储单元,有变量值,只是该值不改变而已。
  • 从使用的角度看,常变量具有符号常量的优点,而且使用更方便。
  • 有了常变量以后,可以不必用符号常量。

第38页:2.8 运算符和表达式

2.8 运算符和表达式

概述1.运算符运算符是在一个数学运算中表示相应运算动作的一种符号。

运算符所作用的对象称作运算分量。

在C语言中,除控制语句和输入输出函数外,其它所有基本操作都作为运算符处理。

第39页:TC的运算符非常丰富,主要分为三大类

TC的运算符非常丰富,主要分为三大类

  • TC的运算符非常丰富,主要分为三大类:
  • 算术运算符
  • 关系运算符与逻辑运算符
  • 按位运算符
  • 除此之外,还有一些特殊运算符。
  • 一目和二目运算符
  • 要求一个操作对象的运算符称为一目(一元)运算符。例如:-a是对a进行一目负操作。
  • 要求二个或多个操作对象的运算符称为二目或多目(两元或多元)运算符。例如:a+b

第40页:表达式用运算符和括号将运算对象

表达式用运算符和括号将运算对象

(常量、变量和函数等)连接起来的、符合C语言语法规则的式子,称为表达式。例如:1+a*sin(x)/2

单个常量、变量或函数,可以看作是表达式的一种特例,称为简单表达式。如:n、5、sin(x)。

  • 其它表达式称之为复杂表达式。

第41页:运算符的优先级与结合性

运算符的优先级与结合性

结合性是指当一个操作数两侧的运算符具有相同的优先级时,该操作数是先与左边的运算符结合,还是先与右边的运算符结合。

结合性是C语言的独有概念。除单目运算符、赋值运算符和条件运算符是右结合性外,其它运算符都是左结合性。

  • 自左至右的结合方向,称为左结合性(如:12+34-56)。反之,称为右结合性。
  • C语言规定了运算符的优先级和结合性。(见附录)

第42页:表达式的计算

表达式的计算

如果在一个运算对象(或称操作数)两侧的运算符的优先级相同,则按C语言规定的结合方向(结合性)进行。

  • 括号内的表达式先计算
  • 按运算符优先级高低次序执行。(如先乘除后加减)
  • 例如:算术运算符的结合方向是“自左至右”即:在执行“a–b+c”时:
  • 变量b先与减号结合,执行“a–b”
  • 然后再执行+c的运算。

第43页:表达式计算的结果

表达式计算的结果

表达式求值的每一步运算都需要进行类型检查,不同类型的数据进行运算时,需要按一组类型转换规则(见下一节)进行处理。

  • 计算结果的类型
  • C语言的所有运算只能在相同的数据类型之间进行,且结果也属于该数据类型。

第44页:计算结果的溢出

计算结果的溢出

溢出概念:数据类型对计算的限制还表现在数据的范围方面,一种类型的数据有其确定的取值范围,超出一个类型范围之外的数值在这个类型中就没有办法表示,如果书写不当,表达式计算的结果可能超出类型表示的范围。

这种情况叫溢出。

溢出处理:C语言系统对于计算溢出通常不报告错误,计算会进行下去,但计算结果不正确,设计程序时要非常小心。

  • 溢出分析:理解前面介绍的数据内部表示形式,易于分析结果溢出的原因。

第45页:*:给出程序的执行结果,并分析原因

*:给出程序的执行结果,并分析原因

main()//用整型格式输出a的结果{ shorta=32767+2; printf("%d\n",a); } 程序运行结果:-327672.8运算符和表达式超出短整型数据的取值范围(-32768~32767)01000000000000002的内部形式
  • 111111111111111032767内部形式
  • 1000000000000001a的内部形式
  • 符号位结果:-32767

第46页:2.8 运算符和表达式学习

2.8 运算符和表达式学习

  • 运算符应注意:
  • 运算符功能
  • 与运算量关系(要求运算量个数与类型)
  • 运算符优先级别
  • 结合方向
  • 结果的类型

第47页:算术运算符和算术表达式

算术运算符和算术表达式

?例2:计算3*7%2+7%2*5*(1/2)的值3*7%2+7%2*5*(1/2)2.8运算符和表达式-2.521-11021100╳-+%/*-(单目)符号减加余除乘取负含义低中高优先级从左向右从右向左结合方向说明两整数相除结果为整数要求%两侧均为整型数据结果为:1

  • 基本算术运算符例1:5/2
  • ?5%2
  • ?1%10
  • ?5%1
  • ?-5%2
  • ?-5/
  • ? 5.5%2

第48页:混合运算及数据类型转换

混合运算及数据类型转换

如果一个运算符两侧的操作数的数据类型不同,则系统按“先转换、后运算”的原则,首先将数据自动转换成同一类型,然后在同一类型数据间进行运算。

  • 混合运算及类型自动转换
  • C语言中,整型、实型和字符型数据间可以混合运算(因为字符数据与整型数据可以通用)。

第49页:例:inti

例:inti

char, short2.8运算符和表达式intdoubledoubledoubleintdoubledouble不同类型的转换方向

  • doubled;floatf ;longl;10 + ‘a’ +i*f-d/ l
  • 转换规则高double
  • float
  • long
  • unsigned
  • 低int
  • 必须转换

第50页:数据类型强制转换

数据类型强制转换

例如:(double)a//将变量a的值转换成double型(int)(x+y)//将x+y的结果转换成int型(float)5/2//将5转换成实型,再除以2(=2.5)(float)(5/2)//将5整除2的结果2转换成实型2.

  • 一般格式为:(要转换成的数据类型)(被转换的表达式)
  • 当被转换的表达式是一个简单表达式时,外面的一对圆括号可以缺省。

第51页:强制转换类型得

强制转换类型得

到的是一个所需类型的中间量,原表达式类型并不发生变化。

例如:(double)a只是将a的值转换成一个double型的中间量,a的数据类型并未转换成double型。

较高类型向较低类型转换时可能发生精度损失问题。例如:(int)2.1的结果是2,丢失了小数部分。

第52页:2.8 运算符和表达式

2.8 运算符和表达式

用法与运算规则前置运算:++i、--i,先增减、后运算。后置运算:i++、i--,先运算、后增减。

  • (++)、自减(--)运算符
  • 作用使单个变量的值增1或减1。
  • 结合方向自右向左。如-i++相当于-(i++)。
  • 优先级-、++、--(高)*、/、%(中)+、-(低)

第53页:2.8 运算符和表达式

2.8 运算符和表达式

  • 常用于循环语句中以及指针变量中(以后介绍)。
  • 不能用于常量和表达式。如5++,--(a+b)都是非法的。
  • 在表达式中,连续使同一变量进行自增或自减运算时,很容易出错,所以最好避免这种用法。

第54页:*:自增、自减运算符的用法

*:自增、自减运算符的用法

main(){ intx=3,y,z; printf("x=%d\n",x); z=(x++)+5;} 2.8运算符和表达式运行结果:x=3x=4, y=7x=5, z=9

第55页:赋值运算符和赋值表达式

赋值运算符和赋值表达式

例:a=3//将3赋给a,表达式的值为a的值3a=b//表达式的值为b的值a=3+7/2//"+"与"/"优先级高于"="运算符

  • 简单赋值运算符与赋值表达式
  • 符号=
  • 格式变量名=表达式
  • 作用将一个表达式的值赋给一个变量
  • 结合方向自右向左;(如:a=b=2)
  • 优先级高于逗号运算符,比其他运算符都低
  • 表达式的值左边变量的值,且可嵌套

第56页:变量赋初值

变量赋初值

对变量可以进行全部或部分初始化inti=1;//定义int型变量i,并初始化成1flatf=0.5;//定义flat型变量f,并初始化成0.5charc='a';//定义char型变量c,并初始化成'a'inta,b,c=5;//定义整型变量a、b、c,初始化c为

  • 什么是初始化在定义变量时用类似赋值的方法给被定义的变量指定一个初始值。
  • 说明

第57页:在使用变量时

在使用变量时

不仅要满足“先定义,后使用”的规定,还要保证在对变量进行取值的操作前变量一定要赋过值。

方法是在定义时进行初始化,也可以先定义变量,后用赋值或输入语句给变量赋初值。

inti=1;//变量初始化是在程序运行时进行的inta=i+1;//可用已定义的变量,对变量赋值

几个变量取同一个初值时,不能采用多重赋值的形式,必需一个一个分开写。inta=b=c=5;//不允许的inta=5,b=5,c=5;//应分开单独写

第58页:复合赋值运算

复合赋值运算

作用简化表达式的写法,并提高编译效率。可把类似:变量名=变量名+表达式简化成:变量名+=表达式

举例a的值为6,计算a+=a-=a+a的值a+=a-=a+a2.8运算符和表达式12a=a-12-6相当于a的值变为-6相当于a=a+(-6)(-6)(6)结果:a =-12注意运算符:

  • 构成在赋值符“=”之前加上其他运算符,构成复合运算符(二元运算符)。
  • 符号+=、-=、*=、/=、%=<<=、>>=、&=、^=、|=
  • 优先级别
  • 结合方向

第59页:赋值操作中的类型转换

赋值操作中的类型转换

转换规则(a=表达式)系统自动求表达式得的值,按a的类型进行转换;也可用强制转换的方式,人为地转换后赋给变量a;这种转换只限于数值数据之间。

  • 什么情况下转换赋值运算符两侧的数据类型不一致时。
  • 说明
  • 这部分的内容较难掌握,要学习好这部分的内容,对数据内部的表示形式必须理解透彻。
  • 不同类型数据间赋值时,会出现意想不到的结果,而编译不提示出错,全靠经验来找问题。

第60页:理解和分析赋值类型转换(整型)的过程

理解和分析赋值类型转换(整型)的过程

赋值的本质是把上一步的结果放到"="左边变量中,结果与"="两边数据类型的长度有关,操作的原则以"="左边的变量类型为准:

若"="右边的数据类型长度比左边的长,则从低位按右边的长度截取部分内容赋值;2.8运算符和表达式低高

  • 计算表达式值,按结果类型给出其内部形式
  • 右数据边长xx……xxxx……xx
  • 左边变量短xx……xx丢弃

第61页:"="右边的类型长度不如

"="右边的类型长度不如

  • "="左边的长,赋值内容放在"="左边交量的存储单元的低端,高端根据变量的类型填充内容
  • 用赋值运算符左边的变量类型的内部表示形式,解释上一步赋值的内容
  • 实型和整型间的类型转换,只要用上述的方法理解实型数的整数部分即可。
  • 右边数据短xx……xx
  • 左边变量长xx……xx??……??低高视情况而定

第62页:类型转换示例例1

类型转换示例例1

设*shorta,b;intd;charc='a'unsignedshorti;floatf=56734.5;a=98304;i=98304;a=98304;i=98304;2.8运算符和表达式98304

  • 00000000000000011
  • 0000000000000001a
  • 超出,丢弃-32768符号位98304
  • 00000000000000011
  • 0000000000000001i
  • 超出,丢弃32768非符号位

第63页:2:设*shorta,b;intd;ch

2:设*shorta,b;intd;ch

arc='a';unsignedshorti;floatf=56734.5;a=139532;b=-32766;i=b;a=139532b=-32766;i=b2.8运算符和表达式139532

  • 001100001000010001
  • 0011000010000100a
  • 超出,丢弃8460符号位-327660100000000000101b
  • 0100000000000101i
  • 符号位非符号位32770

第64页:3:设*shorta,b;intd;ch

3:设*shorta,b;intd;ch

arc='a';unsignedshorti;floatf=56734.5;i=c;c=0355;a=c;i=c;97(‘a')

c=0355;a=c2.8运算符和表达式符号扩展,以保持值不变97非符号位0355(八进制)

  • 10000110c
  • 1000011000000000i
  • 10110111c
  • 1011011111111111a
  • 符号扩展,以保持值不变-19符号位

第65页:4:设*shorta=-100;intd

4:设*shorta=-100;intd

  • d=a;2.8运算符和表达式d=-100;-100
  • 0011100111111111
  • 0011100111111111111…111d
  • 类型转换总结
  • 按右边类型存储形式直接传送,多弃少补
  • 用左边的变量类型解释符号扩展,以保持值不变-100符号位符号位

第66页:逗号运算符(,)和逗号表达式

逗号运算符(,)和逗号表达式

  • 作用将多个表达式串在一起组成逗号表达式
  • 一般形式表达式1,表达式2,…,表达式n
  • 结合方向自左向右。
  • 优先级优先级最低。
  • 计算过程
  • 依次求解表达式1、表达式2、…、表达式n
  • 整个逗号表达式的值是最后的表达式n的值。

第67页:举例*main(){intx=60,y

举例*main(){intx=60,y

printf("x=%d,y=%d\n",x,y); } 2.8运算符和表达式请注意:各种运算符之间的优先级别!y = (x =x-5,x / 5); 1155y = (x =55,11); 5511运行结果:x=55, y=11
  • y=(x=x-5,x/5)
顶部目录