《c语言教学资料》2基本数据类型及运算.ppt

上传人:牧羊曲112 文档编号:5896075 上传时间:2023-08-31 格式:PPT 页数:147 大小:540.50KB
返回 下载 相关 举报
《c语言教学资料》2基本数据类型及运算.ppt_第1页
第1页 / 共147页
《c语言教学资料》2基本数据类型及运算.ppt_第2页
第2页 / 共147页
《c语言教学资料》2基本数据类型及运算.ppt_第3页
第3页 / 共147页
《c语言教学资料》2基本数据类型及运算.ppt_第4页
第4页 / 共147页
《c语言教学资料》2基本数据类型及运算.ppt_第5页
第5页 / 共147页
点击查看更多>>
资源描述

《《c语言教学资料》2基本数据类型及运算.ppt》由会员分享,可在线阅读,更多相关《《c语言教学资料》2基本数据类型及运算.ppt(147页珍藏版)》请在三一办公上搜索。

1、第2章 基本数据类型及运算,第2章 基本数据类型及运算,本章内容,2.2 标准输入输出函数,2.3 运算符与表达式,2.4 算术运算符与算术表达式,2.1 数据类型,2.5 自增自减运算符及其表达式,第2章 基本数据类型及运算,2.7 关系运算符和关系表达式,2.8 逻辑运算符和逻辑表达式,2.9 其他类型运算符和表达式,2.6 赋值运算符和赋值表达式,2.11 库函数,2.10 表达式的运算顺序和类型转换,2.1 数据类型,本节内容,2.1.2 常量与变量,2.1.3 整型,2.1.4 实型,2.1.1 标识符,2.1.5 字符型,2.1 数据类型,C语言数据类型,数组类型结构体类型共用体类

2、型枚举类型,整型字符型实型(浮点型),基本类型,指针类型,构造类型,空类型,单精度型 双精度型,2.1.1 标识符,C程序是基本字符的序列。基本字符包括:数字(09)大小写字母(az,AZ)标点符号特殊字符:空格、换行、制表符等,起分隔的作用。增删空白一般不影响程序的意义。,2.1.1 标识符,标识符是一个字符序列,用来标识程序中用到的常量、变量、函数、数组、语句标号以及符号常量等的名称。C语言规定标识符应满足以下规则:只能由字母、下划线和数字组成第一个字符不能是数字标识符中的字母区别大小写不能使用C语言的关键字C语言中有3类标识符:关键字,系统预定义的标识符,用户标识符。,2.1.1 标识符

3、,关键字:C语言规定的具有特定意义的字符串,通常也称保留字(小写字母)。标识数据类型(14个):int、long、char、float、double等标识存储类型(5个):auto、static、register等标识流程控制(12个):goto、break、if、else、continue等标识运算符(1个):sizeof,2.1.1 标识符,2.1.1.2 预定义标识符总是以固定的形式用于专门的地方,例如标识库函数名和编译预处理命令。编译预处理命令:define,endef,ifdef,endif,include等。标准库函数:数学函数:sqrt,sin,cos,pow,log,fabs,

4、exp等。输入输出函数:scanf,printf,getchar,gets等。2.1.1.3 用户自定义标识符用户根据自己的需要定义的一类标识符,主要用于标识变量、函数、数组名等。,2.1.2 常量与变量,2.1.2.1 常量常量是指在程序中固定不变的数据量。常量又可分为直接常量和符号常量。直接常量:就是在程序中直接引用的数据:整型常量:1,0,-50,32767。实型常量:3.14,-55.6,1.7e4。字符常量:A,$,s。字符串常量:Good morning,how are you。,2.1.2 常量与变量,符号常量:是用标识符表示一个数据。定义符号常量:#define 标识符 常量#

5、define是一条预处理命令,称为宏定义,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母。#define PI3.14159标识符PI代表常量3.14159。程序中,凡是出现标识符PI的地方都用3.14159替换。,2.1.2 常量与变量,【例2-1】分析以下程序中,常量有哪些?,#include#define N 10void main()int a=6;int sum;float b=4.5,c;sum=a+N;c=b*N;printf(a=6,sum=%dn,sum);printf(%f,c);,2.1

