欢迎来到三一文库! | 帮助中心 三一文库31doc.com 一个上传文档投稿赚钱的网站
三一文库
全部分类
  • 研究报告>
  • 工作总结>
  • 合同范本>
  • 心得体会>
  • 工作报告>
  • 党团相关>
  • 幼儿/小学教育>
  • 高等教育>
  • 经济/贸易/财会>
  • 建筑/环境>
  • 金融/证券>
  • 医学/心理学>
  • ImageVerifierCode 换一换
    首页 三一文库 > 资源分类 > PPT文档下载
     

    第1章c的初步知识与数据类型.ppt

    • 资源ID:2548037       资源大小:559.51KB        全文页数:104页
    • 资源格式: PPT        下载积分:10
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录   微博登录  
    二维码
    微信扫一扫登录
    下载资源需要10
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第1章c的初步知识与数据类型.ppt

    第1章 C+的基础知识,程序设计语言是人类在计算机上解决实际问题的一种工具。当一个求解问题能够用数学模型表达时,人们会考虑用某种程序设计语言将该问题的数学模型表示成计算机可以接受的程序形式,再由计算机自动处理这个程序,生成人们所需要的结果。,1.1 程序设计语言的基本概念,1. 面向过程的结构化程序设计语言 2. 面向对象的程序设计语言有两类:一类是完全面向对象的语言,另一类是兼顾面向过程和面向对象的混合式语言。C+语言就是后一种形式的典型代表。,1.2 C+程序的基本结构,1.2.1 C+程序结构 一般来说,C+程序的结构包含声明区、函数区两个部分,在任何一个区内都可以随时插入程序的注释。,【例1.1】从键盘输入圆的半径,求圆的面积。 程序代码如下: /*ex1_1.cpp* #include #define PI 3.14159 float sum(float x); void main() float r,s; coutr; s=sum(r); cout“r=“r“ “s=“ “sendl; float sum(float x) return PI*x*x; ,1声明区 声明区在函数之外。程序的声明区可能需要编写: (1)包含文件,如例1.1中的#include ; (2)宏定义,如例1.1中的#define PI 3.14159; (3)函数声明,如例1.1中的float sum(float x); (4)条件编译; (5)全局变量声明; (6)结构体等的定义; (7)类的定义。,2函数区 一个程序由一个主函数main()和多个(可以是0个 )其他函数组成。每个函数都是由函数声明部分与函数体部分组成。程序的执行从main()函数开始。函数声明部分包括函数返回值类型、函数名、函数的形式参数。 函数体部分是用一对花括号括起来的完成该函数所表达的功能的语句的集合。语句可以是数据描述语句或数据操作语句。,任何一种程序设计语言可用下面的模型描述:,一种程序设计语言的模型与人类的自然语言模型是一致的,都遵守这种模型。读者可以借鉴人类自然语言的学习方法来学习某种程序设计语言。,1.2.2 C+程序的书写格式 C+程序的书写格式比较灵活,书写程序时可以任意换行,一行内可以书写多条语句,一条语句可以书写在多行上,只要每条语句以分号(;)结束即可。也因为如此,所以C+程序可读性差,为了提高程序的可读性,C+程序的书写格式有如下约定: (1)C+程序中,每行一般书写一条语句;语句较短时,多条语句可书写在一行内。语句较长时,一条语句可写在多行上。,(2)C+程序中,每条语句以分号结束,表示一条语句的结束,但函数说明行和声明区的多数语句后不用分号。语句前面没有标号,只有goto语句的转向目标语句前加标号。 (3)C+程序中,使用向右缩进方法表达程序中的层次结构,如花括号内的函数体、循环语句的循环体、if语句的if体和else体一般都向右缩进几个字符。花括号是函数体或复合语句的定界符。 (4)C+程序中,可使用多行注释或单行注释以增强程序的可读性。多行注释以“/*”开始,以“*/”结束,占据多行。单行注释以“/”开始,占据一行。,1.3 一个应用程序的开发过程,1.3.1 Visual C+ 6.0开发环境 采用Visual C+ 6.0开发环境 ;这是一个集编辑、编译、链接、调试运行于一体的集成环境,即在一个程序的控制下可以分步或一次性地完成编辑、编译、链接、调试运行工作。,1.3.2 一个应用程序的开发过程,1启动Visual C+ 6.0开发环境,2创建工程项目,3打开项目文件,4创建C+源程序文件并添加到项目文件中,5编译、链接与运行程序,在上页图中单击“Compile”按钮进行编译,单击“Build”按钮进行编译与链接(在没有编译的情况下),单击“Execute Program”按钮进行编译、链接和运行(在没有编译、链接的情况下)。,例1.1程序所建立的项目的运行结果如下: Input r:10 r=10 s= 314.159,1.4 C+的词法规则,一个程序包含两个方面的主要内容:数据描述和数据操作。数据是操作的对象,数据的存储方式决定于该数据的数据类型,描述数据就是定义数据的类型。数据类型的定义表现在常量、变量等的定义之中,而常量、变量又是一种程序设计语言的基本单词。除了常量、变量之外,一种程序设计语言还有标识符、运算符、关键字、分隔符等基本单词,这些单词的构成(书写规则)都必须遵守该语言的词法规则。,本节介绍的就是C+中各种单词的构词规则。请读者结合前面的语言模型图学习本节内容并思考本节内容属于语言模型图的哪个环节。 由一种语言提供的字符集中的字符构造的单词必须遵守该语言的词法规则。在一种语言中,单词涉及标识符、关键字、运算符、常量、变量、注释符、分隔符等。C+也不例外。本节只讨论C+中的基本词法规则。,1.4.1 C+的字符集组成,C+的字符集包括如下字符: (1)26个小写字母:az。 (2)26个大写字母:AZ。 (3)10个数字:09。 (4)标点和特殊字符:+ - * / , : ; ? ” | ! # % & ( ) 空格。 (5)空字符:ASCII码为0的字符,用作字符串的结束符。,1.4.2 C+的单词及其构词规则,单词由若干个合法字符组成,下面介绍常用的单词。 1标识符 标识符是由字母、下画线和数字组成的字符序列,第一个字母必须是字母或下画线,不能是数字。标识符中的字母大小写是不同的。标识符用来命名C+程序中的常量、变量、函数、语句标号及类型定义符等。有一部分标识符是系统定义的。本小节关心的是用户定义的标识符。,在定义标识符时,要注意以下几点: (1)要遵守上面的构成标识符的规则。 Aa、ABC、A_Y、ycx11、_name是合法标识符。而5xyz、m.x、!abc、x-y是非法标识符。 (2)系统已经使用的关键字、函数名或其他已定义的单词不能再定义成标识符。 (3)定义标识符时尽可能让标识符有意义,便于阅读,即做到“见名知义”。,2关键字 关键字(又称保留字)是被系统定义了的已具有特定含义的标识符。 3运算符 运算符与操作数连接组成表达式。连接一个操作数的运算符称为单目运算符,连接两个操作数的运算符称为双目运算符,连接三个操作数的运算符称为三目运算符。有关运算符的种类、功能、优先级和结合性等问题将在1.7节中详细介绍。,4常量 常量是在程序中不改变的量。C+程序中的常量有:整型常量、浮点型常量、字符常量和字符串常量4种。将在1.6节中详细介绍。 5变量 变量是在程序中可以改变的量。变量有三要素:名字、类型和值。某个变量的值被改变后,将一直保持到下一次被改变。变量是一种标识符,其命名完全与标识符相同。将在1.6节中详细介绍其特性。,6注释符 注释符的作用是在程序中标识注释信息。在C+程序中,可使用多行注释或单行注释增强程序的可读性。多行注释以“/*”开始,以“*/”结束,占据多行。单行注释以“/”开始,占据一行。“/*”、“*/”、“/”就是注释符。 7分隔符 分隔符有:空格符、换行符、水平制表符等,用作其他单词之间的分隔符;逗号(,),多作多个变量或多个参数之间的分隔符;分号(;),主要用于for语句的for关键字后的圆括号内,作分隔符;冒号(:),用来标识语句标号和开关语句,常用于switch的case关键字后。,1.5 C+基本数据类型,表1-2 C+基本数据类型,数 据 类 型,字节数,数据表达范围,1.6 常量与变量,常量与变量是C+中最基本的数据描述形式。本节只介绍常量和变量的基本概念,包括4种常量和基本数据类型的变量。关于构造类型的变量将在后续章节中介绍。 1.6.1 常量 常量是在程序中不改变的量。C+程序中有4种常量:整型常量、浮点型常量、字符常量和字符串常量。,1整型常量 C+程序中,整型常量和浮点常量统称数值常量。 整型常量有三种形式:十进制、八进制和十六进制。 十进制常量的写法就是算术表达方式,如12、345都是合法的十进制常量。 八进制常量在数值前要加上一个零(0),如011、077都是合法的八进制常量。 十六进制常量的写法是在数值前加上一个零(0)和一个字母X(大小写均可),如0X11、0xF都是合法的十六进制常量,分别等于十进制数17和15。,2浮点型常量 浮点型常量又称实数型常量。分为十进制数形式和指数形式两种表示方法。 (1)十进制数形式的浮点型常量的书写格式: . 其中小数点不能省略。如1.2345、1.0、1.、.12345均是合法的浮点型常量。,(2)指数形式的浮点型常量的书写格式: .E 其中,指数形式表示符“E”大小写均可。 .部分允许不含小数点的,或含小数点的,必须是整数。如12E-3、0.1E2、.12345E6、0E0等均是合法的。,【例1.2】浮点型常量的运用。 程序代码如下: /*ex1_2.cpp* #include #include void main() float a,b,c; a=12.34567; b=.11183155; c=12.e2; cout“a=“setprecision(7)a; cout“ta=“setiosflags(ios:scientific)aendl; cout“b=“b; cout“tc=“cendl; ,程序的运行结果如下: a=12.3457 a=1.234567e+001 b=1.118316-001 c=1.200000e+003,3字符常量 字符常量是一个用单引号括起来的字符。单引号是字符常量的定界符,单引号本身表示成。在C+中,字符常量具有整数值,其值是该字符的ASCII码。一个字符常量可以与整数进行加减运算。下面的程序给出了字符与整数进行加减运算的实例。,【例1.3】字符常量的运用。 程序代码如下: /*ex1_3.cpp* #include #include void main() char a,b,c,d; a='A' b='B' c=a+3; d=''' couta't'b't'cendl; couthexint(a)'t'int(b)'t'int(c)endl; coutdendl; ,程序的运行结果如下: A B D 41 42 44 ',4字符串常量 字符串常量是用双引号括起来的若干个字符组成的字符序列。双引号是字符串常量的定界符,双引号本身表示成“”。“”是一个空字符串,空字符串中没有任何有效字符,只有一个字符串结束符。在C+程序中,任何一个字符串常量都有一个结束符,该结束符是ASCII码值为0的空字符,表示为0。,字符常量与字符串常量是不同的,表现在: (1)表示形式不同。前者用单引号括起来,后者用双引号括起来。 (2)存放它们的对象不同。前者存放在字符变量中,后者存放在字符数组或字符指针指定的位置。如,char c='A', s5=“ABCD“; (3)存放字符串常量时要加一个结束符,而存放字符常量则不需要。所以A与“A”不同。且其占用的内存空间也不同,A占1个字节;“A”占2个字节,前一字节存放字符A,后一字节存放结束符。 (4)对它们进行的运算也不同。字符与字符、字符与整数间可作加减运算;而字符串只能作连接运算。,【例1.4】字符串常量的运用。 程序代码如下: /*ex1_4.cpp* #include void main() char s110,s210; couts1s2; couts1't's2endl; ,程序的运行结果如下: Input 2 Words,Please:Beijing Changsha Beijing Changsha,5符号常量 符号常量是一个用来替代常量(前面讨论的4种常量)的标识符。这个标识符当然叫符号常量。 (1)增强程序的可读性。标识符可以定义得有意义,如用PI表示圆周率。 (2)书写简单,不易出错。有的常量直接书写很长,容易出错,如圆周率3.141 592 6用PI代之,既简单又不容易出错。 (3)修改程序方便。,1.6.2 变量 变量是在程序中可以改变的量,变量有名字、类型和值三个要素。变量的类型包括存储类和数据类型两个方面。某个变量的值被改变后,将一直保持到下一次被改变。 1变量的定义 变量在使用前必须定义。格式如下: ;,例如:int a,b,c; a、b、c为整型变量;缺省存储类,要看是定义在函数体内还是函数体外来确定是自动类还是外部类; static double x,y10; x、y是静态双精度变量,y是数组,2变量的数据类型 变量的基本数据类型有:整型、浮点型和字符型。 变量的构造数据类型称自定义类型。它由若干个数据类型相同或不相同的变量所构成的类型。如数组、结构体、共用体、类都是构造数据类型。 3变量的存储类 变量的存储类定义变量的有效性范围,即作用域。C+中有4类:自动存储类(auto)、寄存器存储类(register)、静态存储类(static)和外部存储类(extern)。,(1)自动存储类 某一变量定义成自动存储类后,其作用域在定义它的函数体或分程序内,自动存储类变量只能定义在函数体或分程序内。变量的生存期在作用域内,即执行完定义它的函数后,该变量即被释放。这类变量的安全性最好,在不同的函数中可以定义相同名字的变量,互不影响。在函数体内定义自动存储类变量时可以省去说明符auto。前面程序中定义的变量都省去了存储类说明符auto,它们都是自动存储类变量。,(2)寄存器存储类 寄存器存储类的变量与自动存储类的变量有相同的作用域和生存期。定义这类变量必须加存储类说明符register,并且只能定义在函数体或分程序内。这类变量有可能被存放在CPU的空闲通用寄存器中,当CPU中没有空闲通用寄存器时,当作自动存储类变量。一旦变量存入CPU的寄存器中,则变量的访问效率将大大提高,这是因为访问内存比访问CPU寄存器花的时间长得多。,(3)静态存储类 静态存储类分为内部静态存储类和外部静态存储类。内部静态存储类变量定义在函数体或分程序内,其作用域在定义它(们)的函数体或分程序内。而外部静态存储类变量定义在函数体或分程序外,其作用域在定义它(们)的文件内,可见两者的作用域是不同的。 内部静态存储类和外部静态存储类变量有相同的生存期,都被存放在内存的静态区域,静态变量在程序结束时才释放内存。 要定义静态存储类变量,必须加存储类说明符static。,(4)外部存储类 外部存储类变量的作用域是整个程序,包含该程序的各个文件。生存期是整个程序,在程序结束时才释放内存。,表1-3 各种存储类特性的比较,存 储 类 别,自动类,寄存器类,内部静态类,外部静态类,静态类,外部类,或分程序内,在定义它的文件内,程序的各个文件,程序结束,前有效,离开定义体,即消失,存取速度快,安全性好,在定义它的函数体,安全性差,同自动类,作 用 域,生 存 期,其 他,外部存储类变量可以定义在函数体内、外,定义在函数体外时可以不加存储类说明符,但在说明一个外部存储类变量时,必须加存储类说明符extern。有如下两种情况要在引用外部存储类变量前,对其进行说明。 在一个文件中,在定义前引用外部存储类变量必须说明。 在多个文件的程序中,在一个文件中定义,在另一个文件中引用,引用前要说明。,【例1.5】定义在前、引用在后的外部存储类变量(输出结果与例1.4类似)。 程序代码如下: /*ex1_5.cpp* #include char s110,s210; void main() couts1s2; couts1't's2endl; ,【例1.6】定义在后、引用在前的外部存储类变量(输出结果与例1.4类似)。 程序代码如下: /*ex1_6.cpp* #include void main() extern char s110,s210;/说明外部存储类变量 couts1s2; couts1't's2endl; char s110,s210;,4变量的值 变量的值是变量三要素之一。可以在定义变量时对变量赋初值(变量初始化),也可以在引用变量时通过其他方法(赋值表达式、cin、scanf函数等)对变量赋值。 变量初始化格式: =,=,;,如果外部类和静态类变量不进行初始化,那么它们由编译程序赋以“零值”(数值型变量赋数值0,字符型变量赋空字符)。如果自动类和寄存器类变量不进行初始化,那么它们不具有有意义的值,必须通过赋值后才能引用。 外部类和静态类变量初始化是在编译时给定的。即在第一次执行定义或说明时给定,以后进入所定义的函数体或分程序不再赋初值。而自动类和寄存器类变量的初始化是在每次进入函数体或分程序时重新定义初值。,可见,变量有定义和引用两个方面。变量的定义涉及变量名称、存储类和数据类型。引用即使用,通常先定义,后使用。例1.6是特例,但在使用前必须说明。引用一个变量,其值是否有意义是一个重要的问题。如在一个函数内定义内部静态存储类的变量,离开这个函数后,虽然变量仍然存在,但它的值可能无效了,所以不能引用。 下面是一些合法的定义: int a=1,b=2,c=3; static char xyz='A',buffer10=“Hello“; double a5=1.12345,2.23456,3.34567,4.45678,5.56789 float s=1+2+3;,关于在引用变量时通过赋值表达式、cin、scanf函数等方式对变量赋值,在前面的实例中已大量使用。值得一提的是赋值表达式,在下面的程序段中: int a; a=12; “a=12”是一个赋值表达式。C+允许表达式当作语句使用,其后要加分号,所以“a=12;”是赋值表达式语句。“a=12”这个表达式有双重意义:表达式“a=12”具有12的值,另外表达式“a=12”的副作用使变量a具有12的值。给变量赋值正是利用了这种副作用。这是C+与其他高级程序设计语言不同的地方,其他语言称“a=12”是赋值语句。,1.7 运算符与表达式,C+的表达式包括算术表达式、关系表达式、逻辑表达式、赋值表达式、条件表达式和逗号表达式。C+的类型转换包含隐含转换和强制转换两种方法。任何表达式后加“;”构成表达式语句。 1.7.1 算术运算符与算术表达式 1算术运算符 算术运算符有: (1)单目运算符:-(取负)、+(增1)、-(减1)。 (2)双目运算符:+(加)、-(减)、*(乘)、/(除)、%(取余)。,单目运算符的优先级高于双目运算符的优先级,双目运算符中的 *、/、% 的优先级高于 +、- 的优先级。 +(增1)运算可写在变量前或变量后,分别称作前缀运算和后缀运算。如果定义一个变量i,前缀运算记为:+i,后缀运算记为:i+。这样形成了前缀运算表达式+i和后缀运算表达式i+,在C+中,两个表达式都对变量i进行增1运算,这是此两类表达式的副作用。但把两个表达式分别赋给变量a和b时,则a和b取不同的结果(见例1.7和例1.8)。,【例1.7】前缀运算表达式的运用。 程序代码如下: /*ex1_7.cpp* #include void main() int i=0; int a; a=+i; cout“a=“a“ i=“iendl; 程序的运行结果如下: a=1 i=1,【例1.8】后缀运算表达式的运用。 程序代码如下: /*ex1_8.cpp* #include void main() int i=0;int b; b=i+; cout“b=“b“ i=“iendl; 程序的运行结果如下: b=0 i=1,取余运算只能用于两个整型数的运算。功能是求两个整型数相除的余数。用下面的公式:余数=被除数-商×除数 注意:5%-3=2,而-5%3=-2。 【例1.9】取余运算。 程序代码如下: /*ex1_9.cpp* #include void main() int a,b; a=5%-3; b=-5%3; cout“a=“a“tb=“bendl; ,程序的运行结果如下: a=2 b=-2,2算术表达式 算术表达式是把常量、变量、函数用算术运算符连接起来的有意义的式子。所谓有意义是指不能被0除等。算术表达式有整型和浮点型两类,由表达式中的常量、变量、函数共同确定。当表达式中这些参数类型不一致时,编译系统会自动转换类型或需要程序编写人员使用强制类型转换手段。,1.7.2 关系运算符与关系表达式 1关系运算符 在C+中,关系运算符有: (大于)=(大于等于)=(等于)!=(不等于) 前4个关系运算符的优先级高于后2个。,关系运算符是双目运算符。一个关系运算符的两边都需要操作数,操作数是算术表达式。 关系运算的结果在C+中是整型值,关系成立时,结果为1,否则为0。在这一点上与其他程序语言不同,其他程序语言的关系表达式值是逻辑值。C+关系表达式的值可以参与整型运算。 关系运算的结合性是从左至右。,2关系表达式 关系表达式是由关系运算符把算术表达式连接起来的式子。它在C+程序中通常用作条件。使用关系表达式应注意两个问题: (1)关系表达式的值为整型数据。 (2)在数学中,y0时,表达式“x+yx”是永真的。但在用计算机语言判断关系表达式“x+yx”时,可能会得出不真的结论。这种情况往往出现在x和y两个数差别很大,一个很大,另一个则小到了语言表达精度以下,以致这个很小的数对相加结果不产生影响。,【例1.10】关系表达式的运用。 程序代码如下: /*ex1_10.cpp* #include #define EPS 1.0E-16 void main() double a,b; int c; a=5.0; b=EPS; c=a+ba; cout“a=“a“tb=“b“tc=“cendl; 程序的运行结果如下: a=5 b=1e-016 c=0,1.7.3 逻辑运算符与逻辑表达式 1逻辑运算符 在C+中,逻辑运算符有以下几种: !:逻辑求反(又称逻辑非,单目运算符) &&:逻辑与(双目运算符) |:逻辑或(双目运算符) 逻辑运算符的优先级从高到低依次是: !、&&、|。 逻辑运算符的结合性是从左至右(单目除外)。,2逻辑表达式 逻辑表达式是由逻辑运算符与操作数组成的式子。 C+规定:逻辑表达式中非0的操作数为真,0操作数为假。这说明C+的逻辑运算符的操作数可以是算术表达式、关系表达式、逻辑表达式。这与其他程序语言不同。 逻辑运算的结果为真时用1表示,为假时用0表示。逻辑运算结果的类型也是整型。,【例1.11】逻辑表达式的运用。 程序代码如下: /*ex1_11.cpp* #include void main() int a,b,c,d,e; a=5;b=0; c=!b; d=a 程序的运行结果如下: a=5 b=0 c=1 d=0 e=1,1.7.4 位运算符与位运算表达式 位运算是二进制运算。C+有两类位运算符:逻辑位运算符和移位运算符。由位运算符与操作数组成的表达式称为位运算表达式。位运算表达式的值是整型。 1逻辑位运算符 逻辑位运算符有: :按位求反(单目运算符) &:按位与(双目运算符) :按位异或(双目运算符) |:按位或(双目运算符),逻辑位运算符的优先级从高到低依次是:、&、|(四级)。 按位求反是指将操作数变成二进制数(操作数所占二进制位数与操作数的类型有关),将该二进制数的每位由1变0,由0变1。如对于下面的32位二进制数整数: 0000 0000 0000 0000 0000 0000 0000 1010 1111 1111 1111 1111 1111 1111 1111 0101,按位与是指将两个操作数均化为二进制数,从低位开始,对应位相与。只有4种情况:1与1取1,1与0取0,0与1取0,0与0取0。例如: 0000 0000 0000 0000 0000 0000 0000 1010 &0000 0000 0000 0000 0000 0000 1111 1101 0000 0000 0000 0000 0000 0000 0000 1000,按位异或是指将两个操作数均化为二进制数,从低位开始,对应位相异或。只有4种情况:1异或1取0,1异或0取1,0异或1取1,0异或0取0。即不考虑进位的加法(对应位相同取0,对应位不同取1)。例如: 0000 0000 0000 0000 0000 0000 0000 1010 0000 0000 0000 0000 0000 0000 1111 1101 0000 0000 0000 0000 0000 0000 1111 0111,按位或是指将两个操作数均化为二进制数,从低位开始,对应位相或。只有4种情况:1或1取1,1或0取1,0或1取1,0或0取0。例如: 0000 0000 0000 0000 0000 0000 0000 1010 | 0000 0000 0000 0000 0000 0000 1111 1101 0000 0000 0000 0000 0000 0000 1111 1111,2移位运算符 移位运算符有: :右移位运算符 或:,右移位操作是将操作数化成二进制数,将操作数右移指定位数,移出的二进制位丢弃,左边补0或符号位(根据编译决定)。 左移位操作是将操作数化成二进制数,将操作数左移指定位数,移出的二进制位丢弃,右边补0。,【例1.12】逻辑位运算和移位运算。 程序代码如下: /*ex1_12.cpp* #include void main() int a,b; a=7;b=2; cout2=“2)2=“2)endl; ,程序的运行结果如下: a=7 a=-8 a&b=2 ab=5 a|b=7 a2=1 a2=3,1.7.5 赋值运算符与赋值表达式 1赋值运算符 赋值运算符有11种,均为双目运算符,优先级仅高于逗号运算符,结合性是从右至左。11种赋值运算符中有1个基本赋值运算符,10个复合赋值运算符,分别为: (1)=:基本赋值运算符 (2)+=:加赋值运算符 (3)-=:减赋值运算符,(4)*=:乘赋值运算符 (5)/=:除赋值运算符 (6)%=:取余赋值运算符 (7)&=:位与赋值运算符 (8)=:位异或赋值运算符 (9)|=:位或赋值运算符 (10)=:位右移赋值运算符,2赋值表达式 赋值表达式是由赋值运算符与操作数组成的式子。对应11种赋值运算符有相应的11种赋值表达式。 先介绍基本赋值表达式,书写为: = 上句在C+中称赋值表达式。在C+中允许表达式构成语句,只要在赋值表达式后面加上“;”,即: =;,赋值表达式执行的结果使赋值表达式本身具有一个值,就是赋值运算符(=)右边表达式的值。还有一个副作用:使赋值运算符(=)左边的变量具有右边表达式的值。前面的所有实例中出现的赋值表达式正是利用这种副作用对变量赋值。可以通过下面的实例理解赋值表达式具有值这一概念。,【例1.13】赋值表达式的值及其副作用。 程序代码如下: /*ex1_13.cpp* #include void main() int a=1; cout“a=“aendl; cout“(a=2)=“(a=2)endl; cout“a=“aendl; 程序的运行结果如下: a=1 (a=2)=2 a=2,其他复合赋值运算符组成复合赋值表达式的形式类似基本赋值表达式,表达形式如下: += 等价于 =+ -= 等价于 =- *= 等价于 =* /= 等价于 =/ %= 等价于 =% &= 等价于 =& = 等价于 = |= 等价于 =| 等价于 = = 等价于 = 复合赋值表达式比基本赋值表达式书写简单、编译时生成的目标代码少,因而运行效率高。,使用赋值表达式应注意以下问题: (1)可以使用赋值表达式连续赋值。例如: int a,b,c; a=b=c=1; 表达式a=b=c=1使3个变量均拥有值1。由于赋值运算符的结合性是从右至左,所以变量c和表达式c=1先拥有值1,然后变量b和表达式b=c=1拥有值1,最后才是变量a和表达式a=b=c=1拥有值1。,(2)使用赋值表达式多用来改变变量的值,赋值表达式本身的值用得少。在赋值表达式中,赋值运算符左边的变量称左值,右边的表达式称右值。计算时,先计算右值,再转换其类型为与左值相同的类型,将右值赋给左值,同时赋值表达式具有右值的值。右值类型转换过程是自动完成的,但转换时有数据精度损失。,1.7.6 三目运算符与三目条件表达式 在C+中只有一个三目运算符?:,三目条件表达式格式如下: ?: 先计算,当非0时,三目条件表达式取的值,否则取的值。三目条件表达式的功能可以解释成一个简单的条件语句(参见第2章)。 三目运算符 ?: 的结合性是从右至左。,【例1.14】三目条件表达式的运用。 程序代码如下: /*ex1_14.cpp* #include void main() int a=1,b=2,c=3; coutb?b-:+a = “b?b-:+a)b?+a:+b = “b?+a:+b)b?a:bc?b:c = “b?a:bc?b:c)endl; ,程序的运行结果如下: ab?b-:+a = 2 c+=ab?+a:+b = 6 ab?a:bc?b:c = 6,程序中有4个cout语句,第1个cout语句输出三目条件表达式的值,显然是1。 在第2个cout语句中,三目条件表达式的值取+a的值,结果是2。因为ab为0,b-并没有执行,故b的值仍然是2。第2个cout语句已修改了变量a的值,使a=2。 在第3个cout语句中,由于三目运算符的优先级高于赋值运算符,所以先计算三目条件表达式ab?+a:+b,由于ab为0,所以三目条件表达式取+b的值,结果是3;再计算赋值表达式c+=3,结果是6。此行cout语句修改了b、c两变量的值,使b=3、c=6。 在第4个cout语句中,由于三目运算符是从右结合的,所以先计算bc?b:c,结果为6;再计算ab?a:6,结果为6。,1.7.7 逗号运算符与逗号表达式 逗号在C+中可以作为分隔符或运算符。 逗号运算符为双目运算符,它的优先级最低,结合性是从左至右。逗号运算符用来连接两个或两个以上的表达式,形成逗号表达式。 计算逗号表达式时,从左至右依次计算各个表达式,逗号表达式的值取最后一个表达式的值。多用在for循环语句的for关键字后的圆括号内,圆括号内由分号分隔的表达式可以是逗号表达式。 注意例1.15中倒数第二行的输出结果。,【例1.15】逗号表达式的运用。 程序代码如下: /*ex1_15.cpp* #include void main() int a=1, b=2, c=3; cout“a=“a“tb=“b“tc=“cendl; c=(a=10, b=a*2, b*2); cout“a=“a“tb=“b“tc=“cendl; cout“a,b,c,c*3= “(a,b,c,c*3)endl; 程序的运行结果如下: a=1 b=2 c=3 a=10 b=20 c=40 a,b,c,c*3 = 120,1.7.8 指针运算 指针运算实际上是地址运算。指针运算有两个运算符: &:取地址运算 *:取内容运算 都是单目运算符,作用于操作数的左边,结合性是从右至左。 运算符 & 后跟变量名或数组元素,后面不能跟常量、表达式或数组名。功能是取变量的地址。&a、&b分别表示取变量a、b的地址值。 运算符 * 后跟一个地址值(包括地址表达式值),表示取一个地址中存放的数据。指针运算将在后续章节中详细介绍。,1.7.9 运算符的优先级和结合性 运算符的优先级和结合性是确定表达式计算顺序的重要依据。表1-4给出了C+中常用运算符的功能、优先级和结合性。 表中绝大部分运算符已作过介绍,其他未作介绍的还有优先级定为0级(最高级)的4个运算符和2个单目运算符(强制类型运算符、sizeof运算符)。下面分别予以介绍。,(1)():圆括号,用于改变优先级,圆括号内的部分首先计算。 (2):数组元素的下标运算符或数组大小定义运算符,其内的部分首先计算。 (3). 和-:用于结构体、共用体变量。 (4)sizeof:计算一数据类型或一表达式占用内存的字节数。例如, sizeof(int) 或 sizeof() (5)强制类型:作用于一表达式,使表达式的类型强制性转换为指定类型。例如, (int)(a+b+1.234567),C+的优先级和结合性比较复杂,通过下面的总结,可以记住: 除最高级和最低级外,其他运算符的优先级是“一二三赋值”。 最高级是圆括号、下标、点、箭头;最低级是逗号。“一二三赋值”分别指单目、双目、三目、赋值运算符,它们的优先级也是按此顺序。这样分出了6大类优先级。在双目运算符中,有10级,顺序是:算术(除求负值运算外分2级)、移位、关系(分2级)、逻辑位(除按位取反运算外分3级)、逻辑(除逻辑非运算外分2级)。 单目、三目、赋值运算符的结合性是从右至左,其他运算符的结合性是从左至右。,【例1.16】运算符的优先级和结合性。 程序代码如下: /*ex1_16.cpp* #include void main() int x,y,z; x=!-5+312; y=x-(-1); cout“x=“x“ty=“yendl; z=xy?x-y?x:y:x*y; cout“sizeof(int)=“sizeof(int)“tsizeof(z)=“sizeof(z)endl; cout“x=“x“ty=“y“tz=“zendl; 程序的运行结果如下: x=6 y=8 sizeof(int)=4 sizeof(z)=4 x=6 y=7 z=6,在例1.16中,语句x=!-5+312;的计算顺序是:第一步先计算单目运算,单目运算有两个: !和-,按从右至左的结合性,先计算-5,再计算 !(-5),结果为0;第二步计算算术运算0+31;第三步计算右移运算,结果为7,即x=7。 语句y=x-(-1);中间有三个-,前两个是减1单目运算,后一个是算术减运算。计算顺序是:第一步计算x-,使x=6,这是减1表达式的副作用,并不计算在y=x-(-1);语句中,所以语句y=x-(-1);变为y=7-(-1),结果使y=8。这时要注意x的值因为副作用发生了变化,即x=6。所以在第一条cout语句输出时x=6、y=8。,语句z=xy?x-y?x:y:x*y;中有单目运算,先计算之,-y的结果表明为7,故语句变成z=xy?x7?x:y:x*y;,语句中有两个三目表达式,三目表达式中的“?”和“:”分别相当于前圆括号“(”和后圆括号“)”,成对出现。按从右至左的结合性,先找最右边的“?”,再找与之最近匹配的“:”,得其表达式为:x7?x:y,结果取x的值6。从而整个语句变成z=xy?6:x*y;,所以z=6。在这条语句中,x的值没改变,y的值变为7,故在第三条cout语句输出时x=6、y

    注意事项

    本文(第1章c的初步知识与数据类型.ppt)为本站会员(本田雅阁)主动上传,三一文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    经营许可证编号:宁ICP备18001539号-1

    三一文库
    收起
    展开