资源预览内容
第1页 / 共97页
第2页 / 共97页
第3页 / 共97页
第4页 / 共97页
第5页 / 共97页
第6页 / 共97页
第7页 / 共97页
第8页 / 共97页
第9页 / 共97页
第10页 / 共97页
亲,该文档总共97页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第2 2章章 数据类型、运算符与表达式数据类型、运算符与表达式南京审计学院南京审计学院信息科学与技术学院信息科学与技术学院孙玉星孙玉星 2024/9/22/98本章学习内容本章学习内容本章学习内容本章学习内容 标识符命名;标识符命名;标识符命名;标识符命名; 变量和常量;变量和常量;变量和常量;变量和常量; 数据类型;(整型、浮点型、字符型)数据类型;(整型、浮点型、字符型)数据类型;(整型、浮点型、字符型)数据类型;(整型、浮点型、字符型) 常用运算符和表达式;常用运算符和表达式;常用运算符和表达式;常用运算符和表达式;3.34.23.34.2 运算符的优先级与结合性运算符的优先级与结合性运算符的优先级与结合性运算符的优先级与结合性 2024/9/23/98C Program StructureC Program StructurePreprocessorInstructionPengisytiharangloblmain()PengisytiharansetempatStatementGlobalDeclarationLocalDeclarationStillrememberStillrememberthisdiagram?thisdiagram?2024/9/24/98例例例例2.12.1:一个简单的:一个简单的:一个简单的:一个简单的C C程序例子程序例子程序例子程序例子 #include /*函数功能函数功能:计算两个整数相加之和计算两个整数相加之和 入口参数入口参数:整型数据整型数据a和和b 返回值:返回值: 整型数整型数a和和b之和之和*/int Add(int a, int b)return (a + b);/*主函数主函数*/main()int x, y, sum = 0;printf(Input two integers:);scanf(%d%d, &x, &y); /*输入两个整型数输入两个整型数x和和y*/sum = Add(x, y); /*调用函数调用函数Add计算计算x和和y相加之和相加之和*/printf(sum = %dn, sum); /*输出输出x和和y相加之和相加之和*/并列的两个函数并列的两个函数并列的两个函数并列的两个函数其中一个是其中一个是其中一个是其中一个是程序的入口程序的入口程序的入口程序的入口程序注释程序注释程序注释程序注释编译预处理命令编译预处理命令编译预处理命令编译预处理命令2024/9/25/98C C程序常见符号分类程序常见符号分类程序常见符号分类程序常见符号分类 关键字(关键字(关键字(关键字(KeywordKeyword) 又称保留字(又称保留字(又称保留字(又称保留字( CCReservedWordReservedWord ) AwordthathasspecialmeaninginCAwordthathasspecialmeaninginC 标识符(标识符(标识符(标识符(IdentifierIdentifier) CStandardIdentifierCStandardIdentifier(系统预定义标系统预定义标系统预定义标系统预定义标识符)识符)识符)识符) AwordhavingspecialmeaningbutAwordhavingspecialmeaningbutmayberedefined(butisnotmayberedefined(butisnotrecommended!)recommended!) 用户自定义标识符用户自定义标识符用户自定义标识符用户自定义标识符 变量,函数名,变量,函数名,变量,函数名,变量,函数名,2024/9/26/98C C程序常见符号分类程序常见符号分类程序常见符号分类程序常见符号分类 运算符(运算符(运算符(运算符(OperatorOperator)3434种,详见附录种,详见附录种,详见附录种,详见附录C C 分隔符(分隔符(分隔符(分隔符(SeparatorSeparator) 空格、回车空格、回车空格、回车空格、回车/ /换行、逗号等换行、逗号等换行、逗号等换行、逗号等 其它符号其它符号其它符号其它符号 “ “”和和和和“ “”标识函数体或语句标识函数体或语句标识函数体或语句标识函数体或语句块块块块 “ “/*”/*”和和和和“*“*/”/”程序注释的定界程序注释的定界程序注释的定界程序注释的定界符符符符 常量(常量(常量(常量(ConstantConstant)2024/9/27/98标识符命名标识符命名标识符命名标识符命名 变量名,函数名变量名,函数名变量名,函数名变量名,函数名 由英文字母、数字和下划线组成,大小写敏感由英文字母、数字和下划线组成,大小写敏感由英文字母、数字和下划线组成,大小写敏感由英文字母、数字和下划线组成,大小写敏感 不可以不可以不可以不可以是数字开头是数字开头是数字开头是数字开头 直观,见名知意,便于记忆和阅读直观,见名知意,便于记忆和阅读直观,见名知意,便于记忆和阅读直观,见名知意,便于记忆和阅读 最好使用英文单词或其组合最好使用英文单词或其组合最好使用英文单词或其组合最好使用英文单词或其组合 切忌使用汉语拼音切忌使用汉语拼音切忌使用汉语拼音切忌使用汉语拼音 下划线和大小写通常用来增强可读性下划线和大小写通常用来增强可读性下划线和大小写通常用来增强可读性下划线和大小写通常用来增强可读性 variablenamevariablename variable_namevariable_name variableNamevariableName 不允许使用关键字作为标识符的名字不允许使用关键字作为标识符的名字不允许使用关键字作为标识符的名字不允许使用关键字作为标识符的名字 intint, float, for, while, if, float, for, while, if等等等等 某些功能的变量采用习惯命名某些功能的变量采用习惯命名某些功能的变量采用习惯命名某些功能的变量采用习惯命名 如:如:如:如:forfor语句所采用的循环变量习惯用语句所采用的循环变量习惯用语句所采用的循环变量习惯用语句所采用的循环变量习惯用i, j, ki, j, kWindows Windows 风格风格UNIX UNIX 风格风格2024/9/28/98何谓变量何谓变量何谓变量何谓变量(Variable Variable )?)?)?)? Anameassociatedwithamemorycellwhosevaluecanchange2024/9/29/98如何衡量变量所占空间大小?如何衡量变量所占空间大小?如何衡量变量所占空间大小?如何衡量变量所占空间大小? bitbit,中文叫法:中文叫法:中文叫法:中文叫法:位位位位 ByteByte,中文叫法:中文叫法:中文叫法:中文叫法:字节字节字节字节 Kilobyte(KBKilobyte(KB) ),中文叫法:中文叫法:中文叫法:中文叫法: KK Megabyte(MBMegabyte(MB) ),中文叫法:中文叫法:中文叫法:中文叫法:兆兆兆兆 Gigabyte(GBGigabyte(GB) ),中文叫法:中文叫法:中文叫法:中文叫法:GG Terabyte(TBTerabyte(TB) ),中文叫法:中文叫法:中文叫法:中文叫法:T T1TB1TB= 1,024GB1,024GB1GB1GB = 1,024MB1,024MB1MB1MB = 1,024KB1,024KB1KB1KB = 1,024B1,024B1B1B= 8b8b2024/9/210/98 一个位有多大?一个位有多大?一个位有多大?一个位有多大?只能是只能是只能是只能是“ “0”0”或者或者或者或者“ “1”1”,二,二,二,二进制进制进制进制 一个字节有多大?一个字节有多大?一个字节有多大?一个字节有多大?可以表示数字可以表示数字可以表示数字可以表示数字02550255之间的之间的之间的之间的整数整数整数整数保存一个字符(英文字母、保存一个字符(英文字母、保存一个字符(英文字母、保存一个字符(英文字母、数字、符号)数字、符号)数字、符号)数字、符号) ASCIIASCII(美国标准信息交换(美国标准信息交换(美国标准信息交换(美国标准信息交换码)编码(附录码)编码(附录码)编码(附录码)编码(附录A A)如何衡量变量所占空间大小?如何衡量变量所占空间大小?如何衡量变量所占空间大小?如何衡量变量所占空间大小?2024/9/211/98 Needstobedeclared: 变量类型变量类型变量名变量名;Example:int sum;int x,y,sum=0;变量声明变量声明变量声明变量声明(Variable Declaration)(Variable Declaration)2024/9/212/98变量声明变量声明变量声明变量声明( (Variable DeclarationVariable Declaration) ) 使用变量的基本原则使用变量的基本原则使用变量的基本原则使用变量的基本原则 变量必须先定义,后使用变量必须先定义,后使用变量必须先定义,后使用变量必须先定义,后使用 所有变量必须在第一条可执行语句前所有变量必须在第一条可执行语句前所有变量必须在第一条可执行语句前所有变量必须在第一条可执行语句前定义定义定义定义 声明的顺序无关紧要声明的顺序无关紧要声明的顺序无关紧要声明的顺序无关紧要 一条声明语句可声明若干个同类型一条声明语句可声明若干个同类型一条声明语句可声明若干个同类型一条声明语句可声明若干个同类型的变量的变量的变量的变量 声明变量是初始化变量的最好时机声明变量是初始化变量的最好时机声明变量是初始化变量的最好时机声明变量是初始化变量的最好时机 不被初始化的变量,其值为随机数不被初始化的变量,其值为随机数不被初始化的变量,其值为随机数不被初始化的变量,其值为随机数结果会是什么?结果会是什么?结果会是什么?结果会是什么?2024/9/213/98Example:int number1, number2;number1 = 25;number2 = 23;number1 = number2;number1?number2?252323变量赋值变量赋值变量赋值变量赋值( (Variable AssignmentVariable Assignment) )2024/9/214/98Algorithm 变量变量变量变量 表达式表达式表达式表达式 Syntax 变量变量变量变量=表达式表达式表达式表达式 ; ;Rules:类型一致类型一致类型一致类型一致Expressions type must be the same as variables typeValidExample:InvalidExample:intint x; x; intint y; y;x = 12;x = 12;y = 5.75;y = 5.75;变量赋值变量赋值变量赋值变量赋值( (Variable AssignmentVariable Assignment) )2024/9/215/98Example:Calculate and display the price of a number of apples if the quantity in kg and price per kg are given.Input:quantityquantity and pricePerkgpricePerkgOutput:pricepriceProcess:priceprice = quantityquantity * pricePerkgpricePerkg变量赋值变量赋值变量赋值变量赋值( (Variable AssignmentVariable Assignment) )2024/9/216/98Example:intint quantity; quantity;float float pricePerkgpricePerkg, price;, price;quantity = 5;quantity = 5;pricePerkgpricePerkg = 4.50; = 4.50;price = quantity * price = quantity * pricePerkgpricePerkg; ; Howdoesthisprogramwork?变量赋值变量赋值变量赋值变量赋值( (Variable AssignmentVariable Assignment) )2024/9/217/98Example:intint quantity; quantity;float float pricePerkgpricePerkg, price;, price;quantity = 2;quantity = 2;pricePerkgpricePerkg = 4.50; = 4.50;price = quantity * price = quantity * pricePerkgpricePerkg; ; quantity?pricePerkg?price?4.509.002变量赋值变量赋值变量赋值变量赋值( (Variable AssignmentVariable Assignment) )2024/9/218/98Example:intint quantity; quantity;float float pricePerkgpricePerkg; ;float price;float price;WhydidwedeclareWhydidwedeclareitasitasintint? ?WhydidweWhydidwedeclarethemasdeclarethemasfloatfloat? ?变量类型变量类型变量类型变量类型(Variable Type)(Variable Type)2024/9/219/98数据类型(数据类型(数据类型(数据类型(Data TypeData Type) 为什么要区分类型?为什么要区分类型?为什么要区分类型?为什么要区分类型? 不同类型有什么不同?不同类型有什么不同?不同类型有什么不同?不同类型有什么不同?数据表示形式数据表示形式数据表示形式数据表示形式合法的取值范围合法的取值范围合法的取值范围合法的取值范围占用内存空间大小占用内存空间大小占用内存空间大小占用内存空间大小可参与的运算种类可参与的运算种类可参与的运算种类可参与的运算种类 2024/9/220/98数据类型(数据类型(数据类型(数据类型(Data TypeData Type)数据类型数据类型基本类型基本类型构造类型构造类型指针类型指针类型空类型空类型整型整型实型(浮点型)实型(浮点型)字符型字符型枚举类型枚举类型数组类型数组类型结构体类型结构体类型共用体类型共用体类型单精度实型双精度实型基本整型长整型短整型无符号整型2024/9/221/98基本数据类型基本数据类型基本数据类型基本数据类型 intint整数,在目前绝大多数机器上占整数,在目前绝大多数机器上占整数,在目前绝大多数机器上占整数,在目前绝大多数机器上占4 4个字节个字节个字节个字节TC2.0TC2.0,2 2个字节个字节个字节个字节 floatfloat单精度浮点数,单精度浮点数,单精度浮点数,单精度浮点数,4 4个字节个字节个字节个字节 doubledouble双精度浮点数,双精度浮点数,双精度浮点数,双精度浮点数,8 8个字节个字节个字节个字节 charchar字符,字符,字符,字符,1 1个字节个字节个字节个字节表示表示表示表示256256个个个个ASCIIASCII字符,或字符,或字符,或字符,或02550255的整数的整数的整数的整数2024/9/222/98数据类型修饰符数据类型修饰符数据类型修饰符数据类型修饰符 shortshortshortshort intint,简写为,简写为,简写为,简写为shortshort,短整数,短整数,短整数,短整数,2 2个字节个字节个字节个字节 longlonglonglong intint,简写为,简写为,简写为,简写为longlong,长整数,长整数,长整数,长整数,4 4个字节个字节个字节个字节longlong doubledouble,长双精度(高精度)浮点数,长双精度(高精度)浮点数,长双精度(高精度)浮点数,长双精度(高精度)浮点数,1010个字节个字节个字节个字节 unsignedunsigned用来修饰用来修饰用来修饰用来修饰charchar、intint、shortshort和和和和longlong无符号无符号无符号无符号整数(正整数和整数(正整数和整数(正整数和整数(正整数和0 0)2024/9/223/98不同类型取值范围不同不同类型取值范围不同不同类型取值范围不同不同类型取值范围不同 C C语言直接提供的任何类型都有取值范围。语言直接提供的任何类型都有取值范围。语言直接提供的任何类型都有取值范围。语言直接提供的任何类型都有取值范围。P22P222024/9/224/98整型类型的取值范围整型类型的取值范围整型类型的取值范围整型类型的取值范围2024/9/225/98浮点类型的取值范围浮点类型的取值范围浮点类型的取值范围浮点类型的取值范围2024/9/226/98不同类型取值范围不同不同类型取值范围不同不同类型取值范围不同不同类型取值范围不同 C C语言直接提供的任何类型都有取值范围。语言直接提供的任何类型都有取值范围。语言直接提供的任何类型都有取值范围。语言直接提供的任何类型都有取值范围。当向其赋超过此范围的数值时,结果会怎样呢?当向其赋超过此范围的数值时,结果会怎样呢?当向其赋超过此范围的数值时,结果会怎样呢?当向其赋超过此范围的数值时,结果会怎样呢?产生数值类型溢出,得到一个不正确的结果。产生数值类型溢出,得到一个不正确的结果。产生数值类型溢出,得到一个不正确的结果。产生数值类型溢出,得到一个不正确的结果。小蛇能吞小蛇能吞小蛇能吞小蛇能吞下大象吗下大象吗下大象吗下大象吗?typeoverflow.ctypeoverflow.c2024/9/227/98何谓类型溢出何谓类型溢出何谓类型溢出何谓类型溢出(OverflowOverflow)?)?)?)? 生活中的例子:生活中的例子:生活中的例子:生活中的例子:千年虫问题千年虫问题千年虫问题千年虫问题阿利亚娜号火箭发射失败阿利亚娜号火箭发射失败阿利亚娜号火箭发射失败阿利亚娜号火箭发射失败 现象与危害:现象与危害:现象与危害:现象与危害:溢出后的数值是可预料的,但不同平台会有所不同溢出后的数值是可预料的,但不同平台会有所不同溢出后的数值是可预料的,但不同平台会有所不同溢出后的数值是可预料的,但不同平台会有所不同当程序从高位计算机向低位计算机移植(比如从当程序从高位计算机向低位计算机移植(比如从当程序从高位计算机向低位计算机移植(比如从当程序从高位计算机向低位计算机移植(比如从6464位位位位系统移植到系统移植到系统移植到系统移植到3232位系统)时,以前从不出现的溢出问题位系统)时,以前从不出现的溢出问题位系统)时,以前从不出现的溢出问题位系统)时,以前从不出现的溢出问题可能出现可能出现可能出现可能出现duringexecutionofadataconversionduringexecutionofadataconversionfrom64-bitfloatingpointto16-bitfrom64-bitfloatingpointto16-bitsignedintegervalue.Thefloatingsignedintegervalue.Thefloatingpointnumberwhichwaspointnumberwhichwasconvertedhadavaluegreaterconvertedhadavaluegreaterthanwhatcouldberepresentedbythanwhatcouldberepresentedbya16-bitsignedinteger.Thisa16-bitsignedinteger.ThisresultedinanOperandError.resultedinanOperandError.2024/9/228/98解决方案解决方案解决方案解决方案? 预先估算运算结果的可能范围,采用取值范围更预先估算运算结果的可能范围,采用取值范围更预先估算运算结果的可能范围,采用取值范围更预先估算运算结果的可能范围,采用取值范围更大的类型。大的类型。大的类型。大的类型。 1+2+3+1+2+3+ 1!+2!+3!+1!+2!+3!+ 1 13 3+2+23 3+3+33 3+在运算还没开始之前就判断运算数是否在合理的取值在运算还没开始之前就判断运算数是否在合理的取值在运算还没开始之前就判断运算数是否在合理的取值在运算还没开始之前就判断运算数是否在合理的取值范围内。如果超出,则停止运算,转错误处理。范围内。如果超出,则停止运算,转错误处理。范围内。如果超出,则停止运算,转错误处理。范围内。如果超出,则停止运算,转错误处理。100!=9.3326215443944*10100!=9.3326215443944*10157157 13+23+n3=(1+2+3+n)13+23+n3=(1+2+3+n)2=2=(n(n+1)/2n(n+1)/2)22 =5050*=5050*50505050 2024/9/229/98不同类型占用的内存字节数不同不同类型占用的内存字节数不同不同类型占用的内存字节数不同不同类型占用的内存字节数不同 因为因为因为因为同种类型在不同的平台其占字节数不尽相同。如同种类型在不同的平台其占字节数不尽相同。如同种类型在不同的平台其占字节数不尽相同。如同种类型在不同的平台其占字节数不尽相同。如intint在在在在1616位、位、位、位、3232位和位和位和位和6464位系统分别占位系统分别占位系统分别占位系统分别占2 2、4 4和和和和8 8个字节。个字节。个字节。个字节。 不要对变量所占的内存空间字节数想当然不要对变量所占的内存空间字节数想当然不要对变量所占的内存空间字节数想当然不要对变量所占的内存空间字节数想当然用用用用sizeofsizeof获得变量或者数据类型的长度获得变量或者数据类型的长度获得变量或者数据类型的长度获得变量或者数据类型的长度 现象与危害:现象与危害:现象与危害:现象与危害:在平台间移植时会出现问题,导致数据丢失或者溢出在平台间移植时会出现问题,导致数据丢失或者溢出在平台间移植时会出现问题,导致数据丢失或者溢出在平台间移植时会出现问题,导致数据丢失或者溢出注意!注意!注意!注意!2024/9/230/98sizeofsizeof到底是什么?到底是什么?到底是什么?到底是什么? C C语言的关键字,并非函数语言的关键字,并非函数语言的关键字,并非函数语言的关键字,并非函数 计算计算计算计算类型类型类型类型占用的字节数占用的字节数占用的字节数占用的字节数 两种语法形式两种语法形式两种语法形式两种语法形式 sizeofsizeof( (类型类型类型类型) ) 结果为结果为结果为结果为类型类型类型类型占用的字节数占用的字节数占用的字节数占用的字节数 sizeofsizeof( (表达式表达式表达式表达式) ) 结果为结果为结果为结果为表达式值所属类型表达式值所属类型表达式值所属类型表达式值所属类型占用的字节数占用的字节数占用的字节数占用的字节数一般都使用一般都使用一般都使用一般都使用sizeofsizeof( (变量名变量名变量名变量名) ) 2024/9/231/98现场演示例现场演示例2.3在在TC和和VC的运行结果的运行结果#include main()printf(Data type Number of bytesn);printf(- -n);printf(char %dn, sizeof(char);printf(int %dn, sizeof(int);printf(short int %dn, sizeof(short);printf(long int %dn, sizeof(long);printf(float %dn, sizeof(float);printf(double %dn, sizeof(double);2024/9/232/98不同类型数据不同类型数据不同类型数据不同类型数据在内存中的存储形式不同在内存中的存储形式不同在内存中的存储形式不同在内存中的存储形式不同 字符型字符型字符型字符型 整型整型整型整型 实型实型实型实型N=SN=S2 2 2 2j j j j阶码符号阶码符号阶码的数值阶码的数值尾数符号尾数符号尾数的数值尾数的数值阶码阶码j尾数尾数S所占位数决定所占位数决定所占位数决定所占位数决定实数的取值范围实数的取值范围实数的取值范围实数的取值范围所占位数决定所占位数决定所占位数决定所占位数决定实数的精度实数的精度实数的精度实数的精度2024/9/233/98常量常量常量常量(ConstantConstant) AvaluethatwillnotchangeAvaluethatwillnotchange Consistsof:Consistsof:整型整型整型整型(e.g.(e.g.0 67 -20 67 -2 123123L L 123 123u u 0 022 22 0x0x1212) ) 缺省为缺省为缺省为缺省为intint实型实型实型实型(e.g.(e.g.2.3 1.2e-5 2.732.3 1.2e-5 2.73F F 2.73 2.73L L) ) 缺省为缺省为缺省为缺省为doubledouble字符型字符型字符型字符型(e.g.(e.g.z 3 $ nz 3 $ n) ) 用用用用 开头的字符为转义字符开头的字符为转义字符开头的字符为转义字符开头的字符为转义字符, ,代表代表代表代表1 1个字符个字符个字符个字符字符串字符串字符串字符串(e.g.(e.g.UKM 1 5aUKM 1 5a) )2024/9/234/98字符常量字符常量字符常量字符常量 转义字符转义字符转义字符转义字符一些特殊字符(无法从键盘输入或者另有它用)用一些特殊字符(无法从键盘输入或者另有它用)用一些特殊字符(无法从键盘输入或者另有它用)用一些特殊字符(无法从键盘输入或者另有它用)用转义字符表示转义字符表示转义字符表示转义字符表示2024/9/235/98字符常量字符常量字符常量字符常量 字符常数就是一个普通整数,也可参与各种数学运算字符常数就是一个普通整数,也可参与各种数学运算字符常数就是一个普通整数,也可参与各种数学运算字符常数就是一个普通整数,也可参与各种数学运算每个字符具有一个每个字符具有一个每个字符具有一个每个字符具有一个02550255之间的数值,可从之间的数值,可从之间的数值,可从之间的数值,可从ASCIIASCII表表表表查出查出查出查出注意:注意:注意:注意:55和整数和整数和整数和整数5 5的区别的区别的区别的区别 55的的的的ASCIIASCII码值是码值是码值是码值是5353 字符的数学运算在密码学内字符的数学运算在密码学内字符的数学运算在密码学内字符的数学运算在密码学内 用得比较多用得比较多用得比较多用得比较多2024/9/236/98例例例例2.52.5:小写字母转换为大写字母:小写字母转换为大写字母:小写字母转换为大写字母:小写字母转换为大写字母 # #includeinclude mainmain()() charchar chch = b; = b; printf printf(%c, %dn, ch, ch);(%c, %dn, ch, ch);chch = b - = b - 3232; ; printfprintf(%c, %dn, ch, ch);(%c, %dn, ch, ch); # #includeinclude mainmain()() charchar chch = b; = b; printf printf(%c, %dn, ch, ch);(%c, %dn, ch, ch); chch = b - = b - (a - A)(a - A) ; ; printfprintf(%c, %dn, ch, ch);(%c, %dn, ch, ch); b, 98B, 66 b, 98B, 66 相当于相当于相当于相当于97-6597-652024/9/237/98字符串常量字符串常量字符串常量字符串常量 用双引号括住的由用双引号括住的由用双引号括住的由用双引号括住的由0 0个或多个字符组成的字符序列个或多个字符组成的字符序列个或多个字符组成的字符序列个或多个字符组成的字符序列 I am a stringI am a string 表示空字符串表示空字符串表示空字符串表示空字符串 除注释外,是唯一可以出现中文的地方除注释外,是唯一可以出现中文的地方除注释外,是唯一可以出现中文的地方除注释外,是唯一可以出现中文的地方 C C语言内部用语言内部用语言内部用语言内部用00表示字符串的结束表示字符串的结束表示字符串的结束表示字符串的结束 xx和和和和xx是不同的是不同的是不同的是不同的 里定义了一系列专门的字符串处理函数里定义了一系列专门的字符串处理函数里定义了一系列专门的字符串处理函数里定义了一系列专门的字符串处理函数 转义字符也可在字符串中使用转义字符也可在字符串中使用转义字符也可在字符串中使用转义字符也可在字符串中使用 字符串字符串字符串字符串tNameAddressntNameAddressn 的长度?的长度?的长度?的长度? 15152024/9/238/98宏常量宏常量宏常量宏常量 #define#define 标识符标识符标识符标识符 字符串字符串字符串字符串 宏常量宏常量宏常量宏常量也称符号常量也称符号常量也称符号常量也称符号常量一般采用全大写字母表示一般采用全大写字母表示一般采用全大写字母表示一般采用全大写字母表示 宏定义不是语句,而是一种编译预处理命令宏定义不是语句,而是一种编译预处理命令宏定义不是语句,而是一种编译预处理命令宏定义不是语句,而是一种编译预处理命令2024/9/239/98例例例例2.2 2.2 :计算圆的周长和面积:计算圆的周长和面积:计算圆的周长和面积:计算圆的周长和面积 # #includeinclude # #definedefine PI 3.14159 PI 3.14159# #definedefine R 5.3 R 5.3mainmain()() printfprintf(area(area = % = %fnfn, PI * R * R);, PI * R * R);printfprintf(circumference(circumference = % = %fnfn, 2 * PI * R);, 2 * PI * R); area = 88.247263circumference = 33.300854相当于执行相当于执行相当于执行相当于执行# #includeinclude mainmain()() printfprintf(area(area = % = %fnfn, 3.14159 * 5.3 * , 3.14159 * 5.3 * 5.35.3););printfprintf(circumference(circumference = % = %fnfn, 2 * 3.14159, 2 * 3.14159 * * 5.3);5.3); 宏替换宏替换宏替换宏替换2024/9/240/98例例例例2.2 2.2 :计算圆的周长和面积:计算圆的周长和面积:计算圆的周长和面积:计算圆的周长和面积 # #includeinclude # #definedefine PI 3.14159 PI 3.14159; ;# #definedefine R 5.3 R 5.3; ;mainmain()() printfprintf(area(area = % = %fnfn, PI * R * R);, PI * R * R);printfprintf(circumference(circumference = % = %fnfn, 2 * PI * R);, 2 * PI * R); 相当于执行相当于执行相当于执行相当于执行# #includeinclude mainmain()() printfprintf(area(area = % = %fnfn, 3.14159, 3.14159; ;*5.3*5.3; ;*5.3*5.3; ;););printfprintf(circumference(circumference = % = %fnfn, 2*3.14159, 2*3.14159; ;* *5.35.3; ;);); 语法错语法错语法错语法错误误误误2024/9/241/98为什么需要常量?为什么需要常量?为什么需要常量?为什么需要常量? 假如不使用常量,直接使用常数,会有什么影响?假如不使用常量,直接使用常数,会有什么影响?假如不使用常量,直接使用常数,会有什么影响?假如不使用常量,直接使用常数,会有什么影响?程序的可读性变差程序的可读性变差程序的可读性变差程序的可读性变差容易发生书写错误容易发生书写错误容易发生书写错误容易发生书写错误当常数需要改变时,要修改所有使用它的代码,工作量当常数需要改变时,要修改所有使用它的代码,工作量当常数需要改变时,要修改所有使用它的代码,工作量当常数需要改变时,要修改所有使用它的代码,工作量大,还可能有遗漏大,还可能有遗漏大,还可能有遗漏大,还可能有遗漏 解决方案:解决方案:解决方案:解决方案:避免使用幻数(直接使用的常数)避免使用幻数(直接使用的常数)避免使用幻数(直接使用的常数)避免使用幻数(直接使用的常数)把幻数定义为宏常量把幻数定义为宏常量把幻数定义为宏常量把幻数定义为宏常量2024/9/242/98运算符(运算符(运算符(运算符( Operator Operator ) 3434种,详见附录种,详见附录种,详见附录种,详见附录c c 常见的运算符常见的运算符常见的运算符常见的运算符算术运算符算术运算符算术运算符算术运算符赋值运算符赋值运算符赋值运算符赋值运算符类型强转类型强转类型强转类型强转关系运算符关系运算符关系运算符关系运算符逻辑运算符逻辑运算符逻辑运算符逻辑运算符增和减增和减增和减增和减位运算符位运算符位运算符位运算符2024/9/243/98运算符和操作数运算符和操作数运算符和操作数运算符和操作数(Operator and OperandOperator and Operand)Example:W+ZOperandOperatorOperandWhatareoperatorandoperand?Whatareoperatorandoperand?2024/9/244/98表达式表达式表达式表达式 ExpressionExpression Anexpressionmaycontain2orAnexpressionmaycontain2ormoremoreoperatorsoperators 每一个表达式都有一个每一个表达式都有一个每一个表达式都有一个每一个表达式都有一个值值值值2024/9/245/98算术运算符(算术运算符(算术运算符(算术运算符(Arithmetic OperatorsArithmetic Operators)Addition(+)Subtraction(-)Multiplication(*)Division(/)Modulus(%)2024/9/246/98 MultiplicationMultiplication(* *),addition,addition(+ +) andand subtractionsubtraction(- -) arethesimplesttousearethesimplesttouse DivisionDivision(/ /) iseasy,butsomeprecautionsiseasy,butsomeprecautionsneedtobetakenneedtobetaken ModulusModulus(% %) istheonethatnormallyistheonethatnormallyconfusesnovicesconfusesnovicesSo,letsstudyindetailtheSo,letsstudyindetailthe DivisionDivision andand ModulusModulus算术运算符(算术运算符(算术运算符(算术运算符(Arithmetic OperatorsArithmetic Operators)2024/9/247/98除法除法除法除法(DivisionDivision)Example:W/Z浮点数除法浮点数除法FloatingDivision WW or Z Z or both are floats整数除法整数除法IntegerDivision WW and Z Z are integers2024/9/248/98Example:整数除法(整数除法(整数除法(整数除法(Integer DivisionInteger Division)8/2=4anintegeranintegertheresultisalsoaninteger2024/9/249/98Example:12/5=2anintegeranintegertheresultisalsoaninteger整数除法(整数除法(整数除法(整数除法(Integer DivisionInteger Division)2024/9/250/98Example:实数除法实数除法实数除法实数除法(Floating DivisionFloating Division)12.0/5=2.4afloatanintegertheresultisafloat2024/9/251/98What will be the answer if an integer is divided by 0? Something to ponder 2024/9/252/98求余求余求余求余(ModulusModulus) Itreturnstheremainderthatoccursafterperformingthedivisionof2operands Rule:操作数必须是操作数必须是操作数必须是操作数必须是整数整数整数整数2024/9/253/98Example:12%5=2anintegeranintegertheresultistheremainderof12/51252102remainderresult求余(求余(求余(求余(ModulusModulus)2024/9/254/98How about if one of the operands is a negative integer?Something to ponder 2024/9/255/98Example:-7%3=-1anintegeraninteger-73-2-6-1remainderresulttheresultistheremainderof-7/3求余(求余(求余(求余(ModulusModulus)2024/9/256/98Example:7%-3=1anintegeraninteger7-3-261remainderresulttheresultistheremainderof7/-3求余(求余(求余(求余(ModulusModulus)2024/9/257/98Example:12.0%3=?afloatanintegerINVALID!求余(求余(求余(求余(ModulusModulus)2024/9/258/98 Anexpressionmaycontain2ormoreAnexpressionmaycontain2ormorearithmeticoperatorsarithmeticoperators Mainissue:Mainissue:运算顺序运算顺序运算顺序运算顺序ORDEROFPRECEDENCEORDEROFPRECEDENCE 优先级优先级优先级优先级算术表达式算术表达式算术表达式算术表达式(Arithmetic ExpressionArithmetic Expression)2024/9/259/98Examples:5+65+6*22.5+62*212/6.02*2=11=22or17?=?=?=17算术表达式算术表达式算术表达式算术表达式(Arithmetic ExpressionArithmetic Expression)WaitaminuteWaitaminute2024/9/260/98 优先级(优先级(优先级(优先级(OrderofPrecedenceOrderofPrecedence) High:High:* / %* / %Low:Low:+ -+ -Alloperatorshaveaprecedencelevel.Alloperatorshaveaprecedencelevel.不同不同不同不同优先级时的运算顺序:优先级时的运算顺序:优先级时的运算顺序:优先级时的运算顺序:HighprecedenceleveloperatorsareevaluatedbeforelowerHighprecedenceleveloperatorsareevaluatedbeforelowerones.ones.相同相同相同相同优先级时的运算顺序:优先级时的运算顺序:优先级时的运算顺序:优先级时的运算顺序:OperatorsofthesameprecedencelevelareevaluatedfromOperatorsofthesameprecedencelevelareevaluatedfromlefttorightlefttoright(左结合)(左结合)(左结合)(左结合)算术表达式算术表达式算术表达式算术表达式(Arithmetic ExpressionArithmetic Expression)2024/9/261/98Example:?48.52.5+6 44.52.5+62*2=算术表达式算术表达式算术表达式算术表达式(Arithmetic ExpressionArithmetic Expression)4.52024/9/262/98 巧妙使用巧妙使用巧妙使用巧妙使用圆括号圆括号圆括号圆括号改变运算顺序改变运算顺序改变运算顺序改变运算顺序 AllexpressionsinparenthesesmustbeevaluatedAllexpressionsinparenthesesmustbeevaluatedpriortovaluesoutsidebracketspriortovaluesoutsidebrackets NestedparenthesizedexpressionsmustbeNestedparenthesizedexpressionsmustbeevaluatedfromtheinsideout,withtheinnermostevaluatedfromtheinsideout,withtheinnermostexpressionevaluatedfirstexpressionevaluatedfirstExample:(9(3+2)*3=?算术表达式算术表达式算术表达式算术表达式(Arithmetic ExpressionArithmetic Expression)2024/9/263/98赋值语句赋值语句赋值语句赋值语句(Assignment StatementAssignment Statement) Thereare3typesofassignment:Thereare3typesofassignment: SimpleSimple简单赋值简单赋值简单赋值简单赋值 MultipleMultiple多重赋值多重赋值多重赋值多重赋值 ShorthandShorthand简写的复合赋值简写的复合赋值简写的复合赋值简写的复合赋值2024/9/264/98简单赋值简单赋值简单赋值简单赋值Simple AssignmentSimple AssignmentSyntax: 变量变量=表达式表达式;Dontforgetthesemicolon!Dontforgetthesemicolon!EveryEveryassignmentexpressionassignmentexpressionhasavaluehasavalue2024/9/265/98#include main( ) float price, discount, total; printf(“Buying price : “); scanf(“%f”, &price); printf(“nDiscount rate : “); scanf(“%f”, &discount); total = price * discount; printf(“The total price is %.2fn”, total);Buyingprice:_discount?price?total?Buyingprice:10.00_10.00Buyingprice:10.00Discountrate:_Buyingprice:10.00Discountrate:0.25_0.252.50Buyingprice:10.00Discountrate:0.25_Buyingprice:10.00Discountrate:0.25Thetotalpriceis2.50_Example:简单赋值简单赋值简单赋值简单赋值Simple AssignmentSimple Assignment2024/9/266/98Syntax:变量变量1=变量变量2=表达式表达式;多重赋值多重赋值多重赋值多重赋值Multiple AssignmentMultiple AssignmentDontforgetthesemicolon!Dontforgetthesemicolon!2024/9/267/98Example:int number, total;float start_x, start_y;. . . number = total = 0;start_x = start_y = 100.0;total?number?start_x?start_y?00100.0100.0多重赋值多重赋值多重赋值多重赋值Multiple AssignmentMultiple Assignment从右向左赋值从右向左赋值从右向左赋值从右向左赋值2024/9/268/98Syntax:Syntax: 变量变量x = 变量变量x 运算符运算符op 表达式表达式 ;变量变量x 运算符运算符op = 表达式表达式; 简写的复合赋值简写的复合赋值简写的复合赋值简写的复合赋值Shorthand AssignmentShorthand Assignment这种形式看起来更直观,且执行效率一般也更高一些这种形式看起来更直观,且执行效率一般也更高一些这种形式看起来更直观,且执行效率一般也更高一些这种形式看起来更直观,且执行效率一般也更高一些2024/9/269/98WhenevertheexpressionontherightcontainstheWhenevertheexpressionontherightcontainsthevariableontheleft(towhichthevalueisassigned)variableontheleft(towhichthevalueisassigned)Example:num=num+5;num1515+52020简写的复合赋值简写的复合赋值简写的复合赋值简写的复合赋值Shorthand AssignmentShorthand Assignment2024/9/270/98ExpressionscanalsobestatedusingshorthandExpressionscanalsobestatedusingshorthandassignmentoperatorsassignmentoperatorsExample:num+=5;similartonum=num+5shorthandassignmentoperatorshorthandassignmentoperator简写的复合赋值简写的复合赋值简写的复合赋值简写的复合赋值Shorthand AssignmentShorthand Assignment2024/9/271/98已知已知已知已知 intint a = 3; a = 3;执行执行执行执行 a += a -= a *= a a += a -= a *= a 后,变量后,变量后,变量后,变量a a的值?的值?的值?的值? a += a -= a *= a a += a -= a *= a a += a -= 9 a += a -= 9 a += 0 a += 0 a = 0a = 0简写的复合赋值简写的复合赋值简写的复合赋值简写的复合赋值Shorthand AssignmentShorthand Assignment3 3 9 9 0 0 0 02024/9/272/98OperationExamplesofexpressionDescription+=num += 5;num = num + 5;-=num -= 5;num = num 5;*=num *= 5;num = num * 5;/=num /= 5;num = num / 5;%=num %= 5;num = num % 5;简写的复合赋值简写的复合赋值简写的复合赋值简写的复合赋值Shorthand AssignmentShorthand Assignment2024/9/273/98自动类型转换自动类型转换自动类型转换自动类型转换 相同类型数据的运算结果,还是该类型相同类型数据的运算结果,还是该类型相同类型数据的运算结果,还是该类型相同类型数据的运算结果,还是该类型 不同类型数据的运算结果,是两种类型中取值范围大的那种不同类型数据的运算结果,是两种类型中取值范围大的那种不同类型数据的运算结果,是两种类型中取值范围大的那种不同类型数据的运算结果,是两种类型中取值范围大的那种longlong doubledouble doubledouble floatfloat longlong intint shortshort charchardoublefloatlongunsignedintchar,short低高2024/9/274/98自动类型转换自动类型转换自动类型转换自动类型转换 取值范围取值范围取值范围取值范围小小小小的类型的类型的类型的类型赋值给赋值给赋值给赋值给取值范围取值范围取值范围取值范围大大大大的类型是的类型是的类型是的类型是安全安全安全安全的的的的 反之是不安全的反之是不安全的反之是不安全的反之是不安全的若若若若大大大大类型的值在类型的值在类型的值在类型的值在小小小小类型能容纳的范围之内,则平安无事类型能容纳的范围之内,则平安无事类型能容纳的范围之内,则平安无事类型能容纳的范围之内,则平安无事但是,但是,但是,但是,浮点数转为整数浮点数转为整数浮点数转为整数浮点数转为整数,会丢失小数部分,非四舍五入,会丢失小数部分,非四舍五入,会丢失小数部分,非四舍五入,会丢失小数部分,非四舍五入反之,转换后的结果必然是错误的,具体结果与机器和反之,转换后的结果必然是错误的,具体结果与机器和反之,转换后的结果必然是错误的,具体结果与机器和反之,转换后的结果必然是错误的,具体结果与机器和实现方式有关实现方式有关实现方式有关实现方式有关避免如此使用,好的编译器会发出警告避免如此使用,好的编译器会发出警告避免如此使用,好的编译器会发出警告避免如此使用,好的编译器会发出警告2024/9/275/98Example:int x = 10;float y;y = (float)x; (float)10(float)10 10.00000010.000000x10y?10.000000类型强转(类型强转(类型强转(类型强转(CastingCasting) 消除从大到小的警告消除从大到小的警告消除从大到小的警告消除从大到小的警告x = (x = (intint)y)y; ; 通过下面方式把表达式的值转为任意类型通过下面方式把表达式的值转为任意类型通过下面方式把表达式的值转为任意类型通过下面方式把表达式的值转为任意类型( (类型类型类型类型) )表达式表达式表达式表达式不改变不改变不改变不改变x x2024/9/276/98Example:int total, number;float average;average = total / number; 15/215/2 7 7total15number2average?7.000000类型强转(类型强转(类型强转(类型强转(CastingCasting) 两个整数运算的结果两个整数运算的结果还是整数,不是浮点数还是整数,不是浮点数2024/9/277/98Example:int total, number;float average;average = (float)total / number; 15.000000/215.000000/2 7.5000007.500000total15number2average?7.500000类型强转(类型强转(类型强转(类型强转(CastingCasting) 2024/9/278/98关系运算符关系运算符关系运算符关系运算符( Relational OperatorsRelational Operators )OperationDescriptionExamplesofExpressionValueLessthan691(true)=Lessthanorequalto5Greaterthan260(false)=Greaterthanorequalto9=51(true)=Equalto7=50(false)!=Notequalto6!=51(true)2024/9/279/98 优先级优先级优先级优先级 算术运算符算术运算符算术运算符算术运算符 = =!=!= 赋值运算符赋值运算符赋值运算符赋值运算符 左结合左结合左结合左结合a b = cd = a bch a + 1 d = a + b c3 = x b)= cd = (a b)ch (a + 1)d = (a + b) c)(3 = x) a)a2b5c15d17 !(1)!(1) !(152)!(152) 0 02024/9/283/98Example:(a=1)&(b=5) (2=1)&(b=5)(2=1)&(b=5) 1&(b=5)1&(b=5) 1&(5=5)1&(5=5) 1&11&1 1 1a2b5c15d17复合表达式复合表达式复合表达式复合表达式(Compound ExpressionCompound Expression)2024/9/284/98Example:(c=(b*3)|(a=3) (c=(5*3)|(a=3)(c=(5*3)|(a=3) 1|(a=3)1|(a=3) 1|(2=3)1|(2=3) 1|01|0 (15=15)|(a=3)(15=15)|(a=3) 1 1a2b5c15d17复合表达式复合表达式复合表达式复合表达式(Compound ExpressionCompound Expression)2024/9/285/98Example:!(ad) !(2d)!(2d) !(1|(1517)!(1|(1517) !(1|0)!(1|0) !1!1 !(1|(cd)!(1|(cd) 0 0a2b5c15d17复合表达式复合表达式复合表达式复合表达式(Compound ExpressionCompound Expression)2024/9/286/98 实例实例实例实例 chch是英文大写字母是英文大写字母是英文大写字母是英文大写字母 (ch = A) & (ch = A) & (ch .( ) - . ! + - + - * & (! + - + - * & (类型类型类型类型) ) sizeofsizeof * / %* / % + -+ - = = = != != & & | | & | ? :? : = += -= *= /= %= &= = |= = += -= *= /= %= &= = |= = , , 能背下优先级表的人凤毛麟角能背下优先级表的人凤毛麟角能背下优先级表的人凤毛麟角能背下优先级表的人凤毛麟角 用括号来控制运算顺序,更直观、用括号来控制运算顺序,更直观、用括号来控制运算顺序,更直观、用括号来控制运算顺序,更直观、方便,并减少出错的概率方便,并减少出错的概率方便,并减少出错的概率方便,并减少出错的概率 多数为左结合,少数为右结合:多数为左结合,少数为右结合:多数为左结合,少数为右结合:多数为左结合,少数为右结合: 一元运算符一元运算符一元运算符一元运算符 赋值运算符赋值运算符赋值运算符赋值运算符 条件运算符(本书没有介绍)条件运算符(本书没有介绍)条件运算符(本书没有介绍)条件运算符(本书没有介绍)2024/9/293/98本章知识点本章知识点本章知识点本章知识点 标识符的命名规则标识符的命名规则标识符的命名规则标识符的命名规则 数据类型数据类型数据类型数据类型 变量(声明、赋值、初始化)变量(声明、赋值、初始化)变量(声明、赋值、初始化)变量(声明、赋值、初始化) 常量常量常量常量 运算符及其优先级和结合性运算符及其优先级和结合性运算符及其优先级和结合性运算符及其优先级和结合性 算术算术算术算术 赋值赋值赋值赋值 类型强转类型强转类型强转类型强转 关系关系关系关系 逻辑逻辑逻辑逻辑 增一增一增一增一/ /减一减一减一减一 位运算位运算位运算位运算 sizeofsizeof2024/9/294/98作业作业作业作业2024/9/295/982024/9/296/98位操作运算符位操作运算符位操作运算符位操作运算符 & &按位与运算按位与运算按位与运算按位与运算 | |按位或运算按位或运算按位或运算按位或运算 按位异或运算按位异或运算按位异或运算按位异或运算 按位右移运算按位右移运算按位右移运算按位右移运算 按位求反按位求反按位求反按位求反2024/9/297/98位操作运算符位操作运算符位操作运算符位操作运算符 P66P66,3.4(2)3.4(2)逻辑运算与位运算的不同逻辑运算与位运算的不同逻辑运算与位运算的不同逻辑运算与位运算的不同main()main() intint x=12, y=8; x=12, y=8; printf(n%5d%5d%5d, !x, printf(n%5d%5d%5d, !x, x|yx|y, , x&yx&y);); printf(n%5 printf(n%5u u%5d%5d, x, %5d%5d, x, x|yx|y, , x&yx&y);); printf(n%5 printf(n%5d d%5d%5dn, x, %5d%5dn, x, x|yx|y, , x&yx&y);); 0 1 1 65523 12 8 -13 12 8逻辑非的结果逻辑非的结果不是按位取反不是按位取反0000000000000000 0000000011001100x x1111111111111111 1111111100110011xx10000000100000000000000011001100xx的反码的反码的反码的反码xx的反码加的反码加的反码加的反码加1 1100000001000000000000000110111010000000000000000 0000000011001100x x0000000000000000 0000000010001000y y0000000000000000 0000000011001100x|yx|y0000000000000000 0000000010001000x&yx&y正数的补码正数的补码与其原码相同,与其原码相同,负数的补码为负数的补码为其反码加其反码加1
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号