6、.2 常量与变量,2.1.2.2 变量变量代表内存中的一个存储单元,它用来存放数据,也就是变量的值,在程序运行期间,可以读出所存放的值或写入新值。变量名实际上是一个以一个名字对应代表一个内存单元的地址,在对程序编译时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。,2.1.2 常量与变量,2.1.2.2 变量C语言中要求对所有用到的变量作强制定义,也就是“先定义,后使用”。在定义变量时要指定变量名和变量的数据类型,也可以同时为定义的变量赋初值。变量的数据类型决定了编译系统为其分配的空间大小。变量“先定义,后使用”的目的:未

7、定义的,系统不作为变量名(编译时出错);编译时为变量分配相应存储单元;根据变量类型,检查运算是否合法,如整型变量的求余运算 a%b,2.1.2 常量与变量,变量定义必须放在变量使用之前,一般放在函数体的开头部分,之后是程序的执行语句。主函数main()的结构为:main()变量声明语句 执行语句序列,2.1.2 常量与变量,定义变量的语句格式为:类型 变量表;类型可以是int、float、char、void或自定义类型。变量表可以是一个或多个变量名,各变量之间要用逗号分开,声明语句要以分号作为结束。int abc;/声明一个名为abc的整型变量float m,n,p;/声明3个实型变量,名字分

8、别为m、n、p定义变量的同时赋初值:float m=1,n=2,p;应注意,在初始化中不允许连续赋值,如int a=b=c=5是不合法的。,2.1.3 整型数据,2.1.3.1 整型常量十进制整型常量:十进制整常数没有前缀。八进制整型常量:以数字0作为前缀。所用数码为07。八进制数通常是无符号数。例如:012(十进制为10)、0103(十进制为67)、0177777(十进制为65535)十六进制整型常量:十六进制整型常量以0X或0 x为前缀。所用数码为09,AF或af。例如:0X1B(十进制为27)、0XC2(十进制为194)、0XFFFF(十进制为65535)。,2.1.3 整型数据,长整型

9、数的表示:在基本整型数后加大写字母“L”或小写字母“l”来表示。例如:72767L(十进制为72767)、0200000L(十进制为65536)、0X21FFFL(十进制为139263)等。长整型数占4个字节(32位)存储空间。整型常量的无符号数的后缀为“U”或“u”。例如:625u,0 x12Du,115Lu 均为无符号数。程序中是根据前缀来区分各种进制数的。整型常量后面加u或U,则认为是unsigned int型,整型常量后面加l或L,则认为是long int型。,2.1.3 整型数据,2.1.3.2 整型变量整型变量用来存放整型常量。整型变量按其取值范围可分为以下几类:基本型类型说明符为

10、int,在内存中占4个字节(TC编译系统为2个字节),其取值为基本整常数。短整型类型说明符为short int或short。所占字节和取值范围均与基本型相同。长整型类型说明符为long int或long,在内存中占4个字节,其取值为长整型数。,2.1.3 整型数据,整型变量还可添加类型说明符unsigned,表示该变量是无符号型变量。无符号型与上述三种类型匹配可构成:无符号基本型 类型说明符为unsigned int或unsigned。无符号短整型 类型说明符为unsigned short无符号长整型 类型说明符为unsigned long,2.1.3 整型数据,2.1.3 整型数据,【例2-

11、2】将八进制数0100赋给变量a,十六进制数0 x1F赋给变量b,十进制数10赋值给变量c,然后计算d=a+b+c,最后以十进制和八进制形式显示a,b,c,d的值。,#include void main()int a=0100,b=0 x1F;int c=10,d;d=a+b+c;printf(a=%d b=%d c=%d d=%d,a,b,c,d);printf(n);printf(a=%o b=%o c=%o d=%o,a,b,c,d);,2.1.3 整型数据,2.1.3.3 整型数据在内存中的存储方式一个数分为正数和负数,在计算机中为了表示数,可以采用多种方法,一般有原码、反码、补码这三

12、种表示形式。实际上,在计算机中,数值是用补码表示的。原码:将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值,即转换成相应的二进制形式,我们以短整型(int)来举例:+7的原码:0000000000000111-7的原码:,2.1.3 整型数据,反码:一个数如果为正,则它的原码与反码表示方法相同;一个数如果为负,则符号位为1,其余各位是对原码取反。+7的反码:0000000000000111-7的反码:补码:在计算机中,数值是用补码表示的。一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。+7的补码:00000

