版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 数据类型,
2、圆的半径为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,存放时是否有区别
3、?,涉及数据类型 的基本知识,2.1 数据类型,C语言 数据类型,数组类型 结构体类型 共用体类型 枚举类型,整型 字符型 实型(浮点型),基本类型,指针类型,构造类型,空类型,单精度型 双精度型,2.1.1 标识符,C程序是基本字符的序列。 基本字符包括: 数字(09) 大小写字母(az,AZ) 标点符号 特殊字符:空格、换行、制表符等,起分隔的作用。增删空白一般不影响程序的意义。,2.1.1 标识符,标识符是一个字符序列,用来标识程序中用到的常量、变量、函数、数组、语句标号以及符号常量等的名称。 C语言规定标识符应满足以下规则: 只能由字母、下划线和数字组成 第一个字符不能是数字 标识符中
4、的字母区别大小写 不能使用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 预定义标识符 总是以固定的形式用于专门的地方,例如标识库函数名和编译预处理命令。 编译预
5、处理命令: 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
6、,$,s。 字符串常量:Good morning,how are you。,2.1.2 常量与变量,符号常量:是用标识符表示一个数据。定义符号常量: #define 标识符 常量 #define是一条预处理命令,称为宏定义,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。习惯上符号常量的标识符用大写字母。 #define PI3.14159 标识符PI代表常量3.14159。程序中,凡是出现标识符PI的地方都用3.14159替换。,例2.1在程序中使用符号常量 #define PRICE 30#include void main ( ) in
7、t 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 常量与
8、变量,2.1.2.2 变量 变量代表内存中具有特定属性的一个存储单元,它用来存放数据,也就是变量的值,在程序运行期间,这些值是可以改变的。 变量名实际上是一个以一个名字对应代表一个地址,在对程序编译连接时由编译系统给每一个变量名分配对应的内存地址。从变量中取值,实际上是通过变量名找到相应的内存地址,从该存储单元中读取数据。,2.1.2 常量与变量,2.1.2.2 变量 C语言中要求对所有用到的变量作强制定义,也就是“先定义,后使用” 。 在定义变量时要指定变量名和变量的数据类型,也可以同时为定义的变量赋初值。变量的数据类型决定了编译系统为其分配的空间大小。 变量 “先定义,后使用” 的目的:
9、未定义的,系统不作为变量名(编译时出错); 编译时为变量分配相应存储单元; 根据变量类型,检查运算是否合法,如整型变量的求余运算 a%b,2.1.2 常量与变量,变量定义必须放在变量使用之前,一般放在函数体的开头部分,之后是程序的执行语句。主函数main()的结构为: main() 变量声明语句 执行语句序列 ,2.1.2 常量与变量,定义变量的语句格式为: 类型 变量表; 类型可以是int、float、char、void或自定义类型。变量表可以是一个或多个变量名,各变量之间要用逗号分开,声明语句要以分号作为结束。 int abc; /声明一个名为abc的整型变量 float m,n,p; /
10、声明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或0 x为前缀。所用数码为09,AF或af。例如:0X1B(十进制为27)、0XC2(十进制为194)、0XFFFF(十进制为65535)。,2.1.3 整型数据,长整型数来表示,即在基本整型
11、数后加大写字母“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 整型变量 整型变量用来存放整型常量。整型变量按其取值范围可分为以下几类: 基本型 类型说明符为int,
12、在内存中占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
13、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代表负),其余各位代表数值本身的绝对值,即转换成相应的二进制形式,
14、我们以短整型(int)来举例: +7的原码:0000000000000111 -7的原码:1000000000000111,2.1.3 整型数据,反码:一个数如果为正,则它的原码与反码表示方法相同;一个数如果为负,则符号位为1,其余各位是对原码取反。 +7的反码:0000000000000111 -7的反码:1111111111111000 补码:在计算机中,数值是用补码表示的。一个数如果为正,则它的原码、反码、补码相同;一个数如果为负,则符号位为1,其余各位是对原码取反,然后整个数加1。 +7的补码:00000000 00000111 -7的补码:第一步,7的原码:00000000 0000
15、0111 第二步,按位取反: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和小数点组成。 指数形式 指数形式也称科学计
16、数法,由十进制小数加阶码标志“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
17、位有效数字。,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语言中,字符型常量是
18、由一对单引号引起来的单个字符构成。例如: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); ,字符常量,转义字符常量 单引号括起来的
19、与可视字符组合,例如:,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 youn); printf(C Programn); printf(Turbo C n); ,2.1.5 字符型数据,字符数据在内存中的存储形式及其使用方法 一个字符常量存放到一个字符变量中,即将该字符的相应的ASCII代码放到存储单元中。因而字符型数
20、据和整型数据之间可以通用。,注意: 一个字符数据既可以以字符形式输出,也可以以整数形式输出。 可以对字符数据进行算术运算, 此时相当于对它们的码进行算术运算。,2.1.5 字符型数据,2.1.5.2 字符串常量 字符串常量是由一对双引号括起的字符序列。例如:ABC、123、a、 nt 、nGood morning等都是合法的字符串常量。字符串常量和字符常量是不同的量。它们之间主要有以下区别: 字符常量由单引号括起来,字符串常量由双引号括起来。 字符常量只能是单个字符,字符串常量则可以包含一个或多个字符。,2.1.5 字符型数据,可以把一个字符常量赋予一个字符变量,但不能把一个字符串常量赋予一个
21、字符变量。在语言中没有相应的字符串变量,但是可以用一个字符数组来存放一个字符串常量。这一内容将在数组一章详细介绍。 字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中字符数加1。增加的一个字节中用来存放字符串结束标志字符“0”(ASCII码为0)。 字符串 C program在内存中的存储形式为:,2.1.5 字符型数据,2.1.5.3 字符型变量 同其他类型的变量一样,必须在使用前声明。字符型变量占一个字节,字符型变量的取值是字符常量,即单个字符。类型说明符是char。例如,声明两个字符型变量: char c1,c2; 在声明时,也可以直接赋初值: char c1=x, c2
22、=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 x c20 1 1 1 1 0 0 1 y 所以也可以把它们看成是整型量。语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在输出时,允许把字符变量按整型量输出,也允许把整型量按字符量输出。,2.1.5 字符型数据,#include void main( ) int sum=0; sum=sum+a; p
23、rintf(“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语言本身不提供输入输出语句,输入和输出操作
24、是由C函数库中的函数来实现 例如: 字符输入函数: getchar 字符输出函数: putchar 格式输入函数: scanf 格式输出函数: printf 字符串输入函数:gets 字符串输出函数:puts,在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中。 例如:在调用标准输入输出库函数时,文件开头应该有: #include “stdio.h” 或: #include ,2.2.1 格式输入函数scanf,此处所说的数据输入指的是程序从键盘上输入数据。 注意:scanf()函数的声明包含在stdio.h头文件中。因此,要调用这个函数,必须在程序开始
25、处添加#include预处理命令。 格式 int scanf(“格式化字符串”,地址表);,2.2.1 格式输入函数scanf,参数说明 地址表:地址表是一系列要求输入数据的变量地址。对普通变量而言,变量地址就在变量前加“ 变量n的地址是 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; print
26、f(please input a letter:n); scanf(%c, ,2.2.2 格式输出函数printf,数据输出是指在屏幕输出(显示)数据。 要调用这个函数,必须在程序开头添加#include预处理命令。 格式 int printf(“格式化字符串”,参量表); 用途 可将多项字符、数值(整型或实型)和字符串格式化后,输出到标准输出设备上。,2.2.2 格式输出函数printf,参数说明 参量表:参量表是任选项(根据程序具体需要,可有可无),是一系列要输出的数据项,它们可以是整型、实型、字符型及字符串常量或变量,也可以是运算表达式。 格式化字符串:格式化字符串是右双引号引起来的一个
27、字符串。 格式化字符串是由普通字符、转义字符、格式说明符三部分组成。,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); /以八进制格式输出 pri
28、ntf(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,#inc
29、lude 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语言含有相当丰富的运算符,因
30、此构成的表达式也是多种多样,可以表示各种运算功能。 C语言的运算符非常丰富,使用方法也比较独特。 C语言有40多个运算符 单目运算符:只需要一个运算对象 双目运算符:需要两个运算对象参加 三目运算符:需要三个运算对象参加,2.3 运算符与表达式,2.3 运算符与表达式,表达式是由运算符连接常量、变量、函数所组成的式子。 根据运算符的不同可以把表达式分为:算术表达式、赋值表达式、逻辑表达式、关系表达式、条件表达式等。 任意一个表达式最终总是可以得到一个确定的值,也就是说C表达式本质就是一个值,因此表达式中如果有变量,则该变量必须是已赋过值的。 需注意的是:如果表达式中出现多个运算符,则表达式的求
31、值顺序要按运算符的优先级和结合性的规定进行。,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(
32、%f,%fn,30.0/4,-30.0/4); ,2.4.1 算术运算符,“%”(求余运算符或称为模运算符) 该运算要求运算符两边的操作数必须为整型或字符型数据,其结果(余数)也是一个整型或字符型数据。求余运算不能用于实型数。求余运算的结果等于两数相除后的余数。通常百分号左边的数比较大,结果自然就是整除后的余数,比如80%7的结果是3; 结果的符号与被除数相同。,2.4.2 算术表达式,算术表达式是由算术运算符和圆括号将运算量(常量、变量、函数)连接起来的式子。 需注意的是,C表达式中的所有字符都是写在一行上的,不能写成分式和上下标的形式。 以下是一些正确的算术表达式: a+b -(b/(2*
33、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 结合性:若一个运算对象两侧的运算符优先级相同,则必须规定运算对象先与哪一侧的运算符结合,规定与左侧先结合的称为“左结合性”(自
34、左至右)。如:abc、a+b-c。 规定与右侧先结合的称为“右结合性”(自右至左)。如:-i+、!a+。,运算符优先级口诀,2.4.3算术运算符的优先级和结合性,算术运算符的优先级和结合性。,2.5 自增自减运算符及其表达式,运算符: + - 表达式: +E -E E+ E- 注:E为整型或实型变量。,2.5 自增自减运算符及其表达式,使用说明: 自增运算符“+”的作用是对操作数进行增1运算;自减运算符是对操作数进行减1运算。注意,“+ ”和“-”的运算对象只能是变量(或运算结果是变量的表达式), 不能是常量(或运算结果是数值的表达式)。 5+、(a+b )+ 都是不合法的表达式。 运算符+或
35、-在操作数前(左)边的表达式称为前缀运算,在操作数后(右)边的运算称为后缀运算。 +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=
36、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
37、,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相加,
38、得到的表达式的值是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语言提供的赋值运算符有如下三类: 简单赋值运
39、算符:= 复合算术赋值运算符:+=、-=、*=、/=、%= 复合位赋值运算符: 表达式x=(a=3)+(b=6)在C语言中也是合法的。它的意义是把3赋给a,6赋给b,再把a,b相加,和赋给x ,故x应等于9 当左操作数和右操作数类型不同时,在赋值运算之前,要先将右操作数的类型转成与左操作数相同的类型,然后再进行赋值。这种类型的转换是C语言自动完成的。,2.6.2 赋值运算中的数据转换,当赋值运算符两边的运算量类型不同时,系统将自动进行类型转换,即把赋值运算符右侧表达式的类型换成左侧变量的类型。具体规定如下: 整型与实型 实型数据赋予整型变量时,舍去小数部分,只保留整数部分; 整型数据赋予实型变
40、量时,数值不变,但以浮点数据形式存储在变量中,即小数点后加若干个0。,2.6.2 赋值运算中的数据转换,整型与字符型 整型数据赋予字符型变量时,只保留其最低8位,高位部分全部舍弃; 字符型数据赋予整型变量时,由于字符型数据占用一个字节存储单元,而整型数据为两个字节存储单元,故将字符的ASCII码值放到整型变量的低8位中,高8位另作处理。分两种情况。 如果系统将字符处理为无符号的数据类型,则高8位全部补0; 如果系统将字符处理为有符号数据类型,若字符最高位为0,则整型变量高8位全部补0;若字符最高位为1,则整型变量高8位全部补1;(叫做:符号扩展),2.6.2 赋值运算中的数据转换,#inclu
41、de 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型变量,而
42、将高16位截断舍弃; 一个int型数据赋给long型变量时,其外部形式不发生变化,但其内部存放形式会有变化,即进行符号扩展,如果原int型数据是正值,那么将int型数据送入long型变量的低16位,高16位全部补0,反之将long型变量的高16位全部补1。(VC中:int型和long型长度相等),2.6.2 赋值运算中的数据转换,无符号整型 一个unsigned型数据赋给一个占据同样长度存储单元的整型变量时,将其原样赋予,内部存储方式不发生任何改变,但其外部表现形式是有符号的,因此值可能会有所改变。 一个非unsigned型数据赋给一个占据同样长度存储单元的unsigned型变量时,原样赋值,
43、即内部存储形式不会改变,但其外部表现形式总是无符号的,值有时会发生改变。 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 复合赋值运
44、算符及表达式,把一个变量的值先取出来进行运算之后再赋给该变量,类似于表达式i=i+2的运算。这时可以用复合赋值运算符来表示,赋值运算符“=”之前加上其它双目运算符可构成复合赋值运算符。复合赋值表达式的一般形式是: E1 OP= E2 该表达式等价于:E1=E1 OP E2。 复合算术赋值运算符(+=、-=、*=、/=、%=)和复合位赋值运算符( 等价于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。 注意表
45、达式两边的括号,如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 关系运算符,说明: 关系运算符都是双目运算符,其结合性均为左结合。 在六个关系运算符中,、=的优先级相同,并高于
46、=和!=,=和!=的优先级相同。 关系运算符的优先级高于赋值运算符但低于算术运算符。 关系运算符“=”和赋值运算符“=”不同。 如果关系运算的两个操作数类型不同,则低类型向高类型看齐,统一类型后,再进行关系运算。,2.7.2 关系表达式,用关系运算符将两个运算量连接起来构成的式子就是关系表达式。关系表达式的一般形式如下: E1 OP E2 关系表达式的值为逻辑值True和False。在C语言中,关系表达式运算结果为“真”和“假”是通过整型数1和0来表示的。如果关系式成立,则得到一个int类型的1值;否则运算结果得到一个int类型的0值。 例如:212、 (x=5)(y=2)、BA 、 33.5
47、,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 逻辑
48、表达式,2.8.1 逻辑运算符,2.8.1 逻辑运算符,逻辑运算符是指用形式逻辑原则来建立数值间关系的符号。语言中提供了三种逻辑运算符: 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 例如上
49、述条件语句可用条件表达式改写为 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又是一个条件表达式
50、。 条件表达式中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 逗号运算符和逗号表达式,在语言中逗
51、号“,”除了做分隔符外它也是一种运算符,称为逗号运算符。其功能是把若干表达式连接起来组成一个表达式,称为逗号表达式。逗号表达式的一般形式为: 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
52、 ,En 程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。在C语言中,常见的逗号表达式是在循环语句(for语句)中,在第3章详细介绍。 并不是在所有出现逗号的地方都组成逗号表达式,如在上例程序的变量说明中,逗号只是一个间隔符,在函数参数表中逗号也只是用作各变量之间的分隔符。,2.9.3 位运算符与简单的位运算,所谓位运算就是以二进制位为单位进行的数据处理,前面所讲的各类运算都是以字节为单位进行操作的,而在实际应用中例如系统软件,经常需要对二进制位进行操作,即按位运算。C语言和其它高级语言不同的是它完全支持按位运算。它与汇编语言的位操作有些相似。这使
53、得语言也能像汇编语言一样用来编写系统程序。 (略),2.10表达式的运算顺序和类型转换,本节内容,2.10.2 类型转换,2.10.1 表达式的运算顺序,2.10.1 表达式的运算顺序,表达式的运算顺序是运算符的优先级与结合性决定的。 2.10.1.1 优先级: 每个运算符都有优先级,优先级决定了表达式中各运算符进行运算的先后顺序。优先级高的先计算,优先级低的后计算。 2.10.1.2 结合性: 运算符的结合性规定了几个优先级相同的运算符连续出现时的计算顺序。运算符的结合性有从左到右和从右到左两种情况。 结合性为从左向右的运算符,其计算顺序是从左到右逐个进行。a+b-c,2.10.1 表达式的
54、运算顺序,结合性为从右到左的运算符,其计算顺序是是从右到左逐个进行。例如,由于赋值运算符的结合性为从右到左,所以,a=b=c=1的运算顺序是从右到左,它等价于a=(b=(c=1),即先将1赋给c,然后将c赋给b,最后将b赋给a。 下面这些运算符,将在后面相应的章节中介绍。 优先级为1的“.”成员选择符。 优先级为1的“-”成员选择符。 优先级为1的“ ”数组下标运算符。 优先级为2的“*”取内容运算符和“ float b; b=10/3.0; a=b; b的值为3.333333,a的值为3,损失了精度。,2.10.2 类型转换,如果赋值运算符右边的操作数类型比较低,则类型转换时,采用补齐方式。
55、这时不会损失精度。例如: int a; float b; a=9/3; b=a; a的值为3,而b的值为3.000000,精度没损失。,2.10.2 类型转换,2.10.2.3 强制类型转换 程序中有时需要将一些数据类型强制转换成所需类型,此时需通过类型转换运算来实现的。其格式为: (类型名)(操作数) 类型名为char ,int,long,float,double等。 例如,下列语句进行了强制类型转换: int a,b; float x; long m; m=(long)a; /强制转换a的类型为long型 x=(float)b; /强制转换b的值为float型,2.10.2 类型转换,在使
56、用强制转换时应注意以下问题: (1)类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x-y)写成(int)x-y则成了把x转换成int型之后再与y相加了。 (2)无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。,2.10.2 类型转换,#include void main() float x=112.75; printf(int)x=%d,x=%fn,(int)x,x); ,2.11 库函数,本节内容,2.11.2 标准库函数的调用,2.11.3 字符输入输出函数,2.11.1 标准库函数与头
57、文件,2.11.4 数学函数,2.11 库函数,函数有两大类:标准库函数和用户自定义函数。 C语言的强大功能很大程度上是由于它有丰富的库函数,编程者在程序设计中可以直接调用这些库函数完成各式各样的工作。库函数是系统已经定义好的可以直接调用的函数,本节我们就是要学习掌握调用标准库函数的基本方法; 用户自定义函数是编程者自己定义的函数,这部分内容在后面有专门的章节进行讲解。,2.11.1 标准库函数与头文件,ANSI C为用户提供了500多个库函数,按照其功能可大致分为以下几类: 输入输出函数 用于完成输入输出功能 数学函数 用于完成数学计算 字符和字符串处理函数 用于字符及字符串的操作和处理 内
58、存管理函数 用于内存单元的分配与管理 图形函数 用于处理图形 转换函数 完成转换运算 库函数被分类声明在不同的头文件中,用户必须用编译预处理命令(#include)把相应的头文件包含到程序中来。标准头文件如表2-13所示。,2.11.2 标准库函数的调用,在程序设计时,参照着这个函数的原型来调用。 返回值类型 函数名(参数表) 比如,我们查找到求绝对值函数abs ()的原型为:int abs(int ); abs为函数名,我们要调用时要书写的; 括号中的int表示这个函数参数只有一个,并且是int型的; 括号外的int表示这个函数的返回值类型。 函数调用时只写函数名和参数:函数名和原型一样;对于参数,括号中要写具体的参数值,参数类型要和函数原型中一致。,2.11.3 字符输入输出函数,2.11.3.1 字符输出函数 函数原型:int putchar(int) 功能:向标准输出设备(一般为显示器)输出一个字符,并返回输出字符的ASCII码值。 函数的参数可以是字符常量、变量或整型变量,即将一个整型数作为ASCII码,输出相应的字符。例如: putchar(i); putchar(n); putchar(ch);,2.11.3 字符输入输出函数,#include void
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 企业管理-病历管理制度
- 天津市东丽区2026届初三下学期3月联考数学试题含解析
- 江苏省苏州市梁丰重点达标名校2026年初三第四次模拟考试(5月)数学试题含解析
- 吉林省长春市教研室重点达标名校2026届初三第一次模拟数学试题试卷含解析
- 北京市崇文区名校2025-2026学年初三物理试题5月月考含解析
- 浙江省绍兴市海亮重点名校2025-2026学年初三练习题(一)(全国卷II)物理试题含解析
- 沈阳市铁西区重点中学2025-2026学年重点高中联盟领军考试4月初三物理试题(文)试题含解析
- 广东省汕头市科利园实验校2026年初三5月阶段质量检测试题数学试题含解析
- 山西省吕梁市蕴华国际双语校2026届第一次中考模拟考试物理试题含解析
- 江苏省宜兴市张渚徐舍教联盟重点中学2025-2026学年初三下学期期中数学试题含解析
- 2026中考英语复习必背口语听力高频重点词汇
- 农业大数据课件
- 2025《社会主义发展史》教学大纲
- 国家基层糖尿病管理防治培训试题及答案
- 工程标杆管理办法细则
- 尿源性脓毒血症的护理
- 光电信息工程相关课件
- 殡仪馆司机管理制度
- 绿色船舶拆除-绿色船舶拆除技术
- 马工程西方经济学(精要本第三版)教案
- 香港公司劳动合同协议
评论
0/150
提交评论