《基本数据类型和表达式.ppt》由会员分享,可在线阅读,更多相关《基本数据类型和表达式.ppt(43页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第3章 基本数据类型和表达式 在第二章中,我们从总体上介绍了一个C程序的基本结构,使读者对C程序有了大概的了解。本章将详细介绍C语言程序中使用的基本语法单位基本语法单位、数据类型数据类型、运算符运算符和表表达式达式。3.1 基本语法单位 任何一种语言都会根据自身的特点规定它自己特定的一套基本符号。例如,英语的基本符号是26个英文字母和一些标点符号。C语言作为一种程序设计语言,也有它的基本符号,程序就是由这些基本符号基本符号组成的。3.1.1 基本符号 程序中要对各种变量和各种函数起名,这些变量名、程序中要对各种变量和各种函数起名,这些变量名、函数名都是由语言的函数名都是由语言的基本符号基本符号
2、组成的。组成的。C的基本符号包的基本符号包括:括:(1)数字数字10个个(09);(2)英文字母英文字母大小写各大小写各26个个(AZ,az);(3)特殊符号特殊符号,主要用来表示运算符,它通常是,主要用来表示运算符,它通常是由由12个特殊符号组成。包括:个特殊符号组成。包括:+*/%=!=&|!&|=+-?:?:(),等等。等等。3.1.2 关键字 关键字关键字在语言中有特定的语法含义,用在语言中有特定的语法含义,用来说明某一固定含义的语法概念,程序员只来说明某一固定含义的语法概念,程序员只能使用,而不能给它们赋以新的含义能使用,而不能给它们赋以新的含义。表表3.1中列出了中列出了ANSI
3、C中的中的32个关键个关键字,主要是字,主要是C的语句名和数据类型名等。的语句名和数据类型名等。C语言中大写字母和小写字母是不同的,如语言中大写字母和小写字母是不同的,如else是关键字,而是关键字,而ELSE则不是。则不是。表表3.1 ANSI C中的中的32个关键字个关键字autodoublestructsizeofbreakelseintstaticcaseenumlongswitchcharexternregistertypedefconstfloatunsignedunioncontinueforreturnvoiddefaultgotoshortvolatiledoifsigned
4、while注意:注意:还有一些含有特定含义的标识符。它们还有一些含有特定含义的标识符。它们主要用在主要用在C语言的预处理程序中。这些标识语言的预处理程序中。这些标识符不是关键字,但因具有特定含义,建议符不是关键字,但因具有特定含义,建议读者不要在程序中把它们作为一般标识符读者不要在程序中把它们作为一般标识符随意使用,以免造成混乱。随意使用,以免造成混乱。特定字有特定字有define、undef、include、ifdef、ifndef、endif、line等。等。3.1.3 标识符 标识符用于标识符用于给程序中不同的语法概念以不同的命名给程序中不同的语法概念以不同的命名,以便,以便能区别它们。
5、如用来表示常量、变量、语句标号、用户自定义能区别它们。如用来表示常量、变量、语句标号、用户自定义的名称等等。程序中的标识符应满足的名称等等。程序中的标识符应满足C C语言的一些规定:语言的一些规定:(1)(1)以以英文字母或下划线英文字母或下划线“_”_”(下划线也起一个字母作用)(下划线也起一个字母作用)开头;开头;(2)(2)标识符的其它部分可以用字母、数字、下划线组成;标识符的其它部分可以用字母、数字、下划线组成;(3)(3)长度一般不超过长度一般不超过8 8个字符个字符。在不同的系统中有不同的规。在不同的系统中有不同的规定;定;(4)(4)大、小写字母含义不一样大、小写字母含义不一样,
6、例如:,例如:MAX,max,MaxMAX,max,Max均表示均表示不同的标识符;不同的标识符;(5)(5)不能用关键字不能用关键字作标识符。作标识符。下面列出几个正确和不正确的标识符:正确正确 不正确不正确 smart 5smart decision bomb?key_board keyboard FLOAT float注意:注意:为了使程序易读、易修改,标识符命名为了使程序易读、易修改,标识符命名应该选择恰当,尽量符合人们习惯,表示应该选择恰当,尽量符合人们习惯,表示有意义的标识符。一般取用英文单词、汉有意义的标识符。一般取用英文单词、汉语拼音作为标识符。作为习惯,一般约定语拼音作为标识
7、符。作为习惯,一般约定标识符常量标识符常量使用使用大写字母大写字母,其余均用小写,其余均用小写字母。字母。3.2 数据类型C C数数据据类类型型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型void定义类型定义类型typedef字符类型字符类型char枚举类型枚举类型enum整整 型型实型实型单精度型单精度型float双精度型双精度型double数组数组结构体结构体struct共用体共用体union短整型短整型short长整型长整型long整型整型int注意:注意:对不同的对不同的C语言系统,所支持的基本类型语言系统,所支持的基本类型是不同的,而且取值范围与机器硬件有关,是不同的
8、,而且取值范围与机器硬件有关,在使用时请参阅有关手册。在使用时请参阅有关手册。需要指出的是:需要指出的是:C语言没有提供布尔语言没有提供布尔(逻辑逻辑)类型,在逻辑运算中,它是以非零表示真类型,在逻辑运算中,它是以非零表示真(TRUE),以数值,以数值0表示假表示假(FALSE)。3.3 常量与变量 3.3.1 常量常量 C语语言言中中的的常常量量是是不不接接受受程程序序修修改改的的固固定定值值,常常量量可可为为任任意意 数据类型数据类型。1.整型常量整型常量 整形常量可分别以十进制、八进制、十六进制表示。整形常量可分别以十进制、八进制、十六进制表示。C语言语言的整常数有以下四种形式:的整常数
9、有以下四种形式:1).1).十进制整数十进制整数 形式:形式:n n 其中其中n n是数字是数字0909组成的序列,组成的序列,中间不允许出现逗号中间不允许出现逗号,规定,规定最最高位不能是高位不能是0 0,当符号为正时可以省略符号,当符号为正时可以省略符号“+”+”,“-”-”表示负数。表示负数。例例:123123、-1000-1000、-1-1都都 表示十进制整数。表示十进制整数。而而:1.2341.234、10-210-2、10/310/3、01230123是非法的十进制整数。是非法的十进制整数。2).八进制整数八进制整数 形式:形式:士士0n 其中其中0表示八进制数的引导符,表示八进制
10、数的引导符,不能省略不能省略,n是数是数字字07组成的序列,当符号为正时可以省略组成的序列,当符号为正时可以省略“+”,“-”表示负数。特别要注意的是,八进制整数的引导表示负数。特别要注意的是,八进制整数的引导符是数字符是数字0,而不是字母,而不是字母O。例例:0123、01000、01都是表示八进制整数。都是表示八进制整数。而而:012889、123、670是非法的八进制整数。是非法的八进制整数。3).十六进制整数十六进制整数 形式:形式:士士0 xn /*0是数字是数字0,而不是字母,而不是字母O*/其中其中0 x表示十六进制数的引导符,表示十六进制数的引导符,不能省略不能省略。n是是09
11、、af或或AF的数字、字母序列。当符号为正时的数字、字母序列。当符号为正时可以省略可以省略“+”;“-”表示负数。一般前面的字母表示负数。一般前面的字母x小小写,后面的写,后面的AF也应小写,或者全部大写。也应小写,或者全部大写。af或或AF分别表示数字分别表示数字1015。例例:0 x12c、0 x100、0XFFFF都是表示十六进都是表示十六进制整型数。制整型数。4).长整型整数长整型整数 前面几种表示形式的整型是基本整型,但对于前面几种表示形式的整型是基本整型,但对于超过基本整型取值范围的整数,可以在数字后加字超过基本整型取值范围的整数,可以在数字后加字母母L或或l,表示,表示长整型整数
12、长整型整数。从表。从表3.2可以看到,长可以看到,长整型数据的表示范围比基本整型的表示范围大的多。整型数据的表示范围比基本整型的表示范围大的多。例例:123456L、07531246L、0XFFFFFFL分别表示十进制长整型整数、八进制分别表示十进制长整型整数、八进制长整型整数、十六进制长整型整数。长整型整数、十六进制长整型整数。2.2.实型常量实型常量 实型常量实型常量又称又称浮点常量浮点常量,是一个十进制表示的,是一个十进制表示的符号实数。符号实数的值包括符号实数。符号实数的值包括整数部分整数部分、尾数部分尾数部分和和指数部分指数部分。实型常量的形式如下:。实型常量的形式如下:digits
13、.digits E|e+|-digits 在此在此digits是一位或多位十进制数字(从是一位或多位十进制数字(从09)。)。E(也可用(也可用e)是指数符号。小数点之前是整)是指数符号。小数点之前是整数部分,小数点之后是尾数部分,它们是可省略的。数部分,小数点之后是尾数部分,它们是可省略的。小数点在没有尾数时可省略。指数部分用小数点在没有尾数时可省略。指数部分用E或或e开开头,幂指数可以为负,当没有符号时视为正指数的头,幂指数可以为负,当没有符号时视为正指数的基数为基数为10。注意:注意:所有的实型常量均视为所有的实型常量均视为双精度类型双精度类型。实型常。实型常量的整数部分为量的整数部分为
14、0时可以省略,如下形式是允时可以省略,如下形式是允许的:许的:.57,.0075e2,-.125,-.175E-2;字母字母E或或e之前必须有数字之前必须有数字,且,且E或或e后面指数后面指数必须为整数必须为整数:如如e3,.e3,e等都是不合法的指数形式。等都是不合法的指数形式。3.字符常量字符常量 字符常量是指用一对单引号括起来的单个字符。如a,9,!。字符常量中的单引号只起定界作用并不表示字符本身。单引号中的字符不能是单引号()和反斜杠(),它们特有的表示法在转义字符中介绍。在C语言中,字符是按其所对应的ASCII码值来存储的,一个字符占一个字节。注意:注意:注意字符 9 和数字9的区别
15、,前者是字符常量,后者是整型常量,它们的含义和在计算机中的存储方式都截然不同。由于C语言中字符常量是按整数(short型)存储的,所以字符常量可以像整数一样在程序中参与相关的运算。例如:9 9;/*执行结果57-9=48*/4.字符串常量字符串常量 字符串常量是指用一对双引号括起来的字符串常量是指用一对双引号括起来的一串字符。一串字符。双引号只起定界作用双引号只起定界作用,双引号括,双引号括起的字符串中不能是双引号(起的字符串中不能是双引号()和反斜杠)和反斜杠(),它们特有的表示法在转义字符中介),它们特有的表示法在转义字符中介绍。绍。注意:注意:C语言中,字符串常量在内存中存储时,系统自动
16、在字符串的末尾加一个“串结束标志”,即ASCII码值为0的字符NULL,常用 0表示。因此在程序中,长度为n个字符的字符串常量,在内存中占有n+1个字节的存储空间。例如,字符串China其存储形式为:要特别注意字符串与字符串常量的区别,除了表示形式不同外,其存储性质也不相同,字符A只占1个字节,而字符串常量A占2个字节。CHINANULL5.转义字符转义字符 转义字符是转义字符是C语言中语言中表示字符的一种特殊形表示字符的一种特殊形式。通常使用转义字符式。通常使用转义字符表示表示ASCII码字符集中码字符集中 不可打印的控制字符和不可打印的控制字符和特定功能的字符。特定功能的字符。转义转义字符
17、字符意意义义A S C I I码值码值(十(十进进制)制)a响响铃铃(B E L)0 0 7 b 退格退格(B S)0 0 8 f 换页换页(F F)0 1 2 n 换换行行(L F)0 1 0 r回回车车(C R)0 1 3 t 水平制表水平制表(H T)0 0 9 v 垂直制表垂直制表(V T)0 11 反斜杠反斜杠0 9 2?问问号字符号字符0 6 3 单单引号字符引号字符0 3 9 双引号字符双引号字符0 3 4 0 空字符空字符(N U L L)0 0 0 d d d任意字符任意字符三位八三位八进进制制 x h h 任意字符任意字符二位十六二位十六进进制制注意:注意:转义字符中只能使
18、用小写字母,每个转义字符只能转义字符中只能使用小写字母,每个转义字符只能看作一个字符。看作一个字符。v 垂直制表和垂直制表和f 换页符对屏幕没有任何影响,但会换页符对屏幕没有任何影响,但会影响打印机执行相应操作。影响打印机执行相应操作。在在C程序中,使用不可打印字符时,通常用转义字符程序中,使用不可打印字符时,通常用转义字符表示。表示。6.符号常量符号常量 C语言允许将程序中的常量定义为一个标识符,称语言允许将程序中的常量定义为一个标识符,称为为符号常量符号常量。符号常量一般使用大写英文字母表示,以。符号常量一般使用大写英文字母表示,以区别于一般用小写字母表示的变量。符号常量在使用前区别于一般
19、用小写字母表示的变量。符号常量在使用前必须先定义,定义的形式是:必须先定义,定义的形式是:#define 例如:例如:#define PI 3.1415926#define是是C语言的语言的编译预处理命令编译预处理命令,它表示经,它表示经定义的符号常量在程序运行前将由其对应的常量替换。定义的符号常量在程序运行前将由其对应的常量替换。其其值值可可以以改改变变的的量量称称为为变变量量。一一个个变变量量应应该该有有一一个个名名字字(标标识识符符),在在内内存存中中占占据据一一定定的的存存储储单单元元,在在该该存存储储单单元元中中存存放放变变量量的的值值。请请注注意意区区分分变变量量名名和和变变量量值
20、值这这两两个个不不同同的的概概念念。所所有有的的C变变量量必必须须在在使使用用之之前前定定义义。定义变量的一般形式是:定义变量的一般形式是:type variable_list;这里的这里的type必须是有效的必须是有效的C数据类型,数据类型,variable_list(变量表)可以由一个或多个由逗号分变量表)可以由一个或多个由逗号分隔的多个标识符名构成。例如:隔的多个标识符名构成。例如:int i,j,l;/定义三个整型变量定义三个整型变量i,j,l 3.3.2 变量1.整型变量整型变量 main()int a,b,c,d;/*指定指定a,b,c,d 为整型变量为整型变量*/unsigned
21、 u;/*指定指定u为无符号整型变量为无符号整型变量*/a=22;b=-11;u=5;c=a+u;d=b+u;printf(a+u=%d,b+u=%dn”,c,d);运行结果为:运行结果为:a+u=27,b+u=6 可以看到不同类型的整型数据可以进行算术运算。在本例中是可以看到不同类型的整型数据可以进行算术运算。在本例中是int型数据与型数据与unsingned int型数据进行相加减运算。型数据进行相加减运算。2.实型变量实型变量 实型变量分为实型变量分为单精度单精度(float型)和型)和双精度双精度(double型)。型)。如:如:float x,y;/*指定指定x,y为单精度实数为单精
22、度实数*/double z;/*指定指定z为双精度实数为双精度实数*/在一般系统中,一个在一般系统中,一个float型数据在内存中占型数据在内存中占4个字节个字节(32位),一个位),一个double型数据占型数据占8个字节(个字节(64位)。单精度位)。单精度实数提供实数提供7位有效数字,双精度提供位有效数字,双精度提供15 16位有效数字,数位有效数字,数值的范围随机器系统而异。值得值的范围随机器系统而异。值得注意注意的是,实型常量是的是,实型常量是double型,当把一个实型常量赋给一个型,当把一个实型常量赋给一个float型变量时,系统会截取相型变量时,系统会截取相应的有效位数。应的有
23、效位数。3.字符变量字符变量 字符变量用来存放字符变量,字符变量用来存放字符变量,注意只能存放一注意只能存放一个字符个字符,不要以为在一个字符变量中可以放字符串。,不要以为在一个字符变量中可以放字符串。字符变量的定义形式如下:字符变量的定义形式如下:char c1,c2;它表示它表示c 1和和c 2为字符变量,各放一个字符。为字符变量,各放一个字符。因此可以用下面语句对因此可以用下面语句对c 1、c 2赋值:赋值:c1=a;c2=b;3.3.3 变量的初始化 变量的初始化是指在定义变量的同时,给变量赋以初值,使某些变量的初始化是指在定义变量的同时,给变量赋以初值,使某些变量在程序开始执行时就具
24、有确定的值。变量在程序开始执行时就具有确定的值。其形式为:其形式为:=;例如:例如:char c=A,ky=K;/*字符型变量字符型变量c、ky初值分别为初值分别为A、K */int j,i=1;/*整型变量整型变量 i 初值为初值为1,j没有赋初值没有赋初值*/float sum=3.56;/*单精度变量单精度变量sum 初值为初值为3.56*/如果对几个变量赋以相同的初值,不能写成:如果对几个变量赋以相同的初值,不能写成:int a=b=c=3;而应写成:而应写成:int a=3,b=3,c=3;3.4 表达式和运算符 表达式表达式是由操作数和运算符组成,运算结果产生是由操作数和运算符组成
25、,运算结果产生一个确定的值。一个确定的值。操作数操作数可以是常量、变量、函数和表达可以是常量、变量、函数和表达式,每个操作数都具有一种数据类型,通过运算得到的式,每个操作数都具有一种数据类型,通过运算得到的结果也具有一种数据类型,结果的数据类型与操作数的结果也具有一种数据类型,结果的数据类型与操作数的数据类型可能相同,也可能不相同。数据类型可能相同,也可能不相同。运算符运算符指出了表达指出了表达式中的操作数如何运算。式中的操作数如何运算。C语言中,共有语言中,共有44种运算符,根据各运算符在表达种运算符,根据各运算符在表达式中的作用,表达式大致可以分成:式中的作用,表达式大致可以分成:算术表达
26、式算术表达式、关系关系表达式表达式、逻辑表达式逻辑表达式、条件表达式条件表达式、赋值表达式赋值表达式和和逗号逗号表达式表达式等。等。3.4.1 算术运算符 表表3.4 3.4 算术运算符算术运算符 下面是算术运算符的优先级:下面是算术运算符的优先级:最高最高+、-(单目运算符取负号)(单目运算符取负号)*、/、%最低最低+、-运算符运算符作用作用运算符运算符作用作用减法,也是一元减法减法,也是一元减法%模运算模运算+加法加法-自减(减自减(减1)*乘法乘法+自增(增自增(增1)/除法除法l当当“/”被用于整数或字符时,结果取整。被用于整数或字符时,结果取整。l模运算取整数除法的余数,所以模运算
27、取整数除法的余数,所以“%”不能用于不能用于float和和double类型。类型。l自增或自减运算符在操作数之前(自增或自减运算符在操作数之前(+x,-x+x,-x),),C语言在引语言在引用操作数之前就先执行加用操作数之前就先执行加1或减或减1操作;运算符在操作数之操作;运算符在操作数之后后(x+,x-),C语言就先引用操作数的值,而后再进行加语言就先引用操作数的值,而后再进行加1或减或减1操作。操作。l编译程序对同级运算符按从左到右的顺序进行计算。而编译程序对同级运算符按从左到右的顺序进行计算。而 +和和-的结合方向是的结合方向是“自右向左自右向左”。如。如 -i+-i+,它相当,它相当于
28、:于:-(i+i+)。)。注:注:3.4.2 赋值运算符 赋值运算符分赋值运算符分简单的赋值运算符简单的赋值运算符和和复合的赋值运算复合的赋值运算两种。两种。简单的赋值运算的一般形式是:简单的赋值运算的一般形式是:其中,其中,“=”=”号是赋值运算符。其作用是将一个表达式号是赋值运算符。其作用是将一个表达式的值赋给一个变量,同时该值作为赋值表达式的结果。的值赋给一个变量,同时该值作为赋值表达式的结果。例如:例如:a=b=c=d=0a=b=c=d=0;相当于:;相当于:a=a=(b=b=(c=c=(d=0 d=0););float ffloat f;f=23f=23;/*/*先将先将2323转换
29、成转换成23.0000023.00000,再存储在,再存储在f f中中*/int inti i;i=3.56i=3.56;/*/*变量变量i i的值为的值为3*/3*/=在简单赋值运算符在简单赋值运算符“=”=”之前加上其他运算符,就构成了之前加上其他运算符,就构成了复合赋值复合赋值运算符运算符。(1 1)复合运算符相当于两个运算符的结合复合运算符相当于两个运算符的结合。例如:。例如:a+=ba+=b相当于相当于a=a+ba=a+b,但并不等价。,但并不等价。(2 2)在复合赋值运算中,对于赋值号右边是复杂的表达式时,例)在复合赋值运算中,对于赋值号右边是复杂的表达式时,例如:如:x*=y+1
30、0 zx*=y+10 z相当于相当于 x=x*(y+10 z)x=x*(y+10 z)而不是而不是x=x=x*y+10 z x*y+10 z,即,即将右端表达式看作一个整体和将右端表达式看作一个整体和x x进行有关运算进行有关运算。用赋值运算符将一个变量和一个表达式连接起来的式子称为用赋值运算符将一个变量和一个表达式连接起来的式子称为“赋赋值表达式值表达式”。它的一般形式为:它的一般形式为:赋值表达式也可以包含复合的赋值运算符。赋值表达式也可以包含复合的赋值运算符。例:例:设设a a的初值为的初值为8 8,表达式:,表达式:a+=a-=a*aa+=a-=a*a也是一个赋值表达式,也是一个赋值表
31、达式,根据优先级和结合性,此赋值表达式的求解过程为:根据优先级和结合性,此赋值表达式的求解过程为:)先进行先进行“a-=a*a”a-=a*a”的运算,它相当于的运算,它相当于a=a a*a=a=a a*a=8 8*8=-568 8*8=-56;)再进行再进行“a+=-56”a+=-56”,的运算,相当于,的运算,相当于a=a+a=a+(-56-56)=-56 56=-112=-56 56=-112。3.4.3 关系运算符 关系运算是逻辑运算中比较简单的一种。所谓关系运算是逻辑运算中比较简单的一种。所谓“关系运算关系运算”实际上是实际上是“比较运算比较运算”。将两个值进。将两个值进行比较,判断比
32、较的结果是否符合给定的条件。例行比较,判断比较的结果是否符合给定的条件。例如,如,a3是一个关系表达式,大于号是一个关系表达式,大于号“”是一个是一个关系运算符,如果关系运算符,如果a的值为的值为5,则满足给定的条件,则满足给定的条件“a3”,因此该表达式的值为,因此该表达式的值为“真真”(即(即“条件条件满足满足”);如果);如果a的值为的值为2,不满足,不满足“a3”条件,条件,则称关系表达式的值为则称关系表达式的值为“假假”。C语言提供语言提供6种关系运算符,见表种关系运算符,见表3.5。3.4.3 关系运算符 表表3.5 3.5 关系运算符关系运算符 说明:说明:参加比较的数据可以是字
33、符型、整型和浮点型数据。参加比较的数据可以是字符型、整型和浮点型数据。前前4 4种关系运算符(种关系运算符(、=、=)的优先级相同,后两种优先)的优先级相同,后两种优先级相同。前四种高于后两种。例如:级相同。前四种高于后两种。例如:“”优先于优先于“=”=”。而。而“”与与“”优先级相同。优先级相同。关系运算符优先级低于算术运算符。关系运算符优先级低于算术运算符。关系运算符优先级高于赋值运算符。关系运算符优先级高于赋值运算符。优先级优先级 运算符运算符意义意义例例结果结果6 6=小于小于小于等于小于等于大于大于大于等于大于等于 ABAB12.5=1012.5BABA+2=B A+2=B 真真假
34、假假假真真 7 7=!=!=等于等于不等不等 A=BA=BA!=B A!=B 假假真真 3.4.4 逻辑运算符优先级 运算符 意义 例 结果 21112!&|逻辑非逻辑与逻辑成!7A&B3|4 011 表表3.6 逻辑运算符逻辑运算符表表3.7 逻辑运算真值表逻辑运算真值表ab!a!ba&ba|b001100011001100101110011注:注:参加逻辑运算的数据类型可以是字符型,整型,浮点型。参加逻辑运算的数据类型可以是字符型,整型,浮点型。优先级:优先级:当一个逻辑表达式中包含多个逻辑运算符时按以下的优先顺序:当一个逻辑表达式中包含多个逻辑运算符时按以下的优先顺序:!(非),!(非)
35、,&(与),(与),|(或),(或),即即“!”是三者中最高的。是三者中最高的。逻辑运算符中的逻辑运算符中的“&”和和“|”低于关系运算符,低于关系运算符,“!”高于算术高于算术运算符。运算符。例:例:表达式自左至右扫描求解。首先处理表达式自左至右扫描求解。首先处理“53”(因为关系运算符优(因为关系运算符优先于先于&)。在关系运算符两侧的)。在关系运算符两侧的5和和3作为数值参加关系运算,作为数值参加关系运算,“53”的值为的值为1,在进行,在进行“1&2”的运算,此时的运算,此时1和和2均是逻辑运算均是逻辑运算的对象,均作为的对象,均作为“真真”处理,因此结果为处理,因此结果为1。再往下进
36、行。再往下进行“1|84-!0”的运算。根据优先次序,先进行的运算。根据优先次序,先进行“!0”运算,结果为运算,结果为1,因此,因此,要运算的表达式变成:要运算的表达式变成:“1|84-1”,即,即“1|83”,关系运算符,关系运算符“”两侧的两侧的8和和3作为数值参加比较,作为数值参加比较,“83&2|84-!03.4.5 位运算符 位运算是指按二进制进行的运算位运算是指按二进制进行的运算。在系统软件中,常常需要处理二进。在系统软件中,常常需要处理二进制位的问题。制位的问题。C语言提供了语言提供了6个位操作运算符。这些运算符个位操作运算符。这些运算符只能用于整型只能用于整型操作数操作数,即
37、只能用于带符号或无符号的,即只能用于带符号或无符号的char,short,int与与long类型。类型。表表3.8为为C语言提供的位运算符列表:语言提供的位运算符列表:表表3.8 位运算符表位运算符表运算符运算符 含义含义 描述描述&按位与按位与 如果两个相应的二进制位都为如果两个相应的二进制位都为1,则该位的结果值为,则该位的结果值为1,否则为,否则为0|按位或按位或 两个相应的二进制位中只要有一个为两个相应的二进制位中只要有一个为1,该位的结果值为,该位的结果值为1 按位异或按位异或 若参加运算的两个二进制位值相同则为若参加运算的两个二进制位值相同则为0,否则为,否则为1 取反取反 是一元
38、运算符,用来对一个二进制数按位取反,即将是一元运算符,用来对一个二进制数按位取反,即将0变变1,将,将1变变0 右移右移 将一个数的各二进制位右移将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符位,移到右端的低位被舍弃,对于无符号数,高位补号数,高位补0 3.4.6 逗号运算符 C C语言提供一种特殊的运算符一语言提供一种特殊的运算符一逗号运算符逗号运算符。用逗号将若干。用逗号将若干个表达式连接起来。如:个表达式连接起来。如:3+53+5,6+86+8,称为,称为逗号表达式逗号表达式。逗号。逗号表达式的一般形式为:表达式的一般形式为:逗号表达式的求解过程是:先求解表达式逗号表达式的
39、求解过程是:先求解表达式1 1,再求解表达式,再求解表达式2 2,直到求解完表达式,直到求解完表达式n n,最后一个逗号表达式的值是整个逗号表达最后一个逗号表达式的值是整个逗号表达式的值式的值。逗号运算符又称为。逗号运算符又称为“顺序求解运算符顺序求解运算符”。逗号运算符是所有运算符中级别最低的逗号运算符是所有运算符中级别最低的。因此,下面两个表。因此,下面两个表达式的作用是不同:达式的作用是不同:x=x=(a=3a=3,6*3 6*3)x=a=3x=a=3,6*36*3 表达式表达式是一个赋值表达式,将一个逗号表达式的值赋给是一个赋值表达式,将一个逗号表达式的值赋给x x,x x的值为的值为
40、1818。表达式表达式相当于相当于“x=(a=3),6*3”x=(a=3),6*3”,是一个逗号,是一个逗号表达式,它包括一个赋值表达式和一个算术表达式,表达式,它包括一个赋值表达式和一个算术表达式,x x的值为的值为3 3。,3.4.7 条件运算符 C语言提供了一个可以代替某些条件语句的语言提供了一个可以代替某些条件语句的条件运算符条件运算符。条件运算符要求有三个操作对象,称条件运算符要求有三个操作对象,称三目运算符三目运算符,它是,它是C语言语言中唯一的一个三目运算符。条件表达式的一般形式为:中唯一的一个三目运算符。条件表达式的一般形式为:说明:说明:(1)条件运算符的执行顺序:先求解表达
41、式条件运算符的执行顺序:先求解表达式1,若为非,若为非0(真)则求解表达式(真)则求解表达式2,此时表达式,此时表达式2的值就作为整个条件表的值就作为整个条件表达式的值。若表达式达式的值。若表达式1的值为的值为0(假),则求解表达式(假),则求解表达式3,表达,表达式式3的值就是整个条件表达式的值。的值就是整个条件表达式的值。(2)条件运算符优先于赋值运算符条件运算符优先于赋值运算符 (3)条件运算符的结合方向为条件运算符的结合方向为“自右至左自右至左”。(4)通常用条件表达式取代简单的条件语句通常用条件表达式取代简单的条件语句 表达式表达式1?表达式?表达式2:表达式:表达式3Operato
42、r precedence and associativity3.5 各类数值型数据间的混合运算 在在C C语言中,允许不同类型的数据之间进行某些混合运算,如语言中,允许不同类型的数据之间进行某些混合运算,如整型、单精度型、双精度型、字符型数据之间进行混合运算。整型、单精度型、双精度型、字符型数据之间进行混合运算。unsigned doublefloatlong intchar,short 高高 低低例:例:假设假设i 为为int型,型,f为为float型变量。运算表达型变量。运算表达式:式:10+a+i*f,运算次序依次为:,运算次序依次为:1)进行)进行10+a的运算,的运算,a自动转换成整自动转换成整型型97,然后执行相加,结果为整型值,然后执行相加,结果为整型值107。2)进行)进行i*f的运算,首先的运算,首先f自动转换成面自动转换成面double型,然后把型,然后把int型的型的i转换成转换成double型,两个型,两个double型数据进行算术乘,结果是型数据进行算术乘,结果是double型。型。3)整型值)整型值107与与i*f的积相加。由于的积相加。由于i*f的值的值是是double型,先将整型数型,先将整型数107转换成转换成double型,然后再相加,结果为型,然后再相加,结果为double型。型。图图3.2 数据类型转换数据类型转换