第二章C语言基本数据描述_第1页
第二章C语言基本数据描述_第2页
第二章C语言基本数据描述_第3页
第二章C语言基本数据描述_第4页
已阅读5页,还剩78页未读 继续免费阅读

下载本文档

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

文档简介

1、 2.1 基本数基本数据类型据类型 2.2 变量和常量变量和常量 2.3 运算符和表达式运算符和表达式l字符集字符集 字符集是高级语言的编译系统所能识别的字母、字符集是高级语言的编译系统所能识别的字母、数字、和特殊符号。每种高级语言都有自己特定的字数字、和特殊符号。每种高级语言都有自己特定的字符集合。符集合。l标识符标识符 标识符是用来标识在标识符是用来标识在C程序中的变量、常量(指符程序中的变量、常量(指符号常量)、数据类型和函数的。通俗一点说,标识符号常量)、数据类型和函数的。通俗一点说,标识符是程序员为变量、常量或者函数起的名字,它实际上是程序员为变量、常量或者函数起的名字,它实际上是一

2、个字符序列。是一个字符序列。 (1) 大、小写英文字母:大、小写英文字母: A ,B, ,Z,a,b,z (2) 数字:数字: 0,1,2,9 (3) 运算符:运算符: + * / % = & | ? ! (4) 括号:括号: ( ) (5) 标点符号:标点符号: : ; (6) 特殊符号:特殊符号: _ $ # (7) 空白符:空格符、换行符、制表符。空白符:空格符、换行符、制表符。C语言的字符集合包括:语言的字符集合包括:(1) 字母或下划线中的任一字符打头。字母或下划线中的任一字符打头。(2) 在第一个字符后,可以是任意的数字、字在第一个字符后,可以是任意的数字、字母、下划线组成

3、的序列。长度不超过母、下划线组成的序列。长度不超过8个。个。 关键字(保留字)关键字(保留字)标识符的分类:标识符的分类: 特定字特定字 用户定义字用户定义字任何一个标识符必须符合下列语法规则:任何一个标识符必须符合下列语法规则: 关键字:又称保留字,一般为小写字母。关键字:又称保留字,一般为小写字母。关键字是关键字是C编译程序预先登录的标识符,它们编译程序预先登录的标识符,它们代表固定的意义,用户不能随便使用。代表固定的意义,用户不能随便使用。 若随便使用,可能出现意想不到的错误,若随便使用,可能出现意想不到的错误,编译能通过,但运行结果不对,且不容易检编译能通过,但运行结果不对,且不容易检

4、查错误之所在。查错误之所在。关键字(保留字)关键字(保留字) 特定字特定字 特定字:具有特殊含义的标识符。它们虽特定字:具有特殊含义的标识符。它们虽然不是关键字,但是在习惯上把它们看成关键然不是关键字,但是在习惯上把它们看成关键字。所以一般用户定义的标识符也不要使用它字。所以一般用户定义的标识符也不要使用它们。们。 特定字包括:特定字包括: define undef include ifdef ifndef endif line 用户按照语法规则定义的标识符。用户定义字可用户按照语法规则定义的标识符。用户定义字可以用来标识用户自己使用的变量,符号常量、数据以用来标识用户自己使用的变量,符号常量

5、、数据类型以及函数等。类型以及函数等。 注意注意 (1) 不能使用关键字和特定字。不能使用关键字和特定字。 (2) 用户定义字为了标识不同的对象,标识符的前用户定义字为了标识不同的对象,标识符的前8个个(甚至(甚至7个)字符要有区别。个)字符要有区别。 (3) 标识符最好有含义。标识符最好有含义。 (4) 避免使用容易混淆的字符。如避免使用容易混淆的字符。如l与与1,0与与o, z与与2等。等。 (5)大、小写代表不同的意义。大、小写代表不同的意义。 (6) 尽量不要与某个库函数同名。尽量不要与某个库函数同名。用户定义字用户定义字l变量变量 变量是由程序命名的一块计算机内存区域,是变量是由程序