13、000 00000111-7的补码:第一步,7的原码:00000000 00000111第二步,按位取反:11111111 11111000第三步,整个数+1,得-7的补码:11111111 11111001,2.1.3 整型数据,已知一个负数的补码,将其转换为十进制数:步骤如下:(1)先将各位取反;(2)将其转换为十进制数;(3)加上负号,再减去1。例如:,最高位为1,是负数,先对各位取反得0000000000000101,转换为十进制数得5,加上负号得-5,再减1得-6。在计算机中,数值是采用补码表示的。这样做可以把减法运算转换成加法运算,仍然能获得正确的结果。使得计算机的运算器具备加法器

14、就可以完成各种运算了,简化了计算机的硬件结构。,2.1.3 整型数据,计算机所能表达的数的范围叫做“模”。模与某数的差,叫做某数的“补数”。如果丢弃超出模的进位的话,数A减数B所得的差,与数A加数B的补数所得的和是一致的。例如:以10为模,9-4=5。9+6=15,丢掉进位也是5。,如果计算机用一个字节表示数。模就是1 00000000(256)107-3这个减法运算就可以变成7+3的补码(253)的加法运算。,00000111(7的补码),+11111101(3的补码253),1 00000100(丢掉进位为4),2.1.4 实型数据,2.1.4.1 实型常量实数有两种表示形式:小数形式和指

15、数形式。小数形式由数码09和小数点组成。指数形式指数形式也称科学计数法,由十进制小数加阶码标志“e”或“E”以及阶码组成。指数表示的一般形式为:a E n(a为实数,n为整数)表示a10n。注意:实型常数不分单、双精度,都按双精度double型处理。,2.1.4 实型数据,2.1.4.2 实型变量实型变量分为两类:单精度实型和双精度实型。float为单精度说明符,double为双精度说明符。单精度型占4个字节(32位)内存空间,其数值范围为3.4E-383.4E+38,只能提供7位有效数字。双精度型占8个字节(64位)内存空间,其数值范围为1.7E-3081.7E+308,可提供16位有效数字

16、。,2.1.4 实型数据,#includevoid main()float a;double b;a=1.0/3;b=1.0/3;printf(a=%.20fnb=%.20fn,a,b);,【例2-3】编写一个程序,用float和double两种类型变量保存1/3的计算结果。,2.1.5 字符型数据,一个字符,占1个字节的存储空间。字节中存放字符的8位二进制的ASCII码,总共256种,对应0255的整数。,2.1.5 字符型数据,2.1.5.1 字符常量字符类型常量或变量都占用1个字节。字符型变量用于存放一个ASCII码。C语言是把字符型的数据当成整型数处理的,因此,对于整型数据的所有处理均

17、可用于字符型数据。在C语言中,字符型常量是由一对单引号引起来的单个字符构成。例如:A,5,$等。a的ASCII码为:0110 0001(十进制97,十六进制61),2.1.5 字符型数据,字符常量有以下特点:字符常量只能用单引号括起来,不能用双引号或其它括号。字符常量只能是单个字符,不能是字符串。字符常量占用一个字节的存储单元,而实际在存储单元内存放的是该字符的ASCII码值,即一个整型量。因此,字符常量可以参加数值运算。,2.1.5 字符型数据,#includevoid main()char m=a;printf(%cn,m);,【例2-5】分析以下程序运行结果。,2.1.5 字符型数据,转

18、义字符是在一些字符前加上反斜杠“”构成,用于表示某些控制字符(如n表示回车)或一些特殊字符(”表示双引号,还可以表示任意ASCII字符(bbb、0 xhh)。,2.1.5 字符型数据,#includevoid main()printf(1t2t3t4n);,#includevoid main()printf(Yb=n);,【例2-6】输出1、2、3、4,要求以制表符(tab)分隔,【例2-7】转义字符的使用,2.1.5 字符型数据,#includevoid main()printf(101 x42 Cn);printf(He said:Thank youn);printf(C Programn

19、);printf(Turbo C n);,【例2-8】判断输出结果,字符数据在内存中的存储形式及其使用方法一个字符常量存放到一个字符变量中,即将该字符的相应的ASCII码放到存储单元中。因而字符型数据和整型数据之间可以通用。例如:char c=A;int y;y=c+32;,字符型数据,2.1.5 字符型数据,2.1.5.2 字符串常量字符串常量是由一对双引号括起的字符序列。例如:“ABC”、“123”、“a”、“nt”、“nGood morning”等都是合法的字符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别:字符常量由单引号括起来,字符串常量由双引号括起来。字符常量只能是

