《C语言程序设计第2章C语言基础.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计第2章C语言基础.ppt(81页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第2 2章章 C C语言基础语言基础C C 语言程序设计语言程序设计2023/1/162本章主要内容本章主要内容本章介绍本章介绍C语言的基础,包括:语言的基础,包括:l lC语言使用的合法字符?单词?语言使用的合法字符?单词?字符集字符集 标识符:标识符:单词的组成原则,单词的组成原则,单词的组成原则,单词的组成原则,l l程序处理的对象是数据程序处理的对象是数据 数据类型:数据的存储、参与的运算数据类型:数据的存储、参与的运算 数据表现形式:变量和常量数据表现形式:变量和常量 数据操作:运算符和表达式数据操作:运算符和表达式l lC语言的语句类型语言的语句类型2023/1/163例如:例如
2、:【例【例2.1】计算圆的面积,半径为】计算圆的面积,半径为 5 cm。程序如下:程序如下:main()float r r,areaarea;r r=5 5;areaarea=3.143.14*r r*r r;printf(%fn,areaarea);运算结果是输出运算结果是输出运算结果是输出运算结果是输出圆的面积:圆的面积:圆的面积:圆的面积:78.50000078.500000程序中用到的数据:程序中用到的数据:r、area、5、3.14对数据进行的运算:对数据进行的运算:*、=数据的名称是标识符数据的名称是标识符例例jc2_12023/1/164分析:分析:计算机操作处理时,要表示各种处
3、理的对象计算机操作处理时,要表示各种处理的对象l l出现在程序的符号和字符可以使用英文字出现在程序的符号和字符可以使用英文字母吗?母吗?可以使用中文字符吗?可以使用中文字符吗?合法的字符集合合法的字符集合l l半径用半径用 r表示表示,面积,面积 用用 area 表示表示。对象可。对象可以取什么样的名称?以取什么样的名称?标识符:标识符:可以用作各种对象的名字可以用作各种对象的名字涉及涉及C语言最语言最基本组成基本组成2023/1/165分析:分析:计算机操作处理时,首先要解决数据的存放:计算机操作处理时,首先要解决数据的存放:l l事先要在内存中给半径事先要在内存中给半径 r 和运算结果和运
4、算结果 area 开辟存储空间,存放它们的值。开辟存储空间,存放它们的值。应该留多应该留多大的地方来存放它们的值?大的地方来存放它们的值?l l数据数据 5 和和 3.14 与与 r、area 不同,它们是在不同,它们是在编写程序时就给出确定的值,在运算过程编写程序时就给出确定的值,在运算过程中不会改变。中不会改变。这样的数计算机怎么处理?这样的数计算机怎么处理?l l对对整数整数 5 和和小数小数3.14,计算机,计算机存放时是否存放时是否有区别?有区别?涉及数据类型涉及数据类型的基本知识的基本知识2023/1/1662.1 C程序的符号系统程序的符号系统l主要内容:主要内容:基本字符基本字
5、符标识符标识符2023/1/1672.1.1 基本字符基本字符 l l大写英文字母大写英文字母:A B C X Y Z l l小写英文字母小写英文字母:a b c x y z l l数字数字:0 1 2 9 l l空白符空白符:空格符、换行符、制表符:空格符、换行符、制表符 l l特殊字符特殊字符:+-*/()_ =!#%.,;:“|&?$2023/1/1682.1.2 标识符标识符 l l由由字母字母、下划线下划线和和数字数字组成的字符序列组成的字符序列l l用于程序中的变量、符号常量、数组、函用于程序中的变量、符号常量、数组、函数、数据类型等操作对象的数、数据类型等操作对象的名字名字1 1
6、系统定义标识符系统定义标识符具有固定名字和特定含义的标识符具有固定名字和特定含义的标识符分为分为关键字关键字和和预定义标识符预定义标识符 2 2用户定义标识符用户定义标识符 用于对用户使用的变量、数组、函数用于对用户使用的变量、数组、函数等操作对象进行命名等操作对象进行命名 2023/1/169关键字关键字 l l数据类型:数据类型:数据类型:数据类型:intint、charchar、floatfloat、doubledouble、shortshort、longlong、voidvoid、signedsigned、unsignedunsigned、enumenum、structstruct、u
7、nionunion、constconst、typedeftypedef、volatile volatile l l存储类别:存储类别:存储类别:存储类别:autoauto、staticstatic、registerregister、extern extern l l语句命令字:语句命令字:语句命令字:语句命令字:breakbreak、casecase、continuecontinue、defaultdefault、dodo、elseelse、forfor、gotogoto、if if、returnreturn、switchswitch、while while l l运算符:运算符:运算符:运算
8、符:sizeof sizeof 2023/1/1610预定义标识符预定义标识符l l系统标准库函数系统标准库函数scanf、printf、putchar、getchar、strcpy、strcmp、sqrt等等l l编译预备处理命令编译预备处理命令include、define等等2023/1/1611对标识符的规定对标识符的规定 l l用户定义标识符用户定义标识符必须以必须以字母字母或或下划线下划线“_ _”开头开头不能含有除字母、数字和下划线不能含有除字母、数字和下划线“_ _”外的其他字符外的其他字符标识符中大小写字母含义不同标识符中大小写字母含义不同l l关键字关键字必须用小写字母。不允
9、许使用关键必须用小写字母。不允许使用关键字为变量、数组、函数等操作对象命名字为变量、数组、函数等操作对象命名l l预定义标识符预定义标识符允许用户对它们重新定义,允许用户对它们重新定义,当重新定义后将改变它们原来的含义当重新定义后将改变它们原来的含义2023/1/1612正确区分标识符正确区分标识符l l正正确确区区分分哪哪些些是是合合法法标标识识符符,哪哪些些是是不不合合法法标标识识符符。其其中中合合法法标标识识符符中中哪哪些些是是关关键键字字,哪哪些些是是预预定定义义标标识识符符,哪哪些些是是用用户户定定义标识符。义标识符。Abc define 2x double studentm+y a
10、#b-4 _1 Whileint let x%y name do w tm Ctrl swicth include 2023/1/16132.2 C语言的数据类型语言的数据类型 C数据类型数据类型数组类型数组类型结构体类型结构体类型共用体类型共用体类型枚举类型枚举类型整型整型整型整型 字符型字符型字符型字符型 实实实实型型型型(浮浮浮浮点点点点型型型型)空类型空类型空类型空类型单精度型单精度型单精度型单精度型 双精度型双精度型双精度型双精度型 基本类型基本类型基本类型基本类型指针类型指针类型构造类型构造类型本章讨论本章讨论本章讨论本章讨论基本类型数据基本类型数据基本类型数据基本类型数据2023
11、/1/16142.2.1 整型数据整型数据 1整型数据的类型整型数据的类型 基本整型数据基本整型数据 int,分配分配 4 Byte 短整型数据短整型数据 short int,分配分配 2 Byte 长整型数据长整型数据 long int,分配分配 4 Byte整型数据均以整型数据均以二进制补码二进制补码形式存储形式存储问题:问题:为什么要采用补码?为什么要采用补码?如何表示?如何表示?2023/1/1615计算机中正、负数的表示计算机中正、负数的表示 例如:例如:109(1101101)2要区别:要区别:109 和和 109 方法是:方法是:将符号也数码化将符号也数码化即:即:正的符号正的符
12、号 用用 0 表示表示 负的符号负的符号 用用 1 表示表示 计算机中的数表示方法是:计算机中的数表示方法是:符号位符号位二进制数值二进制数值(以以 8bit 为例为例)109 110 1101 0110 1101109 110 1101 1110 11012023/1/1616问题:计算机计算复杂化问题:计算机计算复杂化例如计算:例如计算:(-19)+(+22)1001 0011+0001 0110解决的方法是:解决的方法是:使用使用补码补码的表示方法能将减法一律转的表示方法能将减法一律转换为加法。换为加法。需要判断符号是否相同:需要判断符号是否相同:如果相同,结果符号不变,并进行绝对值相加
13、如果相同,结果符号不变,并进行绝对值相加如果相同,结果符号不变,并进行绝对值相加如果相同,结果符号不变,并进行绝对值相加如果不同,结果取绝对值大的数的符号,并进如果不同,结果取绝对值大的数的符号,并进如果不同,结果取绝对值大的数的符号,并进如果不同,结果取绝对值大的数的符号,并进行绝对值相减行绝对值相减行绝对值相减行绝对值相减2023/1/1617整型数据的类型及规定整型数据的类型及规定整型数据的类型及规定整型数据的类型及规定(注:此结果是在注:此结果是在注:此结果是在注:此结果是在VC+VC+环境中运环境中运环境中运环境中运行,行,行,行,win-tcwin-tc中结果中结果中结果中结果 不
14、一样不一样不一样不一样)l l方括号表示可选项方括号表示可选项l lshort 分配分配2 Byte,int、long分配分配4 Byte类型名称类型名称类型名称类型名称类型符类型符类型符类型符bitbit取值范围取值范围取值范围取值范围(短整型短整型短整型短整型)signed signed shortshort int int 1616-2 215152 21515-1-1(-32768(-3276832767)32767)无符号短整无符号短整无符号短整无符号短整型型型型unsigned unsigned shortshort intint16160 0 2 21616-1-1(0(0655
15、35)65535)*整型整型整型整型长整型长整型长整型长整型 signed signed int int signed signed longlong int int3232-2-231312 23131-1-1*无符号整无符号整无符号整无符号整型无符号长型无符号长型无符号长型无符号长整型整型整型整型unsigned unsigned intintunsigned longunsigned long int int32320 0 2 23232-1-12023/1/1618说明说明1.有符号和无符号整型数据有符号和无符号整型数据 有符号的整型数据有符号的整型数据 signed short 无符
16、号的整型数据无符号的整型数据 unsigned short区别是将区别是将最高位最高位看作符号位还是数据位看作符号位还是数据位例如:例如:1111 1111 1010 1000作为作为有符号数有符号数使用时,最高为符号位使用时,最高为符号位为负数,值是:为负数,值是:-88(再求一次补)(再求一次补)作为作为无符号数无符号数使用时,最高为数据位使用时,最高为数据位为无符号的数,值是:为无符号的数,值是:654482023/1/1619例如:例如:main()main()unsigned short int m;unsigned short int m;m=m=6544865448;printf
17、(m=printf(m=%d%dn,m);n,m);printf(m=printf(m=%u%un,m);n,m);输出结果:输出结果:m=-88m=65448 注:这是在注:这是在注:这是在注:这是在 win-tcwin-tc下运行下运行下运行下运行的结果,的结果,的结果,的结果,VC+VC+下均为下均为下均为下均为6544865448,因为,因为,因为,因为VC+VC+下下下下unsigned intunsigned int与与与与intint都是占都是占都是占都是占4 4个字节个字节个字节个字节按有符号数输出按有符号数输出按无符号数输出按无符号数输出2023/1/1620说明说明2:整数
18、溢出问题:超出范围:整数溢出问题:超出范围系统为系统为系统为系统为short short 型数型数型数型数分配的存储空间为分配的存储空间为分配的存储空间为分配的存储空间为:16 16 bit bit(2Byte)(2Byte)=2=21515-1=32767-1=327670 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0问题:上数再加问题:上数再加问题:上数再加问题:上数再加1 1是多少?是多少?是多少?是多少?=-2=-21515=-32768=-32768表示范围:表示范围:-32768-32768 3276732
19、767使用中注意数的范围使用中注意数的范围有符号有符号有符号有符号shortshort型整数的最型整数的最型整数的最型整数的最大大值值值值有符号有符号有符号有符号shortshort型整数的最型整数的最型整数的最型整数的最小小值值值值2023/1/1621例如:例如:void main()void main()short int a,b;short int a,b;a=a=3276732767;b=a+1;b=a+1;printf(printf(“a=%dnb=%dna=%dnb=%dn“,a,b);,a,b);输出结果:输出结果:a=m=32767-327682023/1/16222.2.2
20、 实型数据实型数据 1实型数据的类型实型数据的类型 单精度实型数据单精度实型数据 float,分配分配4 Byte 双精度实型数据双精度实型数据double,分配,分配 8 Byte2实型数据的存储实型数据的存储 单精度实型单精度实型单精度实型单精度实型指数部分指数部分指数部分指数部分小数部分小数部分小数部分小数部分 小数的符号位小数的符号位指数的符号位指数的符号位2023/1/1623实型数据的类型及规定实型数据的类型及规定 l lC C标准并未具体规定各种实型数据所占字节数,也不规标准并未具体规定各种实型数据所占字节数,也不规标准并未具体规定各种实型数据所占字节数,也不规标准并未具体规定各
21、种实型数据所占字节数,也不规定具体小数和指数部分的位数。定具体小数和指数部分的位数。定具体小数和指数部分的位数。定具体小数和指数部分的位数。l l一般而言,小数部分位数多,数据表示的有效数字多,一般而言,小数部分位数多,数据表示的有效数字多,一般而言,小数部分位数多,数据表示的有效数字多,一般而言,小数部分位数多,数据表示的有效数字多,精度就高;而指数部分位数多,则表示的数据范围更大。精度就高;而指数部分位数多,则表示的数据范围更大。精度就高;而指数部分位数多,则表示的数据范围更大。精度就高;而指数部分位数多,则表示的数据范围更大。有效数字的意义?有效数字的意义?类型类型类型类型类型符类型符类
22、型符类型符ByteByte绝对值的范围绝对值的范围绝对值的范围绝对值的范围有效数字有效数字有效数字有效数字单精度型单精度型单精度型单精度型 floatfloat4 41010-37 -37 10 1038387 78 8 位位位位双精度型双精度型双精度型双精度型 doubledouble8 81010-307-307 101030830815151616位位位位2023/1/1624例如:例如:void main()l lfloat x=12345.54321;l l double y=445566778899.987654321;l l printf(x=%fny=%fn,x,y);输出结果
23、:输出结果:x=y=有效数字的具体含义有效数字的具体含义12345.54296912345.542969445566778899.987670445566778899.9876702023/1/16252.1.3 字符型数据字符型数据 l l字符型数据字符型数据char,分配分配 1 Byte l l字符型数据是指字母、数字、各种符号等字符型数据是指字母、数字、各种符号等用用ASCII值表示的字符值表示的字符l l例如例如 a 是一个是一个char类型数据,称作字符类型数据,称作字符常量,存储:常量,存储:0 1 1 0 0 0 0 1最高位为最高位为0将a 转为ASCII2023/1/162
24、62.1.4 空类型空类型(void)l l通常与指针或函数结合使用通常与指针或函数结合使用eg.void main()2023/1/16272.3 常量、变量常量、变量l主要内容:主要内容:常量常量 变量变量2023/1/16282.3.1 常量常量 l l在运行程序的过程中值保持不变的量在运行程序的过程中值保持不变的量1整型常量整型常量 十进制十进制十进制十进制:0909 八进制八进制八进制八进制:0707,以,以,以,以 0 0开头开头开头开头 十六进制十六进制十六进制十六进制:0909,AF/afAF/af,以以以以 0 0 x x或或或或 0 0X X 开头开头开头开头例如:例如:1
25、00 -8 0 +123100 -8 0 +123010 024 0100 073010 024 0100 0730 0 x38 0 x10 0X10 0XFF 0 x0ax38 0 x10 0X10 0XFF 0 x0a2023/1/16291.整型常量整型常量注意:注意:l l十六进制常量中可以使用大写字母十六进制常量中可以使用大写字母AF,也可以使用小写字母也可以使用小写字母af。l l八进制常量中不能出现数字八进制常量中不能出现数字 8 或或 9例如:例如:018、0921非法非法l l可以表示成可以表示成8进制,进制,10进制和进制和16进制进制2023/1/1630说明说明.整型常
26、量的类型整型常量的类型l l根据值大小默认类型。根据值大小默认类型。l lint a=5;int a=5;l llong a=5;long a=5;l lshort b=32768;short b=32768;2023/1/1631说明说明.整型常量的类型整型常量的类型l l整型常量后面加整型常量后面加l或或L,则认为是则认为是long int型型 例如:例如:123L、0L、432l、0 x100ll l整型常量后面加整型常量后面加u或或U,则认为是则认为是unsigned型型 例如:例如:15u、234u、017u、0123u 0 xFu、0 xACu 15Lu、543Lu2023/1/1
27、6322.实型常量实型常量 十进制形式十进制形式十进制形式十进制形式 1.0 1.+12.0 -12.0 0.01.0 1.+12.0 -12.0 0.0 指数形式指数形式指数形式指数形式 1 1e3 1.8e-3 -123E-6 -.1E-3e3 1.8e-3 -123E-6 -.1E-3等价于:等价于:等价于:等价于:1101103 3 1.810 1.810-3-3 -1231012310-6-6 -0.1100.110-3-3指数只能是整数,而尾数则可以是整数也可以是指数只能是整数,而尾数则可以是整数也可以是小数小数,无论指数或尾数均不能省略,无论指数或尾数均不能省略例如:例如:1 1
28、e e、E.5E.5、E-3E-3 非法非法实型常量的类型:默认为实型常量的类型:默认为doubledouble型,后面加型,后面加F F(或或f f),),则强调表示该数是则强调表示该数是float类型类型例如:例如:3.5f f、1e2F F 2023/1/16333.字符型常量字符型常量 l l可视字符常量可视字符常量可视字符常量可视字符常量 单引号括起来的单个可视字符单引号括起来的单个可视字符单引号括起来的单个可视字符单引号括起来的单个可视字符例如:例如:例如:例如:aa、A A、+、33、等等等等 l l转义字符常量转义字符常量转义字符常量转义字符常量 单引号括起来的单引号括起来的单
29、引号括起来的单引号括起来的 与与与与可视字符可视字符可视字符可视字符组合,例如:组合,例如:组合,例如:组合,例如:0000字符串结束标志字符串结束标志字符串结束标志字符串结束标志 n n回车换行回车换行回车换行回车换行 t t跳到下一个输出位置跳到下一个输出位置跳到下一个输出位置跳到下一个输出位置 双引号字符双引号字符双引号字符双引号字符 dddddd dddddd为为为为1 1到到到到3 3位八进制数所代表的字符位八进制数所代表的字符位八进制数所代表的字符位八进制数所代表的字符 xhhxhh hhhh为为为为1 1到到到到2 2位十六进制数所代表的字符位十六进制数所代表的字符位十六进制数所
30、代表的字符位十六进制数所代表的字符2023/1/16l l#includel lvoid main()l ll l int a,b,c;l l a=1;b=2;c=3;l lprintf(%dnt%d%dn%d%dtb%dn,a,b,c,a,b,c);l l2023/1/16354.字符串常量字符串常量 l l用双引号括起的一个字符序列用双引号括起的一个字符序列 例如:例如:ABC、123、a、nt nGood morningl l字符串常量的长度字符串常量的长度:所包含的字符个数所包含的字符个数 l l字符串常量的存储方式:字符串常量的存储方式:n nGG o o o o d dmm o o
31、 r rn ni i n n g g 00a a00所占存储单元数:所占存储单元数:串长度串长度1例如:例如:字符串字符串结束标记结束标记2023/1/1636说明说明 字符串常量与字符常量字符串常量与字符常量 字符串字符串字符串字符串字符字符字符字符标志标志标志标志“”“”长度长度长度长度多个字符多个字符多个字符多个字符单个字符单个字符单个字符单个字符内存内存内存内存字符个数字符个数字符个数字符个数+1+11 1个字节个字节个字节个字节变量变量变量变量无字符串变量无字符串变量无字符串变量无字符串变量有字符变量有字符变量有字符变量有字符变量转义字符转义字符转义字符转义字符 支持支持支持支持,特
32、别特别特别特别”支持支持支持支持,特别特别特别特别 2023/1/16375.符号常量符号常量 l l以标识符来代表的常量以标识符来代表的常量以标识符来代表的常量以标识符来代表的常量l l事先编译预处理命令事先编译预处理命令事先编译预处理命令事先编译预处理命令definedefine定义定义定义定义l l编译时先由系统替换为它所代表的常量,再进行编译时先由系统替换为它所代表的常量,再进行编译时先由系统替换为它所代表的常量,再进行编译时先由系统替换为它所代表的常量,再进行编译编译编译编译例如:例如:例如:例如:#define define LENLEN 2.52.5main()main()flo
33、at a,b;float a,b;a=2*3.14*a=2*3.14*LENLEN;b=3.14*b=3.14*LENLEN*LENLEN;printf(a=%f,b=%fn,a,b);printf(a=%f,b=%fn,a,b);定义符号常量定义符号常量定义符号常量定义符号常量使用符号常量使用符号常量使用符号常量使用符号常量编译前系统进行替换编译前系统进行替换编译前系统进行替换编译前系统进行替换2023/1/16385.符号常量符号常量main()float a,b;a=2*3.14*2.5;b=3.14*2.5*2.5;printf(a=%f,b=%fn,a,b);define是编译预处理
34、命令,必须以是编译预处理命令,必须以“#”开开头头编译预处理命令在后续章节会继续讨论。编译预处理命令在后续章节会继续讨论。替换为替换为替换为替换为2023/1/16392.3.2 变量变量 1.变量的有关概念变量的有关概念l l在程序运行过程中,其值改变的数据,称在程序运行过程中,其值改变的数据,称为变量,变量用标识符表示,称为为变量,变量用标识符表示,称为变量名变量名。l l变量必须变量必须“先定义后使用先定义后使用”l l系统为变量分配存储单元,存储变量的值。系统为变量分配存储单元,存储变量的值。l l编写程序时通过变量名来存、取编写程序时通过变量名来存、取变量值变量值。a a510510
35、变量值变量值变量值变量值为变量分配的为变量分配的为变量分配的为变量分配的存储单元存储单元存储单元存储单元变量名变量名变量名变量名例如:例如:有有变量变量a a它的值是它的值是5 510102023/1/16402.变量定义变量定义变量定义的一般格式:变量定义的一般格式:数据类型说明符数据类型说明符 变量列表变量列表;例如:例如:int i,j;long k,m;float x,y;char ch1,ch2;变量名:变量名:必须使用合法的标识符作变量名必须使用合法的标识符作变量名不能使用关键字为变量命名不能使用关键字为变量命名多个变量之间用,分隔多个变量之间用,分隔多个变量之间用,分隔多个变量之
36、间用,分隔变量必须先定义后使用变量必须先定义后使用变量必须先定义后使用变量必须先定义后使用2023/1/1641说明:说明:变量定义注意事项变量定义注意事项l l多个变量之间用,分隔多个变量之间用,分隔l l变量必须先定义后使用变量必须先定义后使用int i,j;i=j=1;int i,int j;int a;b=10;2023/1/16423.变量的初始化:变量的初始化:允许在说明变量的时候对变量赋初值。允许在说明变量的时候对变量赋初值。例如:例如:int a=5,b=10+2;double x=23.568,y;char ch1=a,ch2=66,ch3=142;表示定义变量并对变量存储单
37、元赋值。表示定义变量并对变量存储单元赋值。错误的初始化:错误的初始化:int a=3+b,b=5;float m=n=23.16;2023/1/16432.4 运算符和表达式运算符和表达式l l主要内容:主要内容:算术运算符和算术表达式算术运算符和算术表达式 赋值运算符和赋值表达式赋值运算符和赋值表达式 关系运算符和关系表达式关系运算符和关系表达式 逻辑运算符和逻辑表达式逻辑运算符和逻辑表达式 位运算符和位运算表达式位运算符和位运算表达式 条件运算符和条件表达式条件运算符和条件表达式 逗号运算符和逗号表达式逗号运算符和逗号表达式 其他运算符及其运算其他运算符及其运算2023/1/1644运算符
38、的有关概念运算符的有关概念l l作用:作用:对运算对象完成规定的操作运算对运算对象完成规定的操作运算l l类型:类型:按运算对象分:按运算对象分:l l单目、双目、三目单目、双目、三目单目、双目、三目单目、双目、三目 按功能分:按功能分:l l算术、赋值、关系、逻辑算术、赋值、关系、逻辑算术、赋值、关系、逻辑算术、赋值、关系、逻辑l l条件、逗号、位、其他条件、逗号、位、其他条件、逗号、位、其他条件、逗号、位、其他2023/1/1645运算符的优先级和结合性运算符的优先级和结合性l l优先级优先级 指各种运算符号的运算优先顺序指各种运算符号的运算优先顺序指各种运算符号的运算优先顺序指各种运算符
39、号的运算优先顺序例如:例如:例如:例如:算术运算优先于关系运算算术运算优先于关系运算算术运算优先于关系运算算术运算优先于关系运算 算术运算中先算术运算中先算术运算中先算术运算中先*/*/*/*/后后后后+-+-+-+-l l结合性结合性 指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向指运算符号和运算对象的结合方向 分为:从左向右分为:从左向右分为:从左向右分为:从左向右(左结合左结合左结合左结合)和从右向左和从右向左和从右向左和从右向左(右结合右结合右结合右结合)例如:例如:例如:例如:算术运算符为算术运算符为算术运算符为算术运算符为左结合左结合左结
40、合左结合 a-ba-b+4 4 赋值运算符为赋值运算符为赋值运算符为赋值运算符为右结合右结合右结合右结合 a=b=5a=b=5(C C语言规定见教材语言规定见教材语言规定见教材语言规定见教材 附录附录附录附录)2023/1/1646本章涉及的运算符本章涉及的运算符+-*/%+-*/%+-*/%+-*/%+-+-+-+-+-+-+-+-=+=-=*=/=%=+=-=*=/=%=+=-=*=/=%=+=-=*=/=%=&=|=!=&|&|&|&|!&|&|&|&|?:?:?:?:,&sizeof sizeof sizeof sizeof (数据类型标识符数据类型标识符数据类型标识符数据类型标识符)
41、类型类型类型类型种类种类种类种类算术运算符算术运算符算术运算符算术运算符赋值运算符赋值运算符赋值运算符赋值运算符关系运算符关系运算符关系运算符关系运算符逻辑运算符逻辑运算符逻辑运算符逻辑运算符位运算符位运算符位运算符位运算符条件运算符条件运算符条件运算符条件运算符逗号运算符逗号运算符逗号运算符逗号运算符其他运算符其他运算符其他运算符其他运算符2023/1/1647表达式的有关概念表达式的有关概念l l什么是表达式什么是表达式由由运算符运算符将运算对象连接成的式子,它将运算对象连接成的式子,它描述了一个具体的求值运算过程。描述了一个具体的求值运算过程。l l计算表达式的值计算表达式的值按照运算符
42、的运算规则求值按照运算符的运算规则求值求值时注意运算符的优先级和结合性求值时注意运算符的优先级和结合性l l表达式值的类型表达式值的类型自动转换自动转换强制转换强制转换 2023/1/1648算术运算算术运算l l算术运算符的优先级算术运算符的优先级()+-+-*/%+-同级 同级 同级 单目单目 双目双目 高高高高 低低低低l l没有乘方运算符没有乘方运算符没有乘方运算符没有乘方运算符,要计算,要计算,要计算,要计算a a3 3要写作要写作要写作要写作 a*a*a a*a*a 的连乘,的连乘,的连乘,的连乘,或用标准库函数或用标准库函数或用标准库函数或用标准库函数 pow(apow(a,3)
43、,3)l l“/”的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两的运算对象可为各种类型数据,但是当进行两个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据个整型数据相除时,运算结果也是整型数据 l l“%”要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两要求运算对象必须是整型数据,功能是求两数相除的余数,余数的符号与被除数的符号相同。数相除的余数,余数的符号与被除数的符号相同。数相除的余数,余
44、数的符号与被除数的符号相同。数相除的余数,余数的符号与被除数的符号相同。例例例例ex2_8ex2_8ex2_8ex2_82023/1/1649自增自减运算自增自减运算l l+-是是单目运算符单目运算符l l有前缀和后缀有前缀和后缀两种形式两种形式 前缀形式前缀形式:先自增先自增(自减自减)再引用;再引用;后缀形式后缀形式:先引用再自增先引用再自增(自减自减);l l功能:功能:前缀形式前缀形式 +a a 等价于等价于 a=a+1a=a+1 -a a 等价于等价于 a=a a=a 1 1 后缀形式后缀形式 a+a+等价于等价于 a=a+1a=a+1 a a-等价于等价于 a=a a=a 1 1表
45、达式的值会不同表达式的值会不同2023/1/1650例如:例如:当当 a5 时时 +a 表达式的值为表达式的值为 6,且且 a6 a+表达式的值为表达式的值为5,且且 a6 b=+a 等价于等价于 a=a+1;b=a 表达式的值为表达式的值为6,且,且 a=6,b=6 b=a+等价于等价于 b=a;a=a+1 表达式的值为表达式的值为5,且,且 a=6,b=5 2023/1/16l l#include#includel lmain()main()l l int i=8;int i=8;l l printf(%dn,+i);printf(%dn,+i);l l printf(%dn,-i);pr
46、intf(%dn,-i);l l printf(%dn,i+);printf(%dn,i+);l l printf(%dn,i-);printf(%dn,i-);l l printf(%dn,-i+);printf(%dn,-i+);l l printf(%dn,-i-);printf(%dn,-i-);l l 例例ex2_92023/1/1652说明:说明:l l+和和和和 -的运算对象只能是变量(或运算结果是的运算对象只能是变量(或运算结果是的运算对象只能是变量(或运算结果是的运算对象只能是变量(或运算结果是变量的表达式)变量的表达式)变量的表达式)变量的表达式),不能是常量(或运算结果是
47、数不能是常量(或运算结果是数不能是常量(或运算结果是数不能是常量(或运算结果是数值的表达式)。值的表达式)。值的表达式)。值的表达式)。例如:例如:例如:例如:5+5+、(a+2)+a+2)+不合法。不合法。不合法。不合法。l l具有右结合性,结合方向为从右到左。具有右结合性,结合方向为从右到左。具有右结合性,结合方向为从右到左。具有右结合性,结合方向为从右到左。例如:例如:例如:例如:a+a+等价于等价于等价于等价于 -(-(a+)a+)l l如果有多个运算符连续出现时,如果有多个运算符连续出现时,如果有多个运算符连续出现时,如果有多个运算符连续出现时,C C系统尽可能多系统尽可能多系统尽可
48、能多系统尽可能多的从左到右将字符组合成一个运算符的从左到右将字符组合成一个运算符的从左到右将字符组合成一个运算符的从左到右将字符组合成一个运算符例如:例如:例如:例如:i+ji+j 等价于等价于等价于等价于 (i+)+ji+)+j -i+-j-i+-j 等价于等价于等价于等价于 -(-(i+)+(-j)i+)+(-j)2023/1/1653赋值运算赋值运算l l赋值运算符赋值运算符(右结合)右结合)=+=-=*=/=%=&=|=l l赋值表达式赋值表达式 将将表达式的值表达式的值存入存入变量变量对应的内存单元中对应的内存单元中m=12b=(+a)-2 m%=3+n 等价于等价于 m=m%(3+
49、n)x*=(x=5)2023/1/1654说明:说明:l l赋值号左边必须是变量,右边可以是赋值号左边必须是变量,右边可以是C语言语言任意合法的表达式任意合法的表达式例如:例如:n=t+210 等价于:等价于:a=(b=(b*c)10)2023/1/1655赋值表达式的转换规则赋值表达式的转换规则l l实型实型 赋给赋给 整型变量整型变量整数部分赋给整型变量,舍去小数部分整数部分赋给整型变量,舍去小数部分int x;x=6.89;后后 x=l l整型整型 赋给赋给 实型实型 例如:例如:float x;x=6;后后 x=l l赋值号与数学中的等号含义不同赋值号与数学中的等号含义不同例如:例如:
50、数学中数学中 a=b 等价于等价于 b=a C语言中语言中 a=b 不等价于不等价于 b=a6 66.06.0根据左值确定表达式的类型,右边精度高,根据左值确定表达式的类型,右边精度高,会丢失一部分数据会丢失一部分数据2023/1/1656关系运算关系运算l l关系运算符关系运算符关系运算符关系运算符 (左结合)左结合)左结合)左结合)=!=!=较高较高较高较高 较低较低较低较低l l关系表达式关系表达式关系表达式关系表达式 用关系运算符将运算对象连接成的式子用关系运算符将运算对象连接成的式子用关系运算符将运算对象连接成的式子用关系运算符将运算对象连接成的式子 例如:例如:例如:例如:1212