资源预览内容
第1页 / 共30页
第2页 / 共30页
第3页 / 共30页
第4页 / 共30页
第5页 / 共30页
第6页 / 共30页
第7页 / 共30页
第8页 / 共30页
第9页 / 共30页
第10页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
一、基本语言元素一、基本语言元素二、基本数据类型二、基本数据类型三、算术负运算与补码转换三、算术负运算与补码转换1一、基本语言元素一、基本语言元素 1. C/C+中的字符集中的字符集 每一种语言有各自的基本元素。每一种语言有各自的基本元素。 C/C+语言的词法分析建立在对基本元素的扫描、上下语言的词法分析建立在对基本元素的扫描、上下文匹配和排列组合之上。文匹配和排列组合之上。 基本类型是基本类型是C+作为强类型语言处理各种数据的基本尺作为强类型语言处理各种数据的基本尺度。度。 通过基本元素和类型完成文字符号的转换以及源头处的通过基本元素和类型完成文字符号的转换以及源头处的求值计算。求值计算。 关于基本元素的约定就形成词法规定,由此形成定义、关于基本元素的约定就形成词法规定,由此形成定义、声明、表达式、语句和函数进而建立完整的程序。声明、表达式、语句和函数进而建立完整的程序。 2C/C+中的字符集由下列字符构成:中的字符集由下列字符构成: a. 26个大小写英文字母个大小写英文字母: az, AZ b. 10个数字字符个数字字符: 09 c. 标点符号标点符号: 空格空格 ! # % & * ( ) _ - + = : ; , . / ? | C/C+中的标点符号对编译器而言具有词法意义,某些中的标点符号对编译器而言具有词法意义,某些标点符号为标点符号为C/C+的运算符或对预处理器有重要意义。标点的运算符或对预处理器有重要意义。标点符号符号 、( )和和 必须成对出现。必须成对出现。 C/C+中的字符集一共中的字符集一共91个字符,实际上包含可键入的个字符,实际上包含可键入的字母,只有三个例外它们是:字母,只有三个例外它们是: 、$、 。32.2.语言符号语言符号语言符号是语言符号是C/C+语言有意义的最小单元语言有意义的最小单元.a. 空白字符空白字符:空格、水平制表、换行、回车、换空格、水平制表、换行、回车、换 页、页、 纵向制表和换行符都称为空白字符纵向制表和换行符都称为空白字符 b. 标识符标识符 :所有的名称在索引点前必须先有效的说明所有的名称在索引点前必须先有效的说明 c. 关键字关键字 :关键字是系统预定义的保留标识符关键字是系统预定义的保留标识符 d. 标点符号和分隔符标点符号和分隔符; e. 文字常数文字常数; f. 运算符运算符; 4 (1) 空白字符空白字符 空格、水平制表、换行、回车、换页、纵向制表空格、水平制表、换行、回车、换页、纵向制表(vertical tab)和换行和换行(newline)符都称为空白字符符都称为空白字符(white-space),它们具有相同的功能即作为打印页上单词和行之间,它们具有相同的功能即作为打印页上单词和行之间的空白。的空白。 通过空白字符和其它语言符号,例如运算符和标点,从通过空白字符和其它语言符号,例如运算符和标点,从而对语言符号进行定界。而对语言符号进行定界。 对代码进行词法分析时,编译器忽略空白字符,除非它对代码进行词法分析时,编译器忽略空白字符,除非它们作为分隔符或字符串的组成成分。们作为分隔符或字符串的组成成分。 5 (2)标识符标识符 所有的名称在索引点前必须先有效的说明,否则是无效所有的名称在索引点前必须先有效的说明,否则是无效的标识符。的标识符。 标识符是程序员引入的有效的名称,是编译器许可的名标识符是程序员引入的有效的名称,是编译器许可的名称。称。 对象名、变量名或函数名,结构名、类类型名、枚举对象名、变量名或函数名,结构名、类类型名、枚举名、联合名或成员名,名、联合名或成员名,typedef名称、标号名、宏名、宏名称、标号名、宏名、宏形参名、形参名等遵循标识符的命名规定。形参名、形参名等遵循标识符的命名规定。6标识符或名称的命名规定如下:标识符或名称的命名规定如下: a. 标识符的字符序列仅由下划线标识符的字符序列仅由下划线“_”、数字、数字09与与26个个大小写字母大小写字母az,AZ构成。构成。 b. 标识符的首字符必须是大写字母或小写字母或一个标识符的首字符必须是大写字母或小写字母或一个下划线下划线“_”而不能是数字开头。而不能是数字开头。 c. 标识符不能与关键字使用一样的拼写和大小写方式。标识符不能与关键字使用一样的拼写和大小写方式。 d. 标识符对大小写字母敏感,即大写字母或小写字母代标识符对大小写字母敏感,即大写字母或小写字母代表不同的名称。表不同的名称。 例如例如: 和是不同的名称。标识符中含和是不同的名称。标识符中含有关键字是合法的,例如有关键字是合法的,例如pint是一个合法的标识符是一个合法的标识符,尽管它包尽管它包含了关键字含了关键字int。而。而1ab,&x,#ddd,9y不是有效的标识符。不是有效的标识符。7(3)关键字关键字 关键字是系统预定义的保留标识符。关键字是系统预定义的保留标识符。 它们不能再定义用作程序中的标识符。它们不能再定义用作程序中的标识符。 关键字是语言标准的制定者提供给用户使用的举足轻重关键字是语言标准的制定者提供给用户使用的举足轻重的语言单词。的语言单词。 ANSI C89规定规定32个保留字,个保留字,C+在此基础上增添了以在此基础上增添了以斜体表示的斜体表示的28个关键字。个关键字。 8 以下是这些关键字和其主要作用的非严格归类:以下是这些关键字和其主要作用的非严格归类:1.基本类型基本类型 char int float double long short signed unsigned bool 2.自引入类型自引入类型 class enum struct union 3.内存大小和类名声明内存大小和类名声明 sizeof typedef 4.存储属性存储属性 auto register static extern 5.数据冻结和变动数据冻结和变动 const volatile mutable 6.逻辑真假逻辑真假 false true 7.运算符和内存操作运算符和内存操作 operator new delete this9 8.流程语句的控制流程语句的控制 try throw catch if else do while for continue switch case default break goto return 9.成员访问控制成员访问控制 private protected public friend 10.函数修饰词函数修饰词 void inline virtual explicit 11.模板和名称空间模板和名称空间 template typename namespace using 12.类型转换运算类型转换运算 const_cast dynamic_cast reinterpret_cast static_cast typeid10(4) 分隔符分隔符 分隔符是用来分隔单词或程序正文的,它用来表示某分隔符是用来分隔单词或程序正文的,它用来表示某个程序段的结束和另一个程序段的开始,或者增加程序的可个程序段的结束和另一个程序段的开始,或者增加程序的可读性。常用的分隔符如下所述:读性。常用的分隔符如下所述: a.圆括号圆括号() 圆括号用于增加程序的可读性以及提高表达圆括号用于增加程序的可读性以及提高表达式运算的优先级。式运算的优先级。 b.空格符空格符 常用来作为名称和名称或运算符之间的分隔常用来作为名称和名称或运算符之间的分隔符。符。 c.逗号,逗号, 逗号用来作为定义多个变量之间的分隔符;逗号用来作为定义多个变量之间的分隔符;或者用来作为函数的多个参数之间的分隔符。逗号还可以用或者用来作为函数的多个参数之间的分隔符。逗号还可以用作运算符作运算符 。11 d.分号;分号; 用于循环语句中用于循环语句中for关键字后面括号中三个表关键字后面括号中三个表达式的分隔,用于终止分号前的语句。花括号达式的分隔,用于终止分号前的语句。花括号 后的分号表后的分号表示一个声明的结束。示一个声明的结束。 e.冒号:冒号: 用来作语句标号与语句之间的分隔符和用来作语句标号与语句之间的分隔符和switch语句中关键字语句中关键字case与语句序列之间的分隔符。用于与语句序列之间的分隔符。用于表示继承的上下关系、构造函数的冒号语法和访问作用界表示继承的上下关系、构造函数的冒号语法和访问作用界定。定。 f.花括号花括号 用来构造程序,形成程序块的层次体系。用来构造程序,形成程序块的层次体系。 g. 省略号省略号. ,三个圆点构成的省略号用来声明函数的可,三个圆点构成的省略号用来声明函数的可变参数。变参数。12(5)文字常数文字常数 文字常数是在程序中直接使用字符序列表示的数据,文字常数是在程序中直接使用字符序列表示的数据,文字常数亦简称为常数或文字。文字常数亦简称为常数或文字。 文字常数有整型常数、浮点常数、字符常数、字符串常文字常数有整型常数、浮点常数、字符常数、字符串常数。数。 13二、基本数据类型二、基本数据类型 数据状态的数学描述形成数据结构,数据的操作是对数数据状态的数学描述形成数据结构,数据的操作是对数据的状态进行改变,通过特定的操作步骤数据从一种状态变据的状态进行改变,通过特定的操作步骤数据从一种状态变成另一种状态,这些操作步骤就形成一套算法成另一种状态,这些操作步骤就形成一套算法 ,因此程序,因此程序是由数据结构与建立其上的相应算法构成的。是由数据结构与建立其上的相应算法构成的。 不同的数据结构对应不同的算法,这是所有计算机语言不同的数据结构对应不同的算法,这是所有计算机语言共有的特征。本课件用共有的特征。本课件用type或或T,T1,T2,Tn等代表类型名。等代表类型名。 type或或T1,T2可以是可以是char, short, int, long等整型和等整型和float, double, long double浮点型或结构名浮点型或结构名,联合名联合名,枚举名枚举名和类类型名等,它们可先通过和类类型名等,它们可先通过struct, class, enum, union或或Typedef 等声明。等声明。14数据类型数据类型基本数据类型基本数据类型指针类型指针类型 type* (含含void*)引用类型引用类型 type& (无无void数据更无数据更无void&数据数据)枚举类型枚举类型 enum (枚举常数为有限个枚举常数为有限个int型常数型常数)集合数据类型集合数据类型数组类型数组类型 array array 结构类型结构类型 structstruct联合类型联合类型 unionunion类类型类类型 classclass整型整型 int short long int short long 字符型字符型 char(char(属于属于1 1字节的整型字节的整型) ) 单精度浮点型单精度浮点型floatfloat实型实型 双精度浮点型双精度浮点型doubledouble 长长双精度浮点型双精度浮点型 long doublelong double布尔逻辑型布尔逻辑型 boolbool15 类型名型名type 说明明长度度 数据范数据范围 bool布布尔尔逻辑型型 1 true (1) false(0) char字符型字符型 l -128127 (0255) unsigned char无符号字符型无符号字符型 1 0255 signed char有符号字符型有符号字符型 1 -128127signed short int有符号短整型有符号短整型2-3276832767unsigned short int无符号短整型无符号短整型2-3276832767signed int有符号整型有符号整型2/4-3276832767 unsigned int无符号整型无符号整型 2 /4 065535 signed long int有符号有符号长整型整型 4 -21474836482147483647 unsigned long int无符号无符号长型型型型 4 04294967295 float浮点型浮点型 4 3.4*10e-383.4*10e38 double双精度型双精度型 8 1.7*10e-3081.7*10e308long double长双精度型双精度型8/ 10至少与至少与double类型同型同16 描述数据的状态首先要获得数据的类型,通过引入变量描述数据的状态首先要获得数据的类型,通过引入变量的概念来确定数据的状态。的概念来确定数据的状态。 变量是存储信息的单元,它对应于某个内存空间。变变量是存储信息的单元,它对应于某个内存空间。变量名代表其存储空间,程序能在变量中存储值和取出值。在量名代表其存储空间,程序能在变量中存储值和取出值。在定义变量时,说明的变量名称和数据类型定义变量时,说明的变量名称和数据类型(如如int)告诉编译器告诉编译器要为变量分配多少内存空间,以及变量中要存储什么类型的要为变量分配多少内存空间,以及变量中要存储什么类型的值。内存单元的单位是字节。值。内存单元的单位是字节。 C+是一门强数据类型的语言,每一种数据一般都严格是一门强数据类型的语言,每一种数据一般都严格地对应确定的数据类型。地对应确定的数据类型。C/C+的数据类型有基本数据类型的数据类型有基本数据类型和非基本数据类型之分。基本数据类型是和非基本数据类型之分。基本数据类型是C/C+内部预先定内部预先定义的数据类型,非基本数据类型包括指针、数组和结构以及义的数据类型,非基本数据类型包括指针、数组和结构以及类类型等,非基本数据类型也称用户引入的数据类型。类类型等,非基本数据类型也称用户引入的数据类型。 17 基本数据类型有:基本数据类型有: char (字符型字符型)、int (整型整型)、float (单精度浮点型单精度浮点型)和和double (双精度浮点型双精度浮点型)。在。在ANSI C+中,还有中,还有bool(布尔布尔型型)bool类型的变量其结果值用真类型的变量其结果值用真true假假false表示,表示,true就是就是1,false就是就是0。 关键字关键字char、int 、float、double和和bool等为基本数据等为基本数据类型的类名。类名不占内存空间。关键字类型的类名。类名不占内存空间。关键字 void具有特殊的具有特殊的含义,因为没有含义,因为没有void型的数据,只有型的数据,只有void*型的指针。型的指针。 除上述基本数据类型外,还有一些类型修饰符,它用除上述基本数据类型外,还有一些类型修饰符,它用来改变基本类型的意义。来改变基本类型的意义。 修饰符有修饰符有1ong(长型符长型符)、short(短型符短型符)、signed(有符有符号号)和和unsigned(无符号无符号)。 18 short只修饰只修饰int,short int可省略为可省略为 short, long修饰修饰int和和double, 1ong int可省略为可省略为1ong,一般表示,一般表示4个字节,个字节,修饰修饰long double时,一般表示时,一般表示8或或10个字节。个字节。 unsined和和signed能修饰能修饰char, short, int和和long。数据。数据类型确定了数据所占内存空间大小,也确定了数据的范围。类型确定了数据所占内存空间大小,也确定了数据的范围。 数据类型的数域范围记录在头文件数据类型的数域范围记录在头文件limits. h和和float. H中。中。int类型必然不小于类型必然不小于short类型,不大于类型,不大于long类型,在类型,在16位系统里是位系统里是2个字节长,个字节长,32位系统里为位系统里为4个字节长。个字节长。 整数类型包括整数类型包括char, short, long, signed, unsigned等。等。 枚举常数和当作右值使用的枚举变量可视为枚举常数和当作右值使用的枚举变量可视为int类型看类型看待。待。19 float类型是类型是4字节的浮点数。字节的浮点数。 double是是8字节的浮点数,也是字节的浮点数,也是32位浮点数学协处理器位浮点数学协处理器进行表达式运算的标准类型,进行表达式运算的标准类型,double类型是浮点数的缺省类类型是浮点数的缺省类型,型,float类型的数据一般会转换到类型的数据一般会转换到double类型的数据进行类型的数据进行运算。运算。 浮点类型包括浮点类型包括float, double和和long double类型。类型。 long doulbe 类型表示浮点处理器的幕后精度和数据范类型表示浮点处理器的幕后精度和数据范围的扩充优化处理,当程序员感到围的扩充优化处理,当程序员感到64位位double内存不足以内存不足以处理符点数的运算时,就设置处理符点数的运算时,就设置long double 变量。以便编译变量。以便编译器启动器启动80位的内部临时运算寄存单元。位的内部临时运算寄存单元。20 微软编译器的微软编译器的long double变量只占变量只占8字节的内存,但字节的内存,但long double和和double是不同的数据类型。是不同的数据类型。 字符型整型浮点型统称为算术类型。字符型整型浮点型统称为算术类型。 这样数据的状态通过变量来索引,变量由这里介绍的类这样数据的状态通过变量来索引,变量由这里介绍的类型名引入,通过定义语句分配内存。型名引入,通过定义语句分配内存。例如:例如: double d; short s; long n; 变量变量d具有类型属性具有类型属性double,其数据占有,其数据占有8字节的内字节的内存。存。 short型变量型变量s具有具有2字节内存字节内存, long型变量型变量n具有具有4字节字节内存。内存。21三、算术负运算与补码转换三、算术负运算与补码转换 一个十进制数可以用字符串抽象的表示为:一个十进制数可以用字符串抽象的表示为:具体展开为:具体展开为: 字符串中的字符就限制在字符串中的字符就限制在0,1,2,3,4,5,6,7,8,9十个字符数十个字符数码中取值。十进制数的基数为码中取值。十进制数的基数为10。遵循逢十进一的运算规。遵循逢十进一的运算规则。则。10k 称为第称为第k+1位数字的权。位数字的权。 22例如例如: , 是第是第3位数的权位数的权,其结果是三位数其结果是三位数的值。一般地基数为的值。一般地基数为r的的r进制数的值可以表示为进制数的值可以表示为: 其含义就是:其含义就是: 其中可以是其中可以是0,1,2,.,r-1中的数码中的数码, rk称为第称为第k+1位数字的位数字的权即以权即以r为底的为底的k次幂,遵循逢次幂,遵循逢r进位的原则。进位的原则。 这样从上面一般的公式得到二进制数的值为这样从上面一般的公式得到二进制数的值为: 整型数分有符号和无符号两种。无符号整数的最高的位整型数分有符号和无符号两种。无符号整数的最高的位数为该数的有机组成部分。数为该数的有机组成部分。 有符号整数其最高的位用于识别数的正负,最高为有符号整数其最高的位用于识别数的正负,最高为0表表示一个正数,示一个正数,1则表示负数。则表示负数。 23 例如例如:8位长的二进制数位长的二进制数 b=+1d,01111111b=+127d, 00000000b=-127d 正数不做补码原码转换,即正数的原码、补码相同。正数不做补码原码转换,即正数的原码、补码相同。例如例如: 对于二进制数可以理解为无符号数的对于二进制数可以理解为无符号数的255,也也可以理解为原码可以理解为原码-127,同时可以视为同时可以视为-1的补码。的补码。 求补的含义分为两种求补的含义分为两种:一种是直接求补,另一种是间接求一种是直接求补,另一种是间接求补。补。 直接求补是直接求补是C/C+语言的单目算术负运算,其含义为对语言的单目算术负运算,其含义为对于一个数取补就是对单目操作数按位求反最低位加于一个数取补就是对单目操作数按位求反最低位加1,按位,按位求反操作就是求反操作就是1切换为切换为0,0切换为切换为1。算术负运算的源操作数。算术负运算的源操作数无论数的正负。无论数的正负。24例如:例如: 2进制数进制数 16进制数进制数 2进制数进制数 16进制数进制数原操作数:原操作数: 11000011 c3 00111101 3d按位取反按位取反 00111100 3c 11000010 c2最低位加最低位加1 00111101 3d 11000011 c3 十六进制数十六进制数 3d直接求补的结果为直接求补的结果为 c3。十六进制数。十六进制数 c3直接求补的结果为直接求补的结果为 3d。 例如语句:例如语句: printf (0x%x,0x%xn,-0x10234567,-0xefdcba99); 输出结果:输出结果:0xefdcba99,0x10234567从上可以看出直接求补偶次得到原来的操作数。从上可以看出直接求补偶次得到原来的操作数。25 间接求补运算仅对最高位为间接求补运算仅对最高位为1的有符号数进行。当内存的有符号数进行。当内存数据最高位为数据最高位为1时,如果需要执行有符号数的转换,以便得时,如果需要执行有符号数的转换,以便得到这个数的原码,到这个数的原码, 间接求补运算发生作用。间接求补运算发生作用。 间接求补的运算规则可根据下面二个步骤进行:间接求补的运算规则可根据下面二个步骤进行:1. 将最高位的将最高位的1变为变为0,这就是取负数的绝对值。,这就是取负数的绝对值。 2. 对负数的绝对值执行直接求补运算。对负数的绝对值执行直接求补运算。例如对于最高位为例如对于最高位为1的的16进制数进制数ae,d2的二次求补为:的二次求补为: 16进制数进制数 2进制数进制数 16进制数进制数 2进制数进制数数据的原值数据的原值 ae 10101110 d2 11010010最高位清最高位清0 2e 00101110 52 01010010按位取反按位取反 d1 11010001 ad 10101101最低位加最低位加1 d2 11010010 ae 1010111026 下面两个步骤也可以得到最高位为下面两个步骤也可以得到最高位为1的数的数(视为负数视为负数)的原码的原码: 1. 对负数进行直接求补运算。由此得到负数原码的绝对值对负数进行直接求补运算。由此得到负数原码的绝对值 2. 将最高位设置为将最高位设置为1。这也就是在负数的绝对值之前加上。这也就是在负数的绝对值之前加上 负号负号 例如对于最高位为例如对于最高位为1的的16进制数进制数 (视为负数视为负数) ae,d2的间接的间接求补可以运算为:求补可以运算为: 16进制数进制数 2进制数进制数 16进制数进制数 2进制数进制数 数据原值数据原值 ae 10101110 d2 11010010 按位取反按位取反 51 01010001 2d 00101101 最低位加最低位加1 52 01010010 2e 00101110 最高位置最高位置1 d2 11010010 ae 1010111027 16进制数进制数d2间接求补的结果间接求补的结果ae,16进制数进制数ae间接求补为间接求补为d2。 16进制数负数进制数负数ae的原码为的原码为d2, d2的绝对值为即的绝对值为即0x52。也就是说对于内存的原始十六进制数据。也就是说对于内存的原始十六进制数据ae,当作有,当作有符号字符数输出时符号字符数输出时d2是这个数的原码,最高位当作符号位处是这个数的原码,最高位当作符号位处理。理。例如例如: printf (0x%hx,%d,%dn,0xae,(signed char)0xae,0x52);输出:输出: 0xae,-82,82 有符号的整型负数在指定的格式转换中进行负数的补码原有符号的整型负数在指定的格式转换中进行负数的补码原码转换。负数间接求补是负数,对一负数间接求补运算偶次码转换。负数间接求补是负数,对一负数间接求补运算偶次得到原来的操作数。得到原来的操作数。28 负数的原码间接求补得到补码,补码负数的原码间接求补得到补码,补码 间接求补得到负数间接求补得到负数的原码。的原码。 正数正数n的算术负运算或直接求补的结果就是负数的算术负运算或直接求补的结果就是负数-n的补的补码。码。例如例如: 1是正数,是正数,-1作为作为4字节立即数存放的形式就是对正字节立即数存放的形式就是对正1算术算术负运算作用的结果负运算作用的结果0xffffffff,0xffffffff就是就是-1的原始形态,的原始形态,恰好是恰好是-1的补码。对的补码。对0xffffffff间接求补得到间接求补得到0x80000001,这,这是是-1的原码。的原码。 对对-1的原码的间接求补得到的原码的间接求补得到-1的补码。的补码。 补码既可以当作是正数的算术负运算的结果,亦可视为补码既可以当作是正数的算术负运算的结果,亦可视为是负数原码的间接求补。是负数原码的间接求补。29请打开打开“第第2章章(2).ppt”30
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号