6、命名的一块计算机内存区域,是用来存储一个可以变化的数值。用来存储一个可以变化的数值。 l常量常量 与变量一样,常量也是存储在内存中的,但是,与变量一样,常量也是存储在内存中的,但是,常量的数值在程序执行过程中不会发生改变。常量的数值在程序执行过程中不会发生改变。 无名常量(或称文字常量)无名常量(或称文字常量) 符号常量(用预处理命令符号常量(用预处理命令#define#define为常量命名)为常量命名) 在使用一个变量之前,程序员必须为每个变在使用一个变量之前,程序员必须为每个变量起个名字,同时还要声明它的数据类型,以量起个名字,同时还要声明它的数据类型,以便编译系统根据不同的数据类型为其

7、静态地分便编译系统根据不同的数据类型为其静态地分配内存空间。我们称之为定义变量。配内存空间。我们称之为定义变量。 定义变量的格式为:定义变量的格式为: 类型说明符类型说明符 变量名表变量名表 ; 不定值不定值 定义变量定义变量 整型整型 int 基本数据类型基本数据类型 浮点型浮点型 float double 字符型字符型 char 数组数组 以以为标志为标志 结构结构 struct 构造类型构造类型 复杂数据类型复杂数据类型 联合联合 union 枚举枚举 enum 指针类型指针类型 以以 * 为标志为标志 C C语语言言的的数数据据类类型型整型整型 短整型短整型 short int sho

8、rt int 长整型长整型 long intlong int 普通整型普通整型 int int 浮点型浮点型 普通浮点型普通浮点型 floatfloat 双精度浮点型双精度浮点型 double double 字符型字符型 char char 不同数据类型的数据由于其在内存的存储方式不不同数据类型的数据由于其在内存的存储方式不同,存储所占的二进制位(同,存储所占的二进制位(bitbit)大多不相同。即使是)大多不相同。即使是相同类型的数据在不同种类的计算机所占位(相同类型的数据在不同种类的计算机所占位(bitbit)数)数也不完全相同。也不完全相同。 l整型变量整型变量 l整型常量整型常量 l用

9、用printf显示整型数据显示整型数据 l用用scanf输入整型数输入整型数 按照整型变量所占的二进制位数来分类:按照整型变量所占的二进制位数来分类: short(短整型)(短整型) int (普通整型)(普通整型) long (长整型)(长整型)根据整型变量是否带符号位来分类:根据整型变量是否带符号位来分类: 不带符号的整型变量不带符号的整型变量 带符号的整型变量带符号的整型变量 无符号用关键字无符号用关键字unsigned表示表示说明整型变量的语法是:说明整型变量的语法是: 限定词限定词 int 变量名表;变量名表; 在在IBM PC机上,普通整型占机上,普通整型占 16位(位(bit),

10、短整型),短整型也占也占 16位(位(bit),而长整型占),而长整型占32位(位(bit)。根据整型)。根据整型数据所占的位数,计算一个整型数据能表示的数据的数据所占的位数,计算一个整型数据能表示的数据的取值范围。取值范围。 第位是符号位,如果符号位为第位是符号位,如果符号位为0,表示是正整数,表示是正整数,从到从到15位全为位全为1时表示的数最大。时表示的数最大。01111 1215 15个个1 则则16bit能表示的最大整数是能表示的最大整数是215 1 ,即,即32767。 如果符号位为如果符号位为1,表示是负整数,从到,表示是负整数,从到15位都为位都为0时表示的数最小。时表示的数最

11、小。10 00 15个个0 在计算机中,这个数是在计算机中,这个数是-215的补码表示。因此,最的补码表示。因此,最小整数是小整数是-215,即,即 -32768。 整型常量表示:整型常量表示: 十进制表示十进制表示 八进制表示八进制表示 以数字以数字 0开头开头 十六进制表示十六进制表示 以数字以数字0和和x开头。开头。 int a,b,c; a = 10; b = 010; c = 0 x10; 长整型:要在数字后加上字母长整型:要在数字后加上字母L 。 long s; s=10L ; 需要注意的是:如果整型常量超过机器所需要注意的是:如果整型常量超过机器所能表示的范围,则会发生溢出,而在

12、能表示的范围,则会发生溢出,而在C语言中的语言中的整数溢出并不会使程序出错,而是得到一个非整数溢出并不会使程序出错,而是得到一个非正确的值。正确的值。 int a,b; a = 10000; b = 10000000; 变量变量b的值会被系统认为是的值会被系统认为是-27008。%d 表示把数据按十进制整型输出;表示把数据按十进制整型输出;%o 表示把数据按八进制整型输出;表示把数据按八进制整型输出;%x 表示把数据按十六进制整型输出;表示把数据按十六进制整型输出;%u 表示把数据参数按无符号整型输出。表示把数据参数按无符号整型输出。注意:注意:除了除了%d,其余的格式都将数据作为无符号数输出

13、。,其余的格式都将数据作为无符号数输出。printfprintf(%ld,100000L); (%ld,100000L); 正确正确printfprintf(%d,100000L); (%d,100000L); 结果结果 -31072 用用printf显示整型数据显示整型数据 例例2.1#include stdio.hvoid main() int x,y,z; x=129, y=0127 , z=0 x128; printf(%d,%d,%dn,x,y,z); printf(%o,%o,%on,x,y,z); printf(%x,%x,%xn,x,y,z); 运行结果:运行结果:129,87

14、,296201,127,45081,57,128例例2.2#include stdio.hvoid main() int x,y,z; x=-129, y=-0127 , z=-0 x128; printf(%d,%d,%dn,x,y,z); printf(%o,%o,%on,x,y,z); printf(%x,%x,%xn,x,y,z);运行结果:运行结果:-129,-87,-296177577,177651,177330ff7f,ffa9,fed8说明:说明:-0127和和-0 x128并不是八进制和十六进制常量,并不是八进制和十六进制常量,“-”实际是实际是运算符运算符; 使用使用%o和

15、和%x显示的常量和变量是无符号数。显示的常量和变量是无符号数。 使用域宽和对齐方式来控制显示格式使用域宽和对齐方式来控制显示格式 在在%和转换说明符之前加整数数字,表示数据显和转换说明符之前加整数数字,表示数据显示的域宽示的域宽; 在在%后面加符号后面加符号“-”,数据显示时左对齐,没有符,数据显示时左对齐,没有符号号“-”,数据显示时右对齐。,数据显示时右对齐。 printf(%-6x%-6x%-6xn,x,y,z);例例2.3 #include stdio.hvoid main() int x,y,z; x=129, y=0127 , z=0 x128; printf(%6d%6d%6dn

16、,x,y,z); printf(%6o%6o%6on,x,y,z); printf(%-6x%-6x%-6xn,x,y,z); 运行结果:运行结果: 129 87 296201 127 45081 57 128 scanf是格式输入函数,其功能是按指定的格式将是格式输入函数,其功能是按指定的格式将标准输入设备(例如键盘)输入的内容送入变量中。标准输入设备(例如键盘)输入的内容送入变量中。 scanf函数的使用格式:函数的使用格式: scanf( 格式信息格式信息, 输入项输入项1,输入项,输入项2,); 其中,其中,“格式信息格式信息”与与printf的用法相似,可以在的用法相似,可以在其中使

17、用其中使用%和转换字符来指定数据的输入方式。需要和转换字符来指定数据的输入方式。需要注意的是,输入项必须使用地址,普通变量的地址是注意的是,输入项必须使用地址,普通变量的地址是在变量名前加取地址符在变量名前加取地址符&。用用scanf输入整型数输入整型数 输入整型数据的转换字符有输入整型数据的转换字符有d,o,x,u%d 表示把数据按十进制整型输入;表示把数据按十进制整型输入;%o 表示把数据按八进制整型输入;表示把数据按八进制整型输入;%x 表示把数据按十六进制整型输入;表示把数据按十六进制整型输入;%u 表示把数据参数按无符号整型输入。表示把数据参数按无符号整型输入。 与与prin

18、tf函数类似,如果希望输入的数据是长整型,函数类似,如果希望输入的数据是长整型,需要在转换字符前加需要在转换字符前加l。例例2.4#include stdio.hvoid main() int x, y, z1; long z2; scanf(%d%o%x%ld,&x,&y,&z1,&z2); printf(n%d,%d,%d,%ld,x,y,z1,z2);若输入为:若输入为: 10 10 10 100000 (回车符)(回车符)显示结果为显示结果为10,8,16,100000注意注意(1) scanf读入一组整数时,读入一组整数时,scanf扫视输入信息,跳过

19、空扫视输入信息,跳过空格、格、tab或换行,寻找下一个输入域。一个输入域就是或换行,寻找下一个输入域。一个输入域就是一个连续的非空白字符的数字串。一个连续的非空白字符的数字串。例如,若输入为:例如,若输入为: 782 319 20 (回车符)(回车符)38 则输入域有四个。则输入域有四个。(2) 格式信息中除了有格式信息中除了有 %开始的转换说明,还可以有普开始的转换说明,还可以有普通字符,只是这些字符不是显示在屏幕上的,而是要通字符,只是这些字符不是显示在屏幕上的,而是要求使用者在输入数据时,要在相应位置输入相同的字求使用者在输入数据时,要在相应位置输入相同的字符(除了空格、符(除了空格、t

20、ab或换行符)。或换行符)。 例例2.5#include stdio.hvoid main() int x, y, z1,z2; scanf(x=%dy=%oz1=%xz2=%u,&x,&y,&z1,&z2); printf(n%d,%d,%d,%d,x,y,z1,z2);如果输入为:如果输入为: 10 10 10 10 (回车符)(回车符)则显示结果为是则显示结果为是0,484,2971,0 正确的输入?正确的输入?l浮点变量浮点变量 l浮点常量浮点常量 l用用printf显示浮点数据显示浮点数据 l用用scanf输入浮点输入浮点数数 浮点变量浮点变量 单精度

21、浮点数(单精度浮点数(floatfloat) 双精度浮点数(双精度浮点数(doubledouble) long doublelong double 定义定义浮点变量:浮点变量: float a,b;float a,b; double c,d; double c,d; 单精度浮点数和双精度浮点数两者在计算机上的表单精度浮点数和双精度浮点数两者在计算机上的表示方式是完全相似的,只是所占的二进制位数不同,示方式是完全相似的,只是所占的二进制位数不同,单精度浮点数的有效数字(或称精度)和取值范围与单精度浮点数的有效数字(或称精度)和取值范围与双精度浮点数不同。双精度浮点数不同。 浮点数在机器中的表示一

22、般分为三部分:符号位、浮点数在机器中的表示一般分为三部分:符号位、阶码、尾数。阶码、尾数。 3232位浮点数的有效数字的个数是位浮点数的有效数字的个数是7 7位十进制数字,取位十进制数字,取值范围为值范围为1010-38 -38 10 103838,6464位浮点数的有效数字的个数位浮点数的有效数字的个数是是1515位十进制数字,取值范围为位十进制数字,取值范围为1010-308 -308 10 10308308。不同的。不同的机器可能会有一些微小的差别。机器可能会有一些微小的差别。 0 1 7 8 31 符符号号位位 阶阶码码 尾尾数数 浮点常量浮点常量 小数表示法小数表示法 127.3 科

23、学计数法科学计数法 1.273102 在在C语言中,实际上也是用这两种方式,只不过语言中,实际上也是用这两种方式,只不过102 用用E+2表示。表示。 C程序中的浮点常数由整数部分、小数部分、指数程序中的浮点常数由整数部分、小数部分、指数部分构成。部分构成。浮点常量构成规则是:浮点常量构成规则是:(1) 整数部分可以不写,小数部分也可以不写,但不能同整数部分可以不写,小数部分也可以不写,但不能同时不写。时不写。(2) 指数部分可以省略(相当于使用小数表示法)指数部分可以省略(相当于使用小数表示法)(3) 若有指数部分,若有指数部分,e(或(或E)两边都至少有一位数。)两边都至少有一位数。(4)

24、 指数的数字必须是整数(范围为指数的数字必须是整数(范围为1到到3位的整数),可位的整数),可以为负或正,正号可以省略。以为负或正,正号可以省略。例如,例如, 4.50E3、1.0、1.、.1234、123.4都是合法的浮都是合法的浮点常量。点常量。 注意:注意: 浮点常量在存储时按浮点常量在存储时按double类型存储,即类型存储,即占占32位(位(bit)。)。 浮点常量也象整型常量一样,如果浮点常浮点常量也象整型常量一样,如果浮点常量超过机器所能表示的范围,则会发生溢出。量超过机器所能表示的范围,则会发生溢出。 浮点溢出也不会使程序出错,而是得到一浮点溢出也不会使程序出错,而是得到一个非

25、正确的值个非正确的值 。%f显示小数表示的普通浮点数显示小数表示的普通浮点数%e显示科学记数法表示的浮点数显示科学记数法表示的浮点数 输出双精度(输出双精度(double)类型时,还需要在转换字符)类型时,还需要在转换字符前加上字母前加上字母l。 输出浮点数时控制输出域宽和有效位:输出浮点数时控制输出域宽和有效位: 在在%与与f(或(或e)之间加上两个数字并在两个数字之间)之间加上两个数字并在两个数字之间加一个句点加一个句点“.”。 例如,例如,%10.3f表示输出格式是域宽表示输出格式是域宽10,有效位,有效位3。 注意注意 : 域宽的含义、缺省有效位、与数据本身的域宽的关系域宽的含义、缺省

26、有效位、与数据本身的域宽的关系用用printf显示浮点数据显示浮点数据 例例2.6#include stdio.hvoid main() float x; double y; x=12.3456789;y=987654.321098; printf(n%e,%le,x,y); printf(n%f,%lf,x,y); printf(n%.3f,%.3lf,x,y); printf(n%14.3f,%14.3lf,x,y); printf(n%-14.3f,%-14.3lf,x,y); printf(n%8.3f,%8.3lf,x,y); printf(n%14f,%14lf,x,y); 例例2

27、.7void main() double x, y; scanf(%lf%le,&x,&y); printf(n%lf,%lf,x,y); printf(n%le,%le,x,y);若输入为若输入为123.56789 1.2345678e17则运行结果为:则运行结果为:123.567890,123456780000000000.0000001.234568e+3,1.234568e+17用用scanf输入浮点数输入浮点数 l字符字符变量变量 l字符字符常量常量 l用用printf显示显示字符字符 l用用scanf输入输入字符字符l用用getchar输入字符和用输入字符和用put

28、char输出字符输出字符l字符串常量字符串常量 字符变量字符变量数据类型说明符数据类型说明符 char例如,例如, char aloha,beta,c; 一个字符变量能存储一个字节的信息,每一个字符变量能存储一个字节的信息,每个字符有固定的编码,最常用的就是个字符有固定的编码,最常用的就是ASCII 编编码。码。 标准标准ASCII编码是把每个字符和与编码是把每个字符和与0127的的数值联系起来,用数值联系起来,用7位二进制表示,再将最高位位二进制表示,再将最高位充充0,就是一个字节了。,就是一个字节了。 例如,在例如,在ASCII编码表中,编码表中,A用数值用数值65表示,表示,其其8位二进

29、制表示是:位二进制表示是: 01000001 字符常量字符常量 C C语言中的字符常量是用单引号将一个字符括起语言中的字符常量是用单引号将一个字符括起来。例如来。例如 aa、bb。可以用字符常量为字符变量赋值:。可以用字符常量为字符变量赋值:char alpha=a;char alpha=a;char beta=b;char beta=b;注意:注意:(1)(1)引号中的字符只能是一个字符。引号中的字符只能是一个字符。 (2)(2)不能用双引号括起一个字符表示单个字符常量。不能用双引号括起一个字符表示单个字符常量。(3)(3)非图形字符,如退格,换行等,也可以表示成字符非图形字符,如退格,换行

30、等,也可以表示成字符型常量。表示方法是使用转义符型常量。表示方法是使用转义符 与一些特殊字符构成转与一些特殊字符构成转义序列。例如义序列。例如nn就是一个转义序列,表示就是一个转义序列,表示“回车换回车换行行”。(4)(4)字符型数据可以像整型数据一样参与四则运算。字符型数据可以像整型数据一样参与四则运算。 b- a=198-97=1用用printf显示字符显示字符 使用转换说明使用转换说明% %c c就可以输出单个字符了。就可以输出单个字符了。例例2.8#include stdio.hvoid main() char c=H; char d=I; char e=!; printf(%c%c%

31、cn,c,d,e);运行结果为:运行结果为:HI!用用scanf输入字符输入字符 %c 控制输入单个字符。控制输入单个字符。 注意:注意: 尽量不要将尽量不要将%c与其它转换说明一起使用。与其它转换说明一起使用。 当当scanf读入一组数据时,如果不使用读入一组数据时,如果不使用%c做转换时,做转换时,scanf扫视输入信息,跳过空格、扫视输入信息,跳过空格、tab或换行,寻找下一或换行,寻找下一个输入域。个输入域。 但是若使用但是若使用%c做转换时,情况则不同,做转换时,情况则不同,scanf不会不会跳过空格、跳过空格、tab或换行,而是直接把下一个字符输入给参或换行,而是直接把下一个字符输

32、入给参数,不论它是什么。数,不论它是什么。例如,例如, scanf(%d%c,&i,&c);键盘输入键盘输入 29 w c的内容不是字符的内容不是字符w,而是空格。,而是空格。 解决的方法是在控制字符串中加空格分隔。解决的方法是在控制字符串中加空格分隔。 scanf(%d %c,&i,&c);用用getchar输入字符和用输入字符和用putchar输出字符输出字符 getchar()函数的用法函数的用法 getchargetchar()()是接收一个从标准输入输出设是接收一个从标准输入输出设备上输入的字符。备上输入的字符。 一般的标准输入设备是键盘。一般的标准输

33、入设备是键盘。该函数没有参数,函数返回的数据类型为整型,该函数没有参数,函数返回的数据类型为整型,值为字符的值为字符的ASCIIASCII码值。码值。 例例2.9#include stdio.hvoid main() int c; c=getchar(); printf(%c,c);putchar()函数的用法函数的用法 putchar()是向标准输入输出设备上输出一个字符,是向标准输入输出设备上输出一个字符,一般的标准输出设备是屏幕终端。一般的标准输出设备是屏幕终端。 putchar()与与getchar()不同,输出字符做为函数的参不同,输出字符做为函数的参数,放在括号里。所以括号里的内容

34、是不能缺省的。数,放在括号里。所以括号里的内容是不能缺省的。putchar()函数返回的数据类型为整型,值为字符的函数返回的数据类型为整型,值为字符的ASCII码值。码值。若想输出字符若想输出字符a,可以用几种方式?,可以用几种方式?int c ; c=a;putchar( c); 以及以及putchar(a); 和和putchar(97);对于不可打印的字符,输出方式有两种:对于不可打印的字符,输出方式有两种:putchar(007) ; 和和putchar(007);例例2.10输入一个字符,按字符原封不动输出。输入一个字符,按字符原封不动输出。#include stdio.hvoid m

35、ain() int c,i; c=getchar(); i=putchar(c);或者或者#include stdio.hvoid main() putchar(getchar() */ 什么叫什么叫“系统的仿效返回系统的仿效返回 ”?字符串常量字符串常量 用双引号括起来的字符序列是字符串常量。用双引号括起来的字符序列是字符串常量。 how are you 1234.5 字符串的存储与字符不同。字符串的存储与字符不同。C编译程序在存储字符编译程序在存储字符串常量时自动采用串常量时自动采用0作为字符串结束标志。作为字符串结束标志。 how实际上所占的字节数是实际上所占的字节数是4。 “a”与与a

36、是完全不同的,前者是字符串常量,占的是完全不同的,前者是字符串常量,占的字节数是字节数是2,后者是字符常量,占的字节数是,后者是字符常量,占的字节数是1。 字符串常量的输出字符串常量的输出 printf(how are you); printf(%s,how are you);l表达式的概念表达式的概念 表达式是用运算符与圆括号将操作数连接起来所表达式是用运算符与圆括号将操作数连接起来所构成的式子。构成的式子。C语言的操作数包括常量、变量、函数值语言的操作数包括常量、变量、函数值等。等。 根据表达式进行运算,得到的数值即为表达式的解。根据表达式进行运算,得到的数值即为表达式的解。 l表达式与简

37、单语句表达式与简单语句 在在C语言中,在一个表达式的后面加上分号语言中,在一个表达式的后面加上分号“;”就构成了简单语句。就构成了简单语句。 有意义的简单语句有意义的简单语句 无无意义的简单语句意义的简单语句 l种类及运算种类及运算 + - * / %注意注意:v 两个整数相除,结果仍为整数,商向下取整。两个整数相除,结果仍为整数,商向下取整。v 取模运算符取模运算符%实际上是数学运算的求余数运算,实际上是数学运算的求余数运算,其两个操作对象都必须是整数其两个操作对象都必须是整数 。v 减法运算符还可以用做单目运算符,是取负减法运算符还可以用做单目运算符,是取负v运算。其余操作符均为双目运算符

38、。运算。其余操作符均为双目运算符。 l算术表达式及算术运算符的优先级算术表达式及算术运算符的优先级 算术表达式就是用算术运算符和圆括号将算术表达式就是用算术运算符和圆括号将操作数连接起来的式子。算术表达式的解就是操作数连接起来的式子。算术表达式的解就是经过算术运算得到的表达式的值。经过算术运算得到的表达式的值。 算术运算符的优先级与数学基本相同,即算术运算符的优先级与数学基本相同,即先乘除,后加减。取模运算的优先级与乘除相先乘除,后加减。取模运算的优先级与乘除相同。函数和圆括号的优先级最高。同。函数和圆括号的优先级最高。 注意:注意:v 算术表达式应能正确的表达数学公式。算术表达式应能正确的表

39、达数学公式。 例如:数学表达式是例如:数学表达式是 3+3+x x 2a 2a 相应的相应的C C语言表达式应该是什么呢?语言表达式应该是什么呢?v 算术表达式的结果应该不超过其所能表示的算术表达式的结果应该不超过其所能表示的 数的范围。例如,最大的整型数是数的范围。例如,最大的整型数是3276732767, 那么,那么,32767+332767+3就不会是正确的结果。而就不会是正确的结果。而 3276732767L+3L+3的结果是正确的,因为的结果是正确的,因为3276732767L L是长是长 整型数。整型数。l算术运算符的结合性算术运算符的结合性 运算符的结合性是指如果一个操作数左边和

40、运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同,应该优先计算右边的两个运算符的优先级相同,应该优先计算的操作符。的操作符。 例如:例如:a+b-c 操作数操作数b左右的运算符左右的运算符+和和-的优先级相同,的优先级相同,那么,是先计算那么,是先计算b-c,还是先计算,还是先计算a+b呢?呢?C语言语言规定双目算术运算符的结合性是自左至右,也就规定双目算术运算符的结合性是自左至右,也就是是b先与左边先与左边a结合,再与右边结合,再与右边c结合。所以是先结合。所以是先计算计算a+b,然后用,然后用a+b的结果减的结果减c。 双目运算符的结合性与数学运算并无不同。双目运算符的结

41、合性与数学运算并无不同。l普通赋值运算符普通赋值运算符 赋值表达式的一般形式是:赋值表达式的一般形式是: 变量名变量名= =表达式表达式 赋值语句的一般形式是:赋值语句的一般形式是: 变量名变量名= =表达式;表达式; 赋值运算符的优先级小于算术运算符。赋值运算符的优先级小于算术运算符。 赋值运算符的结合性是自右至左,赋值运算符的结合性是自右至左, 以以a=b=2为例为例 l复合赋值运算符复合赋值运算符 把赋值运算符与算术、位逻辑、移位运算把赋值运算符与算术、位逻辑、移位运算符放在一起,就构成复合赋值运算符。符放在一起,就构成复合赋值运算符。 复合算术赋值运算符有复合算术赋值运算符有5个个+=

42、 、- =、*=、/=、%=。 还有与移位和位逻辑结合的复合赋值运算符还有与移位和位逻辑结合的复合赋值运算符5个(个(=、&=、=、|=)。)。 复合赋值运算符的使用规则是:复合赋值运算符的使用规则是:Xop=YXop=Y与与X=XopYX=XopY等价。等价。 l 自动转换自动转换 l 强制转换强制转换 l 赋值表达式的类型转换赋值表达式的类型转换 自动转换自动转换 所谓所谓“自动转换自动转换”就是系统根据规则自动就是系统根据规则自动将将两个不同数据类型的运算对象转换成同一种数两个不同数据类型的运算对象转换成同一种数据类型的过程。而且,对某些数据类型,即使据类型的过程。而且,对某些数

43、据类型,即使是两个运算对象的数据类型完全相同,也要做是两个运算对象的数据类型完全相同,也要做转换,例如转换,例如float。float double 高 long unsigned char 、short int 低 强制转换强制转换 在在C语言中,允许程序员根据自己的意愿将语言中,允许程序员根据自己的意愿将一种数据类型强制转换成另一种数据类型。一种数据类型强制转换成另一种数据类型。强制转换的格式为:强制转换的格式为: (数据类型名数据类型名) 操作对象操作对象注意注意,强制转换并不改变操作对象的数据类型,强制转换并不改变操作对象的数据类型和数值。例如,和数值。例如,(int)f的确切含义是将

44、的确切含义是将f转换成转换成为整型值参与运算,而为整型值参与运算,而f本身的数据类型和数本身的数据类型和数值都没有任何改变。值都没有任何改变。赋值表达式的类型转换赋值表达式的类型转换 当赋值运算符左边的变量与赋值运算符右当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型相同时,不需要进行数边的表达式的数据类型相同时,不需要进行数据类型的转换。据类型的转换。 当赋值运算符左边的变量与赋值运算符右当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型不相同时,系统负责将边的表达式的数据类型不相同时,系统负责将右边的数据类型转换成左边的数据类型。此时,右边的数据类型转换成左边的数据类型。此时

45、,会有两种情况产生,一种是转换以后会丢失数会有两种情况产生,一种是转换以后会丢失数据,另一种是转换以后不会丢失数据。这与赋据,另一种是转换以后不会丢失数据。这与赋值号两边的表达式的数据类型所占的字节数及值号两边的表达式的数据类型所占的字节数及存储表示方式有关。存储表示方式有关。(详细内容自学)详细内容自学)例例3.1#include stdio.hvoid main() int c; /* char c;*/ c=B; printf(c=%c,c+a-A); 运行结果:运行结果:c=b例例3.2#include stdio.hvoid main() char c; int i=0 x3241;

46、 printf(i=%cn,i); c=i; printf(c=%dn,c); printf(i=%dn,i); 运行结果运行结果i=Ac=65i=12865l 所谓关系运算,实际上就是比较两个数值所谓关系运算,实际上就是比较两个数值的大小。那么,比较两个数值的大小的运算符的大小。那么,比较两个数值的大小的运算符就是关系运算符。就是关系运算符。 关系运算符有六个关系运算符有六个、=、z; j=xyz; printf(%2d,%2d,i,j); printf(%2d,zy=3); printf(%2d,y+z=z+1);运行结果为:运行结果为:1,0,0,0,1 如果将如果将“与、或、非与、或、

47、非”运算应用于逻辑值运算应用于逻辑值(逻辑真和逻辑假)则称为逻辑运算。(逻辑真和逻辑假)则称为逻辑运算。 C语言中的逻辑运算符有三个:语言中的逻辑运算符有三个: 逻辑与逻辑与 &、逻辑或、逻辑或 | 和逻辑非和逻辑非 ! 其中逻辑与和逻辑或是双目运算符,而逻辑其中逻辑与和逻辑或是双目运算符,而逻辑非是单目运算符。非是单目运算符。A B !A !B A&B A|B 逻辑真 逻辑真 逻辑假 逻辑假 逻辑真 逻辑真 逻辑真 逻辑假 逻辑假 逻辑真 逻辑假 逻辑真 逻辑假 逻辑真 逻辑真 逻辑假 逻辑假 逻辑真 逻辑假 逻辑假 逻辑真 逻辑真 逻辑假 逻辑假 逻辑运算的规则与二进制的位

48、逻辑是相逻辑运算的规则与二进制的位逻辑是相似的。似的。逻辑运算的规则下表:逻辑运算的规则下表: C语言系统对任何非语言系统对任何非0值都认定为是逻辑值都认定为是逻辑真,而将真,而将0认定为逻辑假。认定为逻辑假。 如果一个表达式参与逻辑运算,只要这个如果一个表达式参与逻辑运算,只要这个表达式的解为非表达式的解为非0,则系统就认为这个表达式,则系统就认为这个表达式的结果是逻辑真。的结果是逻辑真。 但是要注意,系统逻辑运算的结果仍然只但是要注意,系统逻辑运算的结果仍然只有两个:有两个:1(逻辑真)和(逻辑真)和0(逻辑假)。(逻辑假)。 逻辑运算符经常与关系运算符一起使用。逻辑运算符经常与关系运算符

49、一起使用。 C C语言表达式语言表达式( (x=10)&(x=10)&(x=100)的数学含的数学含义是:义是:1010 x x100100 逻辑运算符的优先级逻辑运算符的优先级 !& | 高高 低低 !的优先级高于算术运算符(当然也高于!的优先级高于算术运算符(当然也高于关系运算符)和赋值运算符关系运算符)和赋值运算符 &和和|的优先级高于赋值运算符,但是低的优先级高于赋值运算符,但是低于算术运算符和关系运算符。于算术运算符和关系运算符。 !单目运算符,其结合性是自右至左;!单目运算符,其结合性是自右至左;&和和|的结合性是自左至右。的结合性是自左至右

50、。 计算表达式计算表达式79-!079-!0的值的值 注意注意: 在在C C语言中,如果逻辑运算符的左操作数语言中,如果逻辑运算符的左操作数已经能够确定表达式的解,则系统不再计算右已经能够确定表达式的解,则系统不再计算右操作数的值。操作数的值。 x=1 & y=0 x=1 & y=0 若若x x此时不为此时不为1 1,在检测,在检测x=1x=1以后,就不以后,就不会再检测会再检测y=0y=0。因为。因为x=1x=1的结果是逻辑假,逻的结果是逻辑假,逻辑假与任何数进行逻辑与操作结果都会是逻辑辑假与任何数进行逻辑与操作结果都会是逻辑假。假。 x=y |x=0 若若x=y成立,则表达

51、式的值为真,不需要继成立,则表达式的值为真,不需要继续做续做x=0了。但是,若了。但是,若x=y不成立,由于不成立,由于x=0是是个赋值表达式,表达式的结果很可能是错误的。个赋值表达式,表达式的结果很可能是错误的。假设该表达式计算以前,假设该表达式计算以前,x值为,值为,y的值为,的值为,x=y的计算结果是,这时需要执行赋值的计算结果是,这时需要执行赋值x=0,表达式的结果仍然是,而实际上这时的表达式的结果仍然是,而实际上这时的x和和y的值均为,又满足了的值均为,又满足了x=y,这不是产生了矛,这不是产生了矛盾吗?盾吗?不要在一般的表达式中夹杂赋值运算不要在一般的表达式中夹杂赋值运算 +和和-

52、。 这两个运算符都是单目运算符,其功能分别这两个运算符都是单目运算符,其功能分别是将变量自身的内容增是将变量自身的内容增1和减和减1。 +i和和-i是前缀表示法,是前缀表示法,i+和和i-是后缀表是后缀表示法。如果直接在示法。如果直接在+i和和i+的后面加上分号构的后面加上分号构成成C的执行语句,即的执行语句,即+i;和和i+;前缀与前缀与后缀并无区别(减符号也一样)。但是,将后缀并无区别(减符号也一样)。但是,将它们用在表达式中则前缀与后缀是有区别的。它们用在表达式中则前缀与后缀是有区别的。 前缀表示法是先将前缀表示法是先将i值增值增/减减1,再在表达,再在表达式中使用;而后缀表示法是先在表

53、达式中使式中使用;而后缀表示法是先在表达式中使用用i的值,再将的值,再将i值增值增/减减1。例如:例如: i=3; i=3; j=i+; j=+i; 结果结果 j的内容为的内容为3 j的内容为的内容为4 i的内容为的内容为4 i的内容为的内容为4 注意:注意:v 增增1/1/减减1 1运算符的操作对象是一个变量运算符的操作对象是一个变量 2+2+、-2-2以及以及( (x/y)+x/y)+均为非法均为非法v 增增1/1/减减1 1运算符的优先级高于算术运算符,运算符的优先级高于算术运算符, 与单目运算符与单目运算符- -(取负)、!(逻辑非)的(取负)、!(逻辑非)的 优先级相同,结合方向自右

54、至左。优先级相同,结合方向自右至左。 例如表达式例如表达式 -i+ -i+ 等价于等价于 -(-(i+)i+)v副作用:副作用:printf(“ %d ,%d”,i,i+);在不同在不同 的编译环境下结果有可能不同。的编译环境下结果有可能不同。v尽量不要在一般的表达式中将增尽量不要在一般的表达式中将增1/1/减减1 1运算运算 符与其它运算符混合使用。符与其它运算符混合使用。 & | 按位取反按位取反 左移左移 右移右移 按位与按位与 按位或按位或 按位异或按位异或 操作数在实现位操作时按二进制进行运算,操作数在实现位操作时按二进制进行运算,7 7一般应为无符号型整数。一般应为无符号型

55、整数。 按位与按位与& 按位与的运算规则是:按位与的运算规则是:0&0=0 0&1=0 1&0=0 1&1=1例如:例如:char w1,w2,w3;w1=10; w2=8; w3= w1&w2 ; w3的内容可以通过下式运算:的内容可以通过下式运算: 00001010 00001000 (按位与(按位与&) 00001000 (结果)(结果) &运算经常用于把特定位清零(屏蔽)。运算经常用于把特定位清零(屏蔽)。例如,例如, a的值为的值为11011010,b的值为的值为11110000, a&b 11011010 & 11110000 11010000 相当于把相当于把a的低的低4位屏蔽,高位屏蔽,高4位不变。位不变。 按位或按位或 |按位或的运算规则是:按位或的运算规则是:0 | 0=0 0 | 1=1 1 | 0=1 1 | 1=1例如

温馨提示

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

评论

0/150

提交评论