《c语言程序设计基础》2基本数据类型及运算.ppt_第1页
《c语言程序设计基础》2基本数据类型及运算.ppt_第2页
《c语言程序设计基础》2基本数据类型及运算.ppt_第3页
《c语言程序设计基础》2基本数据类型及运算.ppt_第4页
《c语言程序设计基础》2基本数据类型及运算.ppt_第5页
已阅读5页,还剩144页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第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 数据类型,圆的半径为5cm,计算圆的面积并输出,程序中的数据: r、area 5、3.14 对数据的运算: * 、=,#include void main() float r, area; r = 5; area = 3.14*r*r; printf (“%f n“, area); ,2.1 数据类型,计算机在操作处理时,要完成以下工作: 在内存中要给半径 r 和面积 area 开辟存储空间,存放它们的值。应该留多大的地方来存放其值? 数据 5 和 3.14 与 r、area 不同,它们是在编写程序时就给出确定的值,在运算过程中不会改变。这样的数计算机怎么处理? 对整数 5 和小数3.14,存放时是否有区别?,涉及数据类型 的基本知识,2.1 数据类型,C语言 数据类型,数组类型 结构体类型 共用体类型 枚举类型,整型 字符型 实型(浮点型),基本类型,指针类型,构造类型,空类型,单精度型 双精度型,2.1.1 标识符,C程序是基本字符的序列。 基本字符包括: 数字(09) 大小写字母(az,AZ) 标点符号 特殊字符:空格、换行、制表符等,起分隔的作用。增删空白一般不影响程序的意义。,2.1.1 标识符,标识符是一个字符序列,用来标识程序中用到的常量、变量、函数、数组、语句标号以及符号常量等的名称。 C语言规定标识符应满足以下规则: 只能由字母、下划线和数字组成 第一个字符不能是数字 标识符中的字母区别大小写 不能使用C语言的关键字 C语言中有3类标识符:关键字,系统预定义的标识符 ,用户标识符。,2.1.1 标识符,2.1.1.1关键字: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,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 标识符 常量 #define是一条预处理命令,称为宏定义,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母。 #define PI 3.14159 标识符PI代表常量3.14159。程序中,凡是出现标识符PI的地方都用3.14159替换。,例2.1在程序中使用符号常量 #define PRICE 30 #include void main ( ) int num, total; num=10; total=num * PRICE; printf(total=%dn,total); ,符号常量: 用一个标识符代表一个常量。符号常量的值在其作用域内不能改变,也不能再被赋值。,运行结果: total=300,说明: 程序中用#define命令行定义PRICE代表常量30,此后凡在本文件中出现的PRICE都代表30,可以和常量一样进行运算,说明: 如再用赋值语句给PRICE赋值是错的 PRICE=40; /* 错误,不能给符号常量赋 不能对符号常量指定类型 int PRICE; /* 错误,PRICE不是变量,不能指定类型 */,2.1.2 常量与变量,2.1.2.2 变量 变量代表内存中具有特定属性的一个存储单元,它用来存放数据,也就是变量的值,在程序运行期间,这些值是可以改变的。 变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。,2.1.2 常量与变量,2.1.2.2 变量 C语言中要求对所有用到的变量作强制定义,也就是“先定义,后使用” 。 在定义变量时要指定变量名和变量的数据类型,也可以同时为定义的变量赋初值。变量的数据类型决定了编译系统为其分配的空间大小。 变量 “先定义,后使用” 的目的: 未定义的,系统不作为变量名(编译时出错); 编译时为变量分配相应存储单元; 根据变量类型,检查运算是否合法,如整型变量的求余运算 a%b,2.1.2 常量与变量,变量定义必须放在变量使用之前,一般放在函数体的开头部分,之后是程序的执行语句。主函数main()的结构为: main() 变量声明语句 执行语句序列 ,2.1.2 常量与变量,定义变量的语句格式为: 类型 变量表; 类型可以是int、float、char、void或自定义类型。变量表可以是一个或多个变量名,各变量之间要用逗号分开,声明语句要以分号作为结束。 int abc; /声明一个名为abc的整型变量 float m,n,p; /声明3个实型变量,名字分别为m、n、p 应注意,在初始化中不允许连续赋值,如int a=b=c=5是不合法的。,2.1.3 整型数据,2.1.3.1 整型常量 十进制整型常量:十进制整常数没有前缀。 八进制整型常量:以数字0作为前缀。所用数码为07。八进制数通常是无符号数。例如:012(十进制为10)、0103(十进制为67)、0177777(十进制为65535) 十六进制整型常量:十六进制整型常量以0X或0x为前缀。所用数码为09,AF或af。例如:0X1B(十进制为27)、0XC2(十进制为194)、0XFFFF(十进制为65535)。,2.1.3 整型数据,长整型数来表示,即在基本整型数后加大写字母“L”或小写字母“l”来表示。例如:72767L(十进制为72767)、0200000L(十进制为65536)、0X21FFFL(十进制为139263)等。长整型数占4个字节(32位)存储空间。 整型常量的无符号数的后缀为“U”或“u”。例如: 625u,0x12Du,115Lu 均为无符号数。 程序中是根据前缀来区分各种进制数的。整型常量后面加u或U,则认为是unsigned int型,整型常量后面加l或L,则认为是long int型。,2.1.3 整型数据,2.1.3.2 整型变量 整型变量用来存放整型常量。整型变量按其取值范围可分为以下几类: 基本型 类型说明符为int,在内存中占2个字节,其取值为基本整常数。 短整型 类型说明符为short int或short。所占字节和取值范围均与基本型相同。 长整型 类型说明符为long int或long ,在内存中占4个字节,其取值为长整型数。,2.1.3 整型数据,整型变量还可添加类型说明符unsigned,表示该变量是无符号型变量。无符号型与上述三种类型匹配可构成: 无符号基本型 类型说明符为unsigned int或unsigned。 无符号短整型 类型说明符为unsigned short 无符号长整型 类型说明符为unsigned long,2.1.3 整型数据,例2.2 整型变量的定义与使用 #include void main() int a,b,c,d; /*指定、为整型变量* unsigned ; *指定为无符号整型变量* 12;-24;10; ; printf(”,”,); ,说明: 可以看到不同种类的整型数据可以进行算术运算,运行结果: +=22,+=-14,2.1.3 整型数据,2.1.3 整型数据,2.1.3.3 整型数据在内存中的存储方式 一个数分为正数和负数,在计算机中为了表示数,可以采用多种方法,一般有原码、反码、补码这三种表示形式,实际上,在计算机中,数值是用补码表示的。 原码:将最高位作为符号位(以0代表正,1代表负),其余各位代表数值本身的绝对值,即转换成相应的二进制形式,我们以短整型(int)来举例: +7的原码:0000000000000111 -7的原码:1000000000000111,2.1.3 整型数据,反码:一个数如果为正,则它的原码与反码表示方法相同;一个数如果为负,则符号位为1,其余各位是对原码取反。 +7的反码:0000000000000111 -7的反码:1111111111111000 补码:在计算机中,数值是用补码表示的。一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。 +7的补码:00000000 00000111 -7的补码:第一步,7的原码:00000000 00000111 第二步,按位取反:11111111 11111000 第三步,整个数+1,得-7的补码:11111111 11111001,2.1.3 整型数据,已知一个负数的补码,将其转换为十进制数:步骤如下: (1)先将各位取反; (2)将其转换为十进制数; (3)加上负号,再减去1。 例如:1111111111111010,最高位为1,是负数,先对各位取反得0000000000000101,转换为十进制数得5,加上负号得-5,再减1得-6。,2.1.4 实型数据,2.1.4.1 实型常量 实数有两种表示形式:小数形式和指数形式。 小数形式 由数码09和小数点组成。 指数形式 指数形式也称科学计数法,由十进制小数加阶码标志“e”或“E”以及阶码组成。指数表示的一般形式为:a E n (a为十进制实数,n为十进制整数)表示a10 n。 注意:实型常数不分单、双精度,都按双精度double型处理。,2.1.4 实型数据,2.1.4.2 实型变量 实型变量同其他类型的变量一样,必须在使用前声明。实型变量分为两类:单精度实型和双精度实型。 float为单精度说明符,double为双精度说明符。 单精度型占4个字节(32位)内存空间,其数值范围为3.4E-383.4E+38,只能提供七位有效数字。 双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-3081.7E+308,可提供16位有效数字。,2.1.4 实型数据,例2.3 实型变量的定义与使用 #include void main() float a; double b; a=1.0/3; b=1.0/3; printf(“a=%.20fnb=%.20fn“,a,b); ,2.1.5 字符型数据,字符型 char 字符,一般是1个字节长, 用来表示256个ASCII字符,或者0255的整数,2.1.5 字符型数据,2.1.5.1 字符常量 字符类型常量或变量都占用1个字节。字符型变量用于存放一个ASCII码。C语言是把字符型的数据当成整型数处理的,因此,对于整型数据的所有处理均可用于字符型数据。 在C语言中,字符型常量是由一对单引号引起来的单个字符构成。例如:A,5,$等。 a的ASCII码为:(十六进制65,十进制97),0 1 1 0 0 0 0 1,2.1.5 字符型数据,字符常量有以下特点: 字符常量只能用单引号括起来,不能用双引号或其它括号。 字符常量只能是单个字符,不能是字符串。 字符常量占用一个字节的存储单元,而实际在存储单元内存放的是该字符的ASCII码值,即一个整型量。因此,字符常量可以参加数值运算。,2.1.5 字符型数据,例2.4 字符型变量的定义与使用 #include void main() char m=a; printf(“%cn“,m); ,字符常量,转义字符常量 单引号括起来的 与可视字符组合,例如:,2.1.5 字符型数据,#include void main() printf(“1t2t3t4n“); ,#include void main() printf(“Yb=n“); ,2.1.5 字符型数据,#include void main() printf(“101 x42 Cn“); printf(“He said:“Thank you“n“); printf(“C Programn“); printf(“Turbo C n“); ,2.1.5 字符型数据,字符数据在内存中的存储形式及其使用方法 一个字符常量存放到一个字符变量中,即将该字符的相应的ASCII代码放到存储单元中。因而字符型数据和整型数据之间可以通用。,注意: 一个字符数据既可以以字符形式输出,也可以以整数形式输出。 可以对字符数据进行算术运算, 此时相当于对它们的码进行算术运算。,2.1.5 字符型数据,2.1.5.2 字符串常量 字符串常量是由一对双引号括起的字符序列。例如:“ABC“、“123“、“a“、 “nt “、“nGood morning“等都是合法的字符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别: 字符常量由单引号括起来,字符串常量由双引号括起来。 字符常量只能是单个字符,字符串常量则可以包含一个或多个字符。,2.1.5 字符型数据,可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个字符变量。在语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量。这一内容将在数组一章详细介绍。 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中用来存放字符串结束标志字符“0”(ASCII码为0)。 字符串 “C program“在内存中的存储形式为:,2.1.5 字符型数据,2.1.5.3 字符型变量 同其他类型的变量一样,必须在使用前声明。字符型变量占一个字节,字符型变量的取值是字符常量,即单个字符。类型说明符是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的二进制代码: c1 0 1 1 1 1 0 0 0 x c2 0 1 1 1 1 0 0 1 y 所以也可以把它们看成是整型量。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。,2.1.5 字符型数据,#include void main( ) int sum=0; sum=sum+a; printf(“sum=%dn“,sum); ,2.1.5 字符型数据,#include void main() char tab; tab=t; printf(“1%c2%c3%c4n“,tab,tab,tab); ,2.1.5 字符型数据,#include void main() char c1=A; int y; y=c1+32; printf(“c1:%c,%dn“,c1,c1); printf(“y:%c,%dn“,y,y); ,2.2 标准输入输出函数,本节内容,2.2.2 格式输出函数printf,2.2.1 格式输入函数scanf,标准输入输出函数,C语言本身不提供输入输出语句,输入和输出操作是由C函数库中的函数来实现 例如: 字符输入函数: getchar 字符输出函数: putchar 格式输入函数: scanf 格式输出函数: printf 字符串输入函数:gets 字符串输出函数:puts,在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。 例如:在调用标准输入输出库函数时,文件开头应该有: #include “stdio.h” 或: #include ,2.2.1 格式输入函数scanf,此处所说的数据输入指的是程序从键盘上输入数据。 注意:scanf()函数的声明包含在stdio.h头文件中。因此,要调用这个函数,必须在程序开始处添加#include预处理命令。 格式 int scanf(“格式化字符串”,地址表);,2.2.1 格式输入函数scanf,参数说明 地址表:地址表是一系列要求输入数据的变量地址。对普通变量而言,变量地址就在变量前加“ 变量n的地址是&n。 格式化字符串:格式化字符串包括空白字符、非空白字符和格式说明符3部分。 scanf()函数按从左到右的顺序扫描格式化字符串,对其进行处理。,2.2.1 格式输入函数scanf,空白字符包括空格、“t”水平制表符和“n”回车换行符等。空白符将被跳过。 非空白字符包括除百分号“%”以外的所有ASCII字符。非空白符必须原样输入。 格式说明符用于规定所读入数据的类型,它是由百分号加特定字符组成。 常用格式说明符及含义如表:,2.2.1 格式输入函数scanf,2.2.1 格式输入函数scanf,格式说明符按从左到右的顺序与地址表中的各参数相匹配,格式说明符的个数要与参数表中的参数个数相同。,2.2.1 格式输入函数scanf,#include void main() int a,b,c,sum; printf(“Please input a,b,c:n“); scanf(“%d,%o,%x“, ,2.2.1 格式输入函数scanf,#include void main() float x,y,sum,product; scanf(“x=%f y=%f“, ,2.2.1 格式输入函数scanf,#include void main() char ch; printf(“please input a letter:n“); scanf(“%c“, ,2.2.2 格式输出函数printf,数据输出是指在屏幕输出(显示)数据。 要调用这个函数,必须在程序开头添加#include预处理命令。 格式 int printf(“格式化字符串”,参量表); 用途 可将多项字符、数值(整型或实型)和字符串格式化后,输出到标准输出设备上。,2.2.2 格式输出函数printf,参数说明 参量表:参量表是任选项(根据程序具体需要,可有可无),是一系列要输出的数据项,它们可以是整型、实型、字符型及字符串常量或变量,也可以是运算表达式。 格式化字符串:格式化字符串是右双引号引起来的一个字符串。 格式化字符串是由普通字符、转义字符、格式说明符三部分组成。,2.2.2 格式输出函数printf,普通字符:printf()函数将根据普通字符出现的先后次序直接照原样显示输出。 转义字符:printf()函数将根据转义字符所具有的含义进行输出处理。 格式说明:用来规定各项输出数据的输出类型和输出格式,通常和参量表中的变量或表达式一一对应。,2.2.2 格式输出函数printf,2.2.2 格式输出函数printf,#include void 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.2.2 格式输出函数printf,#include void main() float x,y; scanf(“%f %f“, ,2.2.2 格式输出函数printf,附加字符的使用 对于格式说明,%和格式字符之间也可以插入一些附加字符,其一般形式如下: %-+#m.nl格式规定符 中括号“”和“”括起来的各项为任选项,它们用来限定输出数据项的格式;而格式规定符用来限定各输出数据类型。,2.2.2 格式输出函数printf,2.2.2 格式输出函数printf,#include void main() int x=123; printf(“%-10d“,x); /“-”指定左对齐,m指定宽度为10 printf(“n“); printf(“%10d“,x); /m指定宽度为10,默认右对齐 printf(“n“); ,2.2.2 格式输出函数printf,#include void main() float x=123.456; printf(“x=%.2fn“,x); /n指定小数点后保留2位 printf(“x=%10.2fn“,x); /m指定宽度为10 ,2.3 运算符与表达式,C语言的语句是由表达式构成的,因此C语言又被称为表达式语言。 由于C语言含有相当丰富的运算符,因此构成的表达式也是多种多样,可以表示各种运算功能。 C语言的运算符非常丰富,使用方法也比较独特。 C语言有40多个运算符 单目运算符:只需要一个运算对象 双目运算符:需要两个运算对象参加 三目运算符:需要三个运算对象参加,2.3 运算符与表达式,2.3 运算符与表达式,表达式是由运算符连接常量、变量、函数所组成的式子。 根据运算符的不同可以把表达式分为:算术表达式、赋值表达式、逻辑表达式、关系表达式、条件表达式等。 任意一个表达式最终总是可以得到一个确定的值,也就是说C表达式本质就是一个值,因此表达式中如果有变量,则该变量必须是已赋过值的。 需注意的是:如果表达式中出现多个运算符,则表达式的求值顺序要按运算符的优先级和结合性的规定进行。,2.4 算术运算符和算术表达式,2.4.2 算术表达式,2.4.3 算术运算符的优先级和结合性,2.4.1 算术运算符,本节内容,2.4.1 算术运算符,“+”(加法运算符) “-”(减法运算符或负值运算符) “*”(乘法运算符) “/”(除法运算符) C语言的除法运算比较特殊,当两个整型数相除时,结果为整型数,其商只取整数部分,小数部分自动舍弃。 而有实型数参加的除法运算,结果为double实数,要保留小数部分。,2.4.1 算术运算符,#include void main() printf(“%d,%dn“,30/4,-30/4); printf(“%f,%fn“,30.0/4,-30.0/4); ,2.4.1 算术运算符,“%”(求余运算符或称为模运算符) 该运算要求运算符两边的操作数必须为整型或字符型数据,其结果(余数)也是一个整型或字符型数据。求余运算不能用于实型数。求余运算的结果等于两数相除后的余数。通常百分号左边的数比较大,结果自然就是整除后的余数,比如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 在程序设计中有时需要将一些特殊的数学公式写成算术表达式,需要用到C语言的库函数。 y=|x-y|,调用方法为y=abs(x-y)。,2.4.3算术运算符的优先级和结合性,优先级:存在混合运算的表达式中,必须规定各种运算的先后顺序,才能保证结果的唯一性,这个规定的先后顺序就是运算符的优先级。 若一个运算对象两侧的运算符优先级不同,则按规定的优先级进行运算。如:a+b*c 结合性:若一个运算对象两侧的运算符优先级相同,则必须规定运算对象先与哪一侧的运算符结合,规定与左侧先结合的称为“左结合性”(自左至右)。如:abc、a+b-c。 规定与右侧先结合的称为“右结合性”(自右至左)。如:-i+、!a+。,运算符优先级口诀,2.4.3算术运算符的优先级和结合性,算术运算符的优先级和结合性。,2.5 自增自减运算符及其表达式,运算符: + - 表达式: +E -E E+ E- 注:E为整型或实型变量。,2.5 自增自减运算符及其表达式,使用说明: 自增运算符“+”的作用是对操作数进行增1运算;自减运算符是对操作数进行减1运算。注意,“+ ”和“-”的运算对象只能是变量(或运算结果是变量的表达式), 不能是常量(或运算结果是数值的表达式)。 5+、(a+b )+ 都是不合法的表达式。 运算符+或-在操作数前(左)边的表达式称为前缀运算,在操作数后(右)边的运算称为后缀运算。 +x; -a; /前缀运算 n-; a-; /后缀运算,2.5 自增自减运算符及其表达式,当+和-作为前缀运算符时,被运算的变量(操作数)先自增(减)1,然后该变量的新值再参加表达式中其他运算。,#include void main( ) int i=1,n; n=+i; printf(“%d,%dn“,i,n); ,2.5 自增自减运算符及其表达式,当+和-作为后缀运算时,则先进行其他运算或操作。然后被运算的变量(操作数)再进行自增(减)运算。,#include void main( ) int i=1,n; n=i+; printf(“%d,%dn“,i,n); ,2.5 自增自减运算符及其表达式,自增和自减运算符都具有右结合性,结合方向为从右到左。 a+ 等价于 -(a+) 如果有多个运算符连续出现时,C系统尽可能多的从左到右将字符组合成一个运算符。 i + j 等价于 ( i+)+j -i+-j 等价于 -(i+)+(-j) (略)函数参数的求值顺序:在TC中,先计算最右边的参数值,再依次计算左边的参数值。 在Visual C+ 6.0中,是各项同时取值。,2.5 自增自减运算符及其表达式,#include void main( ) int i=1,j=1; i+; +j; printf(“%d,%dn“,i,j); ,#include void main( ) float i=9,j=3; float m; m=i+/-j; printf(“%.2fn“,m); ,2.5 自增自减运算符及其表达式,有关表达式中的问题说明:如果对于表达式E1+E2,并不是所有的编译系统都先调用E1,然后调用E2。例如,i的初值是5,有以下表达式: (i+)+(i+)+(i+) 在Turbo C 2.0下,按照自左而右顺序求解括弧内的运算,求完第1个括弧的值后,实现i的自增,i变为5,再求第2个括弧的值,结果表达式相当于5+6+7,即18。 而在Visual C+6.0下把5作为表达式中所有i的值,因此3个i相加,得到的表达式的值是15。在求出整个表达式的值后再实现自加3次,i的值变为8。 读者在编程时应尽量避免这种歧义性。,2.5 自增自减运算符及其表达式,#include void main( ) int a=3,m; m=(a+)+(a+); printf(“%d,%dn“,a,m); ,Visual C+6.0将3作为表达式中所有a的值,计算后再实现2次自增。所以m的值是6。,2.6 赋值运算符和赋值表达式,本节内容,2.6.2 赋值运算中的数据转换,2.6.3 复合赋值运算符及表达式,2.6.1 简单赋值运算符和表达式,2.6 赋值运算符和赋值表达式,C语言提供的赋值运算符有如下三类: 简单赋值运算符:= 复合算术赋值运算符:+=、-=、*=、/=、%= 复合位赋值运算符:&=、|=、=、=、= 由赋值运算符将一个变量和一个表达式联接构成的式子就是赋值表达式。,2.6.1 简单赋值运算符和表达式,简单赋值运算符的功能是将其右侧表达式的值赋给左侧的变量,赋值表达式的一般形式为: 变量名=表达式 在赋值表达式中,“=”称为赋值运算符,而不是等号。 左操作数必须是变量,不能是常量或表达式。右操作数可以是常量、变量或表达式。 赋值表达式的计算过程是:先计算出右操作数的值,然后赋给左边的变量。,2.6.1 简单赋值运算符和表达式,C语言允许在同一个赋值语句中对多个变量进行赋值,赋值运算规则是从右向左。 a=b=c=1; 表达式x=(a=3)+(b=6)在C语言中也是合法的。它的意义是把3赋给a,6赋给b,再把a,b相加,和赋给x ,故x应等于9 当左操作数和右操作数类型不同时,在赋值运算之前,要先将右操作数的类型转成与左操作数相同的类型,然后再进行赋值。这种类型的转换是C语言自动完成的。,2.6.2 赋值运算中的数据转换,当赋值运算符两边的运算量类型不同时,系统将自动进行类型转换,即把赋值运算符右侧表达式的类型换成左侧变量的类型。具体规定如下: 整型与实型 实型数据赋予整型变量时,舍去小数部分,只保留整数部分; 整型数据赋予实型变量时,数值不变,但以浮点数据形式存储在变量中,即小数点后加若干个0。,2.6.2 赋值运算中的数据转换,整型与字符型 整型数据赋予字符型变量时,只保留其最低8位,高位部分全部舍弃; 字符型数据赋予整型变量时,由于字符型数据占用一个字节存储单元,而整型数据为两个字节存储单元,故将字符的ASCII码值放到整型变量的低8位中,高8位另作处理。分两种情况。 如果系统将字符处理为无符号的数据类型,则高8位全部补0; 如果系统将字符处理为有符号数据类型,若字符最高位为0,则整型变量高8位全部补0;若字符最高位为1,则整型变量高8位全部补1;(叫做:符号扩展),2.6.2 赋值运算中的数据转换,#include void 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.6.2 赋值运算中的数据转换,单、双精度实型 C语言中的实型值总是用双精度来表示的,凡是float型数据只要在其尾部加0延长为double 型数据进行计算,然后直接赋值即可;而double型数据转换为float型数据时,需要截尾数,在截断前要先进行四舍五入操作。 整型与长整型 一个long型数据赋给int型变量时,将其低16位值赋给int型变量,而将高16位截断舍弃; 一个int型数据赋给long型变量时,其外部形式不发生变化,但其内部存放形式会有变化,即进行符号扩展,如果原int型数据是正值,那么将int型数据送入long型变量的低16位,高16位全部补0,反之将long型变量的高16位全部补1。(VC中:int型和long型长度相等),2.6.2 赋值运算中的数据转换,无符号整型 一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时,将其原样赋予,内部存储方式不发生任何改变,但其外部表现形式是有符号的,因此值可能会有所改变。 一个非unsigned型数据赋给一个占据同样长度存储单元的unsigned型变量时,原样赋值,即内部存储形式不会改变,但其外部表现形式总是无符号的,值有时会发生改变。 C语言的这种赋值时的类型转换相对灵活一些,对于许多初学者来说会觉得复杂难记,在实际调试程序的过程中经常会出现错误却又找不到问题所在,因此建议读者在编写程序的过程中尽量用强制类型转换,以便增加程序的可读性。,2.6.2 赋值运算中的数据转换,#include void 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.6.3 复合赋值运算符及表达式,把一个变量的值先取出来进行运算之后再赋给该变量,类似于表达式i=i+2的运算。这时可以用复合赋值运算符来表示,赋值运算符“=”之前加上其它双目运算符可构成复合赋值运算符。复合赋值表达式的一般形式是: E1 OP= E2 该表达式等价于:E1=E1 OP E2。 复合算术赋值运算符(+=、-=、*=、/=、%=)和复合位赋值运算符(&=、|=、=、=、=),复合位赋值运算符将在位运算符中介绍。,2.6.3 复合赋值运算符及表达式,关于复合算术赋值运算的几点说明: 复合赋值运算符在书写时,两个运算符之间不能有空格; 从复合赋值表达式与其等价形式的比较可以看出,复合赋值表达式中的左操作数E1必须是变量,不能是常量或表达式;右操作数E2可以是常量、变量或表达式。 例如,下面复合赋值表达式是正确的: x+=2; 等价于x=x+2 x*=2+y; 等价于x=x*(2+y) 下列等价于i=i+2表达式是非法的: 2+=3; x+1=5;,2.6.3 复合赋值运算符及表达式,复合赋值运算过程是:先计算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 关系运算符,在程序中经常需要比较两个数据量的大小关系,以决定程序下一步的工作。比较两个数据量的运算符称为关系运算符。语言提供了以下关系运算符: 大于 = 大于或等于 = 等于 != 不等于,2.7.1 关系运算符,说明: 关系运算符都是双目运算符,其结合性均为左结合。 在六个关系运算符中,、=的优先级相同,并高于=和!=,=和!=的优先级相同。 关系运算符的优先级高于赋值运算符但低于算术运算符。 关系运算符“=”和赋值运算符“=”不同。 如果关系运算的两个操作数类型不同,则低类型向高类型看齐,统一类型后,再进行关系运算。,2.7.2 关系表达式,用关系运算符将两个运算量连接起来构成的式子就是关系表达式。关系表达式的一般形式如下: E1 OP E2 关系表达式的值为逻辑值True和False。在C语言中,关系表达式运算结果为“真”和“假”是通过整型数1和0来表示的。如果关系式成立,则得到一个int类型的1值;否则运算结果得到一个int类型的0值。 例如:212、 (x=5)(y=2)、BA 、 33.5,2.7.2 关系表达式,#include void main() int a=3,b=2,c; c=2*a=b,a=b,a!=b); printf(“c=%dn“,c); ,2.7.2 关系表达式,#include void main() char a=f; int i=1,j=2,k=3; float x=2e+5,y=0.55; printf(“%d,%dn“,a+6=a+1); printf(“%d,%dn“,1j5,x-5.25=x+y); printf(“%d,%dn“,i+j+k=-2*j,k=j=i+5); ,2.8 逻辑运算符和逻辑表达式,本节内容,2.8.2 逻辑运算的值,2.8.3 逻辑表达式,2.8.1 逻辑运算符,2.8.1 逻辑运算符,逻辑运算符是指用形式逻辑原则来建立数值间关系的符号。语言中提供了三种逻辑运算符: & 逻辑与 | 逻辑或 ! 逻辑非 与运算符&和或运算符|均为双目运算符。具有左结合性。非运算符!为单目运算符,具有右结合性。 逻辑非的优先级最高,逻辑与次之,逻辑或最低,即:!(非)&(与)|(或) 逻辑运算的优先级低于算术运算符和关系运算符 。,2.8.2 逻辑运算的值,逻辑运算的结果同关系运算的结果一样,只有“真”和“假”两种,也是用“1”和“0 ”来表示。 其求值规则如下: a&b a、b 同时为真,则 a&b 为真,否则为假。 a|b a、b中只要有一个为真,则a|b为真;只有两个量都为假时,结果才为假。 !a a为真,则!a为假;a为假,则!a为真。 对于真和假,掌握这样一条原则,非0即为真。,2.8.2 逻辑运算的值,C语言的逻辑运算符及其含义 ! a 当且仅当a为真时,!a为假 a&b 当且仅当 a、b 同真时, a&b为真 a|b 当且仅当a、b之一为真时,a|b为真,2.8.2 逻辑运算的值,逻辑运算规则 在判断一个逻辑量时,以0为假,非0数值为真 在给出逻辑运算值时,以1为真,以0为假,2.8.3 逻辑表达式,由逻辑运算符将一个或多个表达式连接起来的式子称为逻辑表达式。 E1 OP E2 扩展开来就是3种: 与运算:E1 & E2 或运算:E1 | E2 非运算:! E 其中运算符左右两边的操作数还可以是逻辑表达式,从而组成嵌套的逻辑表达式。例如:(a&b)&c根据逻辑运算符的左结合性,上式也可写为:a&b&c 逻辑表达式的值是式中各种逻辑运算的最后值,也是以1和0分别代表真和假。,2.8.3 逻辑表达式,几点说明: 逻辑运算符两侧的操作数,除可以是和非的整数外,也可以是其它任何类型的数据,如实型、字符型等。 在计算逻辑表达式时,只有在必须执行下一个表达式才能求解时,才求解该表达式,即并不是所有的表达式都被求解。(逻辑短路) 对于逻辑与运算,如果第一个操作数被判定为“假”,系统不再判定或求解第二操作数。 例如:c=(34),2.8.3 逻辑表达式,#include void main() char c=k; int i=1,j=2,k=3; float x=3e+5,y=0.85; printf(“%d,%dn“,!x*!y,!x); printf(“%d,%dn“,x|i ,2.9 其它类型运算符和表达式,本节内容,2.9.2 逗号运算符和逗号表达式,2.9.3 位运算符与简单的位运算,2.9.1 条件运算符和条件表达式,2.9.1 条件运算符和条件表达式,条件运算符为:? :,它是一个三目运算符,由条件运算符组成条件表达式的一般形式为: E1? E2: E3 例如上述条件语句可用条件表达式改写为 max=(ab)?a:b; 条件表达式求值规则:首先计算表达式1;若其值为真(非0),则计算表达式2,作为整个条件表达式的值;否则,计算表达式3,作为整个条件表达式的值。 注意以下几点: 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。因此 max=(ab)?a:b可以去掉括号而写为 max=ab?a:b,2.9.1 条件运算符和条件表达式,条件运算符?和:是一对运算符,不能分开单独使用。 条件运算符的结合方向是自右至左。例如: ab?a:cd?c:d应理解为ab?a:(cd?c:d),这也就是条件表达式嵌套的情形,即其中的E3又是一个条件表达式。 条件表达式中E2和E3不仅可以是数值表达式,还可以是赋值表达式或函数表达式。 例如:ab? printf(“%d”,a): printf(“%d”,b); 条件表达式中E1的类型可以与E2和E3的类型不同。 例如:32?a:b是合法的条件表达式,结果是a。,2.9.1 条件运算符和条件表达式,#include void main( ) int a=18,b=35,c=21,d=96; int max; max=(ab)?a:b; max=(maxc)?max:c; max=(maxd)?max:d; printf(“max=%dn“,max); ,2.9.2 逗号运算符和逗号表达式,在语言中逗号“,”除了做分隔符外它也是一种运算符,称为逗号运算符。其功能是把若干表达式连接起来组成一个表达式,称为逗号表达式。逗号表达式的一般形式为: E1,E2 逗号表达式的求值过程是分别计算两个表达式的值,并以E2的值作为整个表达式的值。,2.9.2 逗号运算符和逗号表达式,#include void main( ) int a=2,b=4,c=6,x,y; y=( (x=a+b),(b+c); printf(“y=%d,x=%d“,y,x); ,2.9.2 逗号运算符和逗号表达式,几点说明: 逗号表达式一般形式中的表达式1和表达式2 还可以是逗号表达式。即形成逗号表达式的扩展形式: E1,E2 ,E3 ,En 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。在C语言中,常见的逗号表达式是在循环语句(for语句)中,在第3章详细介绍。 并不是在所有出现逗号的地方都组成逗号表达式,如在上例程序的变量说明中,逗号只是一个间隔符,在函数参数表中逗号也只是用作各变量之间的分隔符。,2.9.3 位运算符与简单的位运算,所谓位运算就是以二进制位为单位进行的数据处理,前面所讲的各类运算都是以字节为单位进行操作的,而在实际应用中例如系统软件,经常需要对二进制位进行操作,即按位运算。C语言和其它高级语言不同的是它完全支持按位运算。它与汇编语言的位操作有些相似。这使得语言也能像汇编语言一样用来编写系统程序。 (略),2.

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论