20、单个字符,字符串常量则可以包含一个或多个字符。,2.1.5 字符型数据,可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量。这一内容将在数组一章详细介绍。字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中用来存放字符串结束标志字符“0”(ASCII码为0000 0000)。字符串 C program在内存中的存储形式为:,2.1.5 字符型数据,2.1.5.3 字符型变量同其他类型的变量一样,必须在使用前声明。字符型变量占一个字节,字符型变量的取值是字符

21、常量,即单个字符。类型说明符是char。例如,声明两个字符型变量:char c1,c2;在声明时,也可以直接赋初值:char c1=x,c2=y;char c3=,c4=95;,2.1.5 字符型数据,字符x的十进制ASCII码是120,y的十进制ASCII码是121。对字符变量c1,c2赋予x和y值:c1=x,c2=y;实际上是在c1,c2两个单元内存放120和121的二进制代码:c10 1 1 1 1 0 0 0 xc20 1 1 1 1 0 0 1 y所以也可以把它们看成是整型量。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型

22、量按字符量输出。,2.1.5 字符型数据,#includevoid main()char tab;tab=t;printf(1%c2%c3%c4n,tab,tab,tab);,【例2-9】判断输出结果,2.1.5 字符型数据,#include void main()int sum=0;sum=sum+a;printf(“sum=%dn,sum);,【例2-10】判断输出结果,2.1.5 字符型数据,#includevoid main()char c1=A;int y;y=c1+32;printf(c1:%c,%dn,c1,c1);printf(y:%c,%dn,y,y);,【例2-11】编写一

23、程序,将字符A赋给字符型变量c1,计算y=c1+32,最后以字符和整数两种形式显示c1和y的值。,2.2 标准输入输出函数,本节内容,2.2.2 格式输出函数printf,2.2.1 格式输入函数scanf,2.2 标准输入输出函数,C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现例如:字符输入函数:getchar 字符输出函数:putchar格式输入函数:scanf 格式输出函数:printf字符串输入函数:gets 字符串输出函数:puts,2.2 标准输入输出函数,在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。例如:在调

24、用标准输入输出库函数时,文件开头应该有:#include“stdio.h”或:#include 用双引号表示先在当前程序所在的目录查找所包含的文件,一般在要包含自己写的文件时使用。用尖括号表示先在系统目录查找所包含的文件,一般在要包含系统头文件时使用。,2.2.1 格式输入函数scanf,此处所说的数据输入指的是程序从键盘上输入数据。注意:scanf()函数的声明包含在stdio.h头文件中。因此,要调用这个函数,必须在程序开始处添加#include 预处理命令。,2.2.1 格式输入函数scanf,格式int scanf(“格式化字符串”,地址表);地址表:地址表是一系列要求输入数据的变量的

25、地址。对普通变量而言,变量地址就在变量前加“变量n的地址是&n。格式化字符串:格式化字符串包括空白字符、普通字符(非空白字符)和格式说明符3部分。scanf()函数按从左到右的顺序扫描格式化字符串,对其进行处理。,2.2.1 格式输入函数scanf,空白字符包括空格、“t”水平制表符和“n”回车换行符等。空白符将被跳过。普通字符(非空白字符)包括除百分号“%”以外的所有ASCII字符。普通字符必须原样输入。格式说明符用于规定所读入数据的类型,它是由百分号加特定字符组成。常用格式说明符及含义如下表:,2.2.1 格式输入函数scanf,2.2.1 格式输入函数scanf,格式说明符按从左到右的顺

26、序与地址表中的各参数相匹配,格式说明符的个数要与参数表中的参数个数相同。scanf(%d,%o,%x,2.2.1 格式输入函数scanf,#includevoid main()int a,b,c,sum;printf(Please input a,b,c:n);scanf(%d,%o,%x,【例2-12】编写一程序,分别输入一个十进制、八进制、十六进制数,然后求这三个数之和,最后以十进制形式输出这三个数及其和。,2.2.1 格式输入函数scanf,#includevoid main()float x,y,sum,product;scanf(x=%f y=%f,【例2-13】从键盘上输入任意两个

27、数,求它们的和与积。,2.2.1 格式输入函数scanf,#includevoid main()char ch;printf(please input a letter:n);scanf(%c,【例2-14】从键盘输入一个小写字母,输出对应的大写字母。,2.2.2 格式输出函数printf,数据输出是指在屏幕输出(显示)数据。要调用这个函数,必须在程序开头添加#include预处理命令。格式int printf(“格式化字符串”,参量表);用途可将多项字符、数值(整型或实型)和字符串格式化后,输出到标准输出设备上。,2.2.2 格式输出函数printf,参数说明参量表:参量表是任选项(根据程序

28、具体需要,可有可无),是一系列要输出的数据项,它们可以是整型、实型、字符型及字符串常量或变量,也可以是运算表达式。格式化字符串:格式化字符串是用双引号引起来的一个字符串。格式化字符串是由普通字符、转义字符、格式说明符三部分组成。,2.2.2 格式输出函数printf,普通字符:printf()函数将根据普通字符出现的先后次序直接照原样显示输出。转义字符:printf()函数将根据转义字符所具有的含义进行输出处理。格式说明:用来规定各项输出数据的输出类型和输出格式,通常和参量表中的表达式一一对应。printf(a=%d b=%d c=%d sum=%d,a,b,c,sum);,2.2.2 格式输

29、出函数printf,2.2.2 格式输出函数printf,#includevoid main()int i=64;printf(i=%d,i);/以十进制格式输出 printf(i=%o,i);/以八进制格式输出 printf(i=%x,i);/以十六进制格式输出 printf(ni=%d,%o,%xn,i,i,i);/各种格式混合输出,【例2-15】编写一程序,将十进制整数64以十进制、八进制和十六进制输出。,2.2.2 格式输出函数printf,#includevoid main()float x,y;scanf(%f%f,【例2-16】从键盘上输入任意两个数,求它们的和与积。,2.2.2

30、 格式输出函数printf,附加字符的使用对于格式说明,%和格式字符之间也可以插入一些附加字符,其一般形式如下:%-+#m.nl格式规定符中括号“”和“”括起来的各项为任选项,它们用来限定输出数据项的格式;而格式规定符用来限定各输出数据类型。,2.2.2 格式输出函数printf,2.2.2 格式输出函数printf,#includevoid main()int x=123;printf(%-10d,x);/“-”指定左对齐,m指定宽度为10 printf(n);printf(%10d,x);/m指定宽度为10,默认右对齐 printf(n);,【例2-17】编写程序,将整数123以10个字符

31、宽度靠左输出和靠右输出。,2.2.2 格式输出函数printf,#includevoid main()float x=123.456;printf(x=%.2fn,x);/n指定小数点后保留2位printf(x=%10.2fn,x);/m指定宽度为10,【例2-18】编写程序,输出数值123.456,分别按以下两种格式输出:只保留小数点后两位按10个字符宽度,保留小数点后两位,2.3 运算符与表达式,C语言的语句是由表达式构成的,因此C语言又被称为表达式语言。由于C语言含有相当丰富的运算符,因此构成的表达式也是多种多样,可以表示各种运算功能。C语言的运算符非常丰富,使用方法也比较独特。C语言有

32、40多个运算符 单目运算符:只需要一个运算对象 双目运算符:需要两个运算对象参加 三目运算符:需要三个运算对象参加,2.3 运算符与表达式,2.3 运算符与表达式,表达式是由运算符连接常量、变量、函数所组成的式子。根据运算符的不同可以把表达式分为:算术表达式、赋值表达式、逻辑表达式、关系表达式、条件表达式等。任意一个表达式最终总是可以得到一个确定的值,也就是说C表达式本质就是一个值,因此表达式中如果有变量,则该变量必须是已赋过值的。需注意的是:如果表达式中出现多个运算符,则表达式的求值顺序要按运算符的优先级和结合性的规定进行。,2.4 算术运算符和算术表达式,2.4.2 算术表达式,2.4.3

33、 算术运算符的优先级和结合性,2.4.1 算术运算符,本节内容,2.4.1 算术运算符,“+”(加法运算符)“-”(减法运算符或负值运算符)“*”(乘法运算符)“/”(除法运算符)C语言的除法运算比较特殊,当两个整型数相除时,结果为整型数,其商只取整数部分,小数部分自动舍弃。而有实型数参加的除法运算,结果为double实数,要保留小数部分。,2.4.1 算术运算符,#includevoid main()printf(%d,%dn,30/4,-30/4);printf(%f,%fn,30.0/4,-30.0/4);,【例2-20】分析以下程序结果。,2.4.1 算术运算符,“%”(求余运算符或称

34、为模运算符)该运算要求运算符两边的操作数必须为整型或字符型数据,其结果(余数)也是一个整型或字符型数据。求余运算不能用于实型数。求余运算的结果等于两数相除后的余数。通常百分号左边的数比较大,结果自然就是整除后的余数,例如80%7的结果是3;结果的符号与被除数相同。,2.4.2 算术表达式,算术表达式是由算术运算符和圆括号将运算量(常量、变量、函数)连接起来的式子。需注意的是,C表达式中的所有字符都是写在一行上的,不能写成分式和上下标的形式。以下是一些正确的算术表达式:a+b-(b/(2*a)(x+r)*8-(a+b)7 sin(x)+sin(y)3.14*r*r b*b-4*a*c在程序设计中

35、有时需要将一些特殊的数学公式写成算术表达式,需要用到C语言的库函数。y=|x-y|,调用方法为y=abs(x-y)。,算术运算符的优先级和结合性,优先级:存在混合运算的表达式中,必须规定各种运算的先后顺序,才能保证结果的唯一性,这个规定的先后顺序就是运算符的优先级。若一个运算对象两侧的运算符优先级不同,则按规定的优先级进行运算。如:a+b*c运算符的优先级规定见附录2。,算术运算符的优先级和结合性,结合性:是运算符的一个属性。若一个运算对象两侧的运算符优先级相同,则必须规定运算对象先与哪一侧的运算符结合,规定运算对象与左侧运算符先结合的称为“左结合性”(从左向右)。如:abc 即:(ab)c、

36、a+b-c 即:(a+b)-c。规定运算对象与右侧运算符先结合的称为“右结合性”(从右向左)。如:-i+即:-(i+)、!a+即:!(a+)。运算符的结合性规定见附录2。,运算符优先级口诀,算术运算符的优先级和结合性,算术运算符的优先级和结合性。,2.5 自增自减运算符及其表达式,运算符:自增运算符:自减运算符:表达式:+E-EE+E-注:E为整型或实型变量。,2.5 自增自减运算符及其表达式,使用说明:自增运算符“+”的作用是对操作数进行增1运算;自减运算符是对操作数进行减1运算。注意,“+”和“-”的运算对象只能是变量(或运算结果是变量的表达式),不能是常量(或运算结果是数值的表达式)。5

37、+、(a+b)+都是不合法的表达式。运算符+或-在操作数前(左)边的表达式称为前缀运算,在操作数后(右)边的运算称为后缀运算。+x;-a;/前缀运算n+;a-;/后缀运算,2.5 自增自减运算符及其表达式,当+和-作为前缀运算符时,被运算的变量(操作数)先自增(减)1,然后该变量的新值再参加表达式中其他运算。(先加后用)或(先减后用),#includevoid main()int i=1,n;n=+i;printf(%d,%dn,i,n);,【例2-22】判断输出结果,2.5 自增自减运算符及其表达式,当+和-作为后缀运算时,则先进行其他运算或操作。然后被运算的变量(操作数)再进行自增(减)运

38、算。(先用后加)或(先用后减),#includevoid main()int i=1,n;n=i+;printf(%d,%dn,i,n);,【例2-23】判断输出结果,2.5 自增自减运算符及其表达式,自增和自减运算符都具有右结合性,结合方向为从右到左。a+等价于-(a+)如果有多个运算符连续出现时,C系统尽可能多的从左到右将字符组合成一个运算符。i+j 等价于(i+)+j-i+-j 等价于-(i+)+(-j)(略)函数参数的求值顺序:在TC中,先计算最右边的参数值,再依次计算左边的参数值。在Visual C+6.0中,是各参数项同时取值。,2.5 自增自减运算符及其表达式,#includev

39、oid main()int i=1,j=1;i+;+j;printf(%d,%dn,i,j);,#includevoid main()float i=9,j=3;float m;m=i+/-j;printf(%.2fn,m);,【例2-24/25】判断输出结果。,2.5 自增自减运算符及其表达式,有关表达式中的问题说明:如果对于表达式E1+E2,并不是所有的编译系统都先调用E1,然后调用E2。例如,i的初值是5,有以下表达式:(i+)+(i+)+(i+)在Turbo C 2.0下,按照自左而右顺序求解括弧内的运算,求完第1个括弧的值后,实现i的自增,i变为5,再求第2个括弧的值,结果表达式相当

40、于5+6+7,即18。而在Visual C+6.0下把5作为表达式中所有i的值,因此3个i相加,得到的表达式的值是15。在求出整个表达式的值后再实现自加3次,i的值变为8。读者在编程时应尽量避免这种歧义性。,2.5 自增自减运算符及其表达式,#includevoid main()int a=3,m;m=(a+)+(a+);printf(%d,%dn,a,m);,Visual C+6.0将3作为表达式中所有a的值,计算后再实现2次自增。所以m的值是6。,【例2-27】判断输出结果。,2.6 赋值运算符和赋值表达式,本节内容,2.6.2 赋值运算中的数据转换,2.6.3 复合赋值运算符及表达式,2

41、.6.1 简单赋值运算符和表达式,2.6 赋值运算符和赋值表达式,C语言提供的赋值运算符有如下三类:简单赋值运算符:=复合算术赋值运算符:+=、-=、*=、/=、%=复合位赋值运算符:&=、|=、=、=、=由赋值运算符将一个变量和一个表达式联接构成的式子就是赋值表达式。,2.6.1 简单赋值运算符和表达式,简单赋值运算符的功能是将其右侧表达式的值赋给左侧的变量,赋值表达式的一般形式为:变量名=表达式如:a=3+5在赋值表达式中,“=”称为赋值运算符,而不是等号。左操作数必须是变量,不能是常量或表达式。右操作数可以是常量、变量或表达式。赋值表达式的计算过程是:先计算出右操作数的值,然后赋给左边的

42、变量。,2.6.1 简单赋值运算符和表达式,C语言允许在同一个赋值语句中对多个变量进行赋值,赋值运算规则是从右向左。例如:a=b=c=1;但是在变量定义时,只能:int a=1,b=1,c=1;表达式x=(a=3)+(b=6)在C语言中也是合法的。它的意义是把3赋给a,6赋给b,再把a,b相加,和赋给x,故x应等于9当左操作数和右操作数类型不同时,在赋值运算之前,要先将右操作数的类型转成与左操作数相同的类型,然后再进行赋值。这种类型的转换是C语言自动完成的。,2.6.2 赋值运算中的数据转换,当赋值运算符两边的运算量类型不同时,系统将自动进行类型转换,即把赋值运算符右侧表达式的类型换成左侧变量

43、的类型。具体规定如下:(以下略)整型与实型实型数据赋予整型变量时,舍去小数部分,只保留整数部分;整型数据赋予实型变量时,数值不变,但以浮点数据形式存储在变量中,即小数点后加若干个0。,2.6.2 赋值运算中的数据转换,整型与字符型整型数据赋予字符型变量时,只保留其最低8位,高位部分全部舍弃;字符型数据赋予整型变量时,由于字符型数据占用一个字节存储单元,而整型数据为两个字节存储单元,故将字符的ASCII码值放到整型变量的低8位中,高8位另作处理。分两种情况。如果系统将字符处理为无符号的数据类型,则高8位全部补0;如果系统将字符处理为有符号数据类型,若字符最高位为0,则整型变量高8位全部补0;若字

44、符最高位为1,则整型变量高8位全部补1;(叫做:符号扩展),2.6.2 赋值运算中的数据转换,#includevoid main()int a,b=325,c;float x,y=10.25;char c1=323;char c2;a=y;x=b;c=c1;c2=b;printf(%d,%f,%d,%cn,a,x,c,c2);,【例2-28】有以下程序,试分析其结果:,323八翻二为11 010 011,赋c变量后进行符号扩展,变为:11111111 11010011。但这是补码,取反变为10000000 00101100。加一后为:10000000 00101101即-45,325十翻二为0

45、0000001 01000101,赋c2变量后丢掉高位,剩:01000101。这是“E”的ASCII码,故输出E。,2.6.2 赋值运算中的数据转换,单、双精度实型C语言中的实型值总是用双精度来表示的,凡是float型数据只要在其尾部加0延长为double 型数据进行计算,然后直接赋值即可;而double型数据转换为float型数据时,需要截尾数,在截断前要先进行四舍五入操作。整型与长整型一个long型数据赋给int型变量时,将其低16位值赋给int型变量,而将高16位截断舍弃;一个int型数据赋给long型变量时,其外部形式不发生变化,但其内部进行符号扩展,如果原int型数据是正值,那么将i

46、nt型数据送入long型变量的低16位,高16位全部补0,反之将long型变量的高16位全部补1。(VC中:int型和long型长度相等),2.6.2 赋值运算中的数据转换,无符号整型一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时,将其原样赋予,内部存储方式不发生任何改变,但其外部表现形式是有符号的,因此值可能会有所改变。一个非unsigned型数据赋给一个占据同样长度存储单元的unsigned型变量时,原样赋值,即内部存储形式不会改变,但其外部表现形式总是无符号的,值有时会发生改变。C语言的这种赋值时的类型转换相对灵活一些,对于许多初学者来说会觉得复杂难记,在实际调试程序

47、的过程中经常会出现错误却又找不到问题所在,因此建议读者在编写程序的过程中尽量用强制类型转换,以便增加程序的可读性。,2.6.2 赋值运算中的数据转换,#includevoid main()unsigned x=65535,y;int a=-1,b;b=x;y=a;printf(unsigned)%u-(int)%dn,x,b);printf(int)%d-(unsigned)%un,a,y);,【例2-29】有以下程序,试分析其结果:,2.6.3 复合赋值运算符及表达式,复合赋值运算符的作用是:把一个变量的值先取出来进行运算之后再赋给该变量。例如:i+=2等价于表达式i=i+2的运算。复合赋值

48、表达式的一般形式是:E1 OP=E2(OP为+、-、*、/、%之一)该表达式等价于:E1=E1 OP E2。复合算术赋值运算符有:+=、-=、*=、/=、%=。复合位赋值运算符将在位运算符中介绍。,2.6.3 复合赋值运算符及表达式,关于复合算术赋值运算的几点说明:复合赋值运算符在书写时,两个运算符之间不能有空格;复合赋值表达式中的左操作数E1必须是变量,不能是常量或表达式;右操作数E2可以是常量、变量或表达式。下列复合赋值表达式是正确的:x+=2;等价于x=x+2x*=2+y;等价于x=x*(2+y)下列复合赋值表达式是非法的:2+=3;x+1=5;,2.6.3 复合赋值运算符及表达式,复合

49、赋值运算过程是:先计算E2的值,然后E1与E2进行相应的运算,最后结果赋给E1。注意表达式两边的括号,如a*=b+3等价于a=a*(b+3)而不是a=a*b+3。运用复合赋值运算符这种写法,可以使语句更加紧凑,有利于编译处理,能提高编译效率并产生质量较高的目标代码。,2.7 关系运算符和关系表达式,本节内容,2.7.2 关系表达式,2.7.1 关系运算符,2.7.1 关系运算符,在程序中经常需要比较两个数据量的大小关系,以决定程序下一步的工作。例如:a3。比较的结果成立,该式取值为真,否则为假。比较两个数据量的运算符称为关系运算符。语言提供了以下关系运算符:大于=大于或等于=等于!=不等于,2

50、.7.1 关系运算符,说明:关系运算符都是双目运算符,其结合性均为左结合。在六个关系运算符中,、=的优先级相同,并高于=和!=,=和!=的优先级相同。关系运算符的优先级高于赋值运算符但低于算术运算符。关系运算符“=”和赋值运算符“=”不同。如果关系运算的两个操作数类型不同,则低类型向高类型看齐,统一类型后,再进行关系运算。,2.7.2 关系表达式,用关系运算符将两个运算量连接起来构成的式子就是关系表达式。关系表达式的一般形式如下:E1 OP E2关系表达式的值为逻辑值True和False。在C语言中,关系表达式运算结果的“真”和“假”是通过整型数1和0来表示的。如果关系式成立,则得到一个int

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号