




已阅读5页,还剩65页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第1章C语言程序设计的概念 2 1 1程序与程序设计语言 1 1 1计算机与程序应用较早并一直流传至今的计算机工具是算盘 现代电子计算机与算盘的最大区别在哪里呢 关键在于现代计算机可以自动完成计算过程 而算盘进行的计算过程是在人的拨动下才能进行 图1 1算盘 3 程序 按照一定的顺序安排的工作步骤 一种工具能够自动工作 一是要有记忆功能 能够记住程序 二是具有按照程序控制相关部件操作的能力 这样的机制并没有在算盘中实现 但是 却有另外一种机器却在这方面向前推进了一步 这就是明朝末年宋应星在其 天工开物 中记载的中国古代提花机 提花机大约出现于西汉末年 公元前 它采用用丝线结成的 花本 花版 控制经线起落 以织成要求的图样 这是最早的程序控制思想 图1 2提花机 4 1805年法国人JosephJacquard制造成功用穿孔卡片 见图1 3 控制连杆 横针 用有孔和无孔进一步控制经线起落的提花机 穿孔卡片把程序控制技术向前推进了一步 这一技术被一位英国数学家CharlesBabbage 见图1 4 引入到了计算机中机 用有孔和无孔的组合来表示数据和程序 图1 3穿孔卡片 图1 4英国数学家CharlesBabbage 5 1812年Babbage开始计算机的研制工作 他要把函数表的复杂算式转化为差分运算 用简单的加法代替平方运算 快速编制不同函数的数学用表 并将这种机器称为 差分机 于1822年完成了第一台差分机 可以处理3个不同的5位数 计算精度达到6位小数 1833年他又开始投身于一种 会分析的机器 分析机的研制中 他把机器设计成三个部分 一是用来储存数据信息的 仓库 二是进行数据运算处理的 工场 三是使用穿孔卡片来输入程序并用穿孔卡片输出数据 这台机器虽然没有制造成功 但它的工作原理 程序存储控制为今天的计算机奠定了基础 1 任何工具的工作 都是由程序控制的 2 只有工具具有了记忆程序的功能 并具有了按照程序进行自我控制的功能 该工具才能自动工作 6 1 1 2计算机程序设计语言程序要需要用某种形式 语言 来描述 例如 用算盘进行计算 程序是用口诀描述的 珠算的语言是口诀 现代计算机的程序则是用计算机程序设计语言来描述的 1 机器语言一种CPU的指令系统 也称该CPU的机器语言 它是该CPU可以识别的一组由0和1序列构成的指令码 如 10000000 进行一次加法运算 10010000 进行一次减法运算 这种程序虽然可以被机器直接理解和执行 却由于它们不直观 难记 难认 难理解 不易查错 只能被少数专业人员掌握 同时编写程序的效率很低 质量难以保证 这种方式仅使用于计算机出现的初期 7 2 汇编语言20世纪50年代中期人们开始用一些 助记符号 来代替0 1码编程 如前面的两条机器指令可以写为 A B A或ADDA BA B A或A或SUBA B这种用助记符号描述的指令系统 称为符号语言或汇编语言 汇编语言指令是机器不能直接识别 理解和执行的 用它编写的程序经检查无误后 要先翻译成机器语言程序才能被机器理解 执行 这个翻译转换过程称为 代真 代真后得到的机器语言程序称为目标程序 objectprogram 代真以前的程序 称为源程序 sourceprogram 汇编语言与机器语言 都依CPU的不同而异 统称为面向机器的语言 低级语言 优点 可以编出效率极高的程序 缺点 程序员要熟悉机器的内部结构 劳动强度很大 给计算机的普及推广造成很大的障碍 8 2 高级语言汇编语言和机器语言是面向机器的 不同类型的计算机所用的汇编语言和机器语言是不同的 1954年出现的FORTRAN语言 开始使用接近人类自然语言的 但又消除了自然语言中的二义性的语言来描述程序 这些高级语言使人们开始摆脱进行程序设计必须先熟悉机器的桎梏 把精力集中于解题思路和方法上 据统计 全世界已有2500种以上的计算机语言 其中使用较多的有近百种 图1 5为几种广泛流行的高级语言的发展变迁情况 9 图1 5几种广泛流行的高级语言的发展变迁情况 10 1 1 3高级语言程序的开发过程一般来说 程序开发的一般过程有如图1 6所示几个步骤 图1 6高级语言程序的开发过程 11 1 分析一个具体的问题要涉及许许多多的方面 问题的复杂性 为了便于求解 往往要忽略一些次要方面 找出解题规律 就称为建立模型 2 建立模型 表现模型表现模型就是用一种符号 语言系统来描述模型 模型的表现会随着对问题抽象程度的加深和细化 不断由领域特色向计算机可解释 执行靠近 中间也可能采用一些其他的符号系统 如流程图等 直到最后用一种计算机程序设计语言描述出来 3 源程序的编辑源程序的编辑就是在某种字处理环境下 用具体的程序设计语言书写并修改的过程 12 4 程序的编译 或解释 与链接源程序 文件 用高级语言写的程序 文件 可执行程序 文件 机器可以直接辨认并执行的程序 文件 高级语言源程序不能直接执行 要翻译成机器语言程序后才能执行 这一过程一般分为两步 第1步 在程序编辑过程中输入到源文件中的是一些字符码 但是机器可以直接处理的是0 1信息 为此 首先要将源程序文件翻译成0 1码表示的目标程序文件 由源文件翻译成目标文件的过程称为编译 在编译过程中 还要对源程序中的语法和逻辑结构进行检查 编译任务是由称做编译器 compiler 的软件完成的 目标程序文件还不能被执行 它们只是一些目标程序模块 13 第2步 将目标程序模块以及程序所需的系统目标程序模块 如执行输入输出操作的模块 链接成一个完整的可执行文件 完成链接过程的软件称为链接器 linker 图1 7编译和链接过程的示意图 14 5 程序的测试与调试生成可执行文件后 就可以让计算机执行了 但是 程序仍然会存在某些错误 因此 在正式交付使用前 要对程序进行测试 测试是以程序通过编译 没有语法和链接上的错误为前提 目的是找出程序中可能存在的错误并加以改正 因此 应该测试程序在不同情况下运行的情况 输入不同的数据可以检测出程序在不同情况下运行的情况 每次测试都要把实际的结果与预期的结果相比较 以观察程序是否出错 15 6 编写程序文档随着程序规模的增大和日益复杂化 用户要运行程序 还需要知道许多信息 如 程序的功能需要输入的数据类型 格式和取值范围需要使用的文件数量 名称 内容以及存放位置等程序运行需要的软 硬件环境程序的装入 启动方法以及交互方式等 为此 程序开发者需要向用户提供这些资料 即程序使用说明书或用户文档 在许多软件中 这些内容已经部分或全部地以 readme 或 help 的形式提供 文档在程序使用和维护中的重要性也改变了软件的概念 使之由早期的 软件是计算机程序的总称 演化为 软件是计算机的程序连同计算机化的文档的总称 16 7 程序的维护由于多种原因 程序在交付用户使用之后 还可能要进行修改 交付之后对程序的修改称为程序的维护 维护程序的原因主要有 原来的程序没有完全满足用户要求 用户要求的改变 程序中遗留有错误 在运行中被发现 程序的维护可以由开发者进行 也可能是由别人进行 为能便于程序的维护 开发者应当提供必要的技术资料 并且要保证程序的可读性好 能让人看懂 17 1 2C语言及其标准 1 2 1C语言的出现20世纪60年代 为了开发和描述UNIX Bell实验室的KenThompson将当时的一种专门用来描述系统程序的BCPL语言改进为他称为B的语言 1970年他用汇编语言和B语言实现了UNIX的初版 1971年 DennisRitchie开始协助Thompson开发UNIX 他对B语言进行了完善 加入数据类型和新的句法 于1972年推出了C语言 为了推广UNIX 1977年DennisM Ritchie发表了不依赖于具体机器系统的C语言编译文本 可移植的C语言编译程序 1978年BrianW Kernighian和DennisM Ritchie出版了名著 TheCProgrammingLanguage 从而使C语言成为世界上流行最广泛的高级程序设计语言 在C语言的基础上 产生了C VisualC Java C 等语言 18 1 2 2C语言的标准1983年 美国国家标准局 ANSI 公布了第一个C语言标准草案 83ANSIC 1989年 ASNI又发布了一个完整的C语言标准 ANSIC 简称 C89 1990年 国际标准组织ISO JECJTC1 SC22 WG14对C89做了少量编辑性修改后 发布了 C90 1995年 WG14对C89做了两处技术修订和一个扩充 人们将其称为 C89增补1 或 C95 WG14于1999年完成C标准的全面修订 形成正式的C语言标准 命名为ISO IEC9899 1999 简称 C99 本书将基于C99介绍C语言程序设计的基本方法 目前各厂家所提供的所有C编译系统都还未实现C99所建议的功能 为了读者能实际运行C程序 本书所介绍的程序都是符合ASNIC标准并能在大多数C编译系统通过和运行的程序 19 1 3C语言程序概要 1 3 1函数C语言程序是由函数组成的 设计C程序就是设计它的构成函数 例1 1输出字符串的C程序 文件名 ex010101 c includeintmain void printf Programmingisfun 输出一串字符 return0 向操作系统返回一个数字0 20 说明 1 以上是一个函数 函数名为 main 表示这个函数是 主函数 即执行此程序时 由操作系统直接调用的函数 每一个C语言程序必须也只能有一个main函数 程序总是从main函数开始执行 2 圆括号 用于表示参数 在C语言程序中 参数部分写为 void 表示该函数没有参数 void 可以省写 如程序第一行可写为 intmain 但是 C标准建议写上void 使含义清晰 intmain void 21 3 花括号 中的部分称为函数体 由多条语句组成 表明此函数的功能 每条语句必须以分号结束 语句 printf Programmingisfun 的功能是调用编译系统提供的printf 函数 输出后面的字符串 4 函数名前面的 int 表明函数的返回值是一个整数 有的操作系统 如Unix 要求在执行一个程序后应向系统返回一个整数值 如程序正常执行和结束 应返回0 否则返回一个非0值 因此 需要将main函数指定为int 整型 同时在函数体的最后写一返回语句 return0 它的功能是向操作系统返回0值 表示程序正常结束 此语句必须写在函数体的最后一行 因为只要执行到这条语句 就表达程序正常结束 向操作系统返回一个0 如果程序未执行到这个返回语句就非正常结束了 就不会向操作系统返回0 22 有的操作系统 如DOS Windows 不要求程序必须返回整数 因此 可以不指定main函数为整型 这时可在main函数的前面加上void 如 voidmain void 或voidmain 表示main函数是无类型的 不返回任何类型的值 在main函数的最后也不必写返回语句 return0 以上两种用法都是是合法的 有效的 编程者可以根据情况决定 为了使程序具有一般性 采用以下形式 intmain void 并在函数体最后有 return0 语句 23 5 include是一种在程序编译之前要处理的内容 称为编译预处理命令 以 开头 并且不用分号结束 所以不是C语言的语句 include命令称为文件包含命令 作用是在编译前把stdio h文件包含进来 程序中使用的系统函数printf 的相关信息在stdio h文件中 用 h 作为后缀的文件称为头文件 6 中的文字是注释 让读程序的人容易读懂 24 以下是由两个函数组成的程序 例1 2计算两个整数 2 3 相加的结果 includeintadd int int 声明后面将要使用函数add intmain void ints 声明后面使用的变量s是整型的 s add 2 3 调用add 进行计算 并用s接收 printf Thesumis d s 输出s的值 return0 intadd inta intb 函数add 的定义 intsum 定义一个整数sum 用于存放和 sum a b 将a和b求和 并把结果送sum returnsum 返回sum的值到调用者 25 说明 1 下图表明该程序的执行过程 图1 9程序ex1 02的执行过程 26 经过编译 链接后的C语言程序就成为一个可执行文件 例如 程序的ex1 02 c的默认可执行文件名为 ex1 02 exe 在主函数main中 第一个语句是s add 2 3 但是 这个语句的执行要分如下步骤才能完成 调用函数add 同时将数据2和3分别传送给函数add 中的变量a和b 使用表达式a b进行加法计算 将和用 送给函数add 中的变量sum 注意 是赋值操作符 C语言中的等号是 用return语句将sum的值返回的函数add 的调用处 将函数add 的返回值送给主函数中的变量s 27 执行函数printf Thesumis d s 输出以下内容 Thesunis5这个语句的执行也需要如下多个步骤才能实现 圆括号中的引号中的 Thesumis 要求原样输出 圆括号中的引号中的 表示后面的字符 d 是一个格式字符 要求将双引号后面的表达式的值 按照整型数据输出 函数printf 将流程返回到调用处 printf 也有返回值 成功返回输出的字符个数 失败时 返回一个负整数 但一般不用 执行main 中的返回语句return0 向操作系统返回0 28 2 变量及其类型本例中的s和sum都称为变量 变量是程序中被命名的数据实体 其值可以改变 为了便于计算与存储 C语言中所使用的每个数据都被规范化了 这种数据的规范称为数据类型 本例中使用语句ints 和intsum 作用是声明了两个变量s和sum名字和数据类型 用 int 表明它们是整型数据 变量在使用之前都要先行声明 29 3 函数的声明intadd int int 称为函数声明 函数声明的作用是让编译器知道该函数的原型 包括返回值类型 参数个数和类型 以便对调用语句进行语法检查 如果函数定义在调用之前 从定义可以直接获得这些信息 就可以不写声明 如果调用在定义之前 则需要一个原型声明说明这些信息 对于编译系统提供的库函数 它们的定义不在程序中 因此需要给出相应的原型声明 系统把某些类型的库函数的原型声明写在某个头文件中 程序员只要用文件包含语句把头文件包含进来即可 这就是使用函数printf 时 必须先写一条 include的原因 30 4 关于printf 函数的参数printf 函数的参数有两部分 前面的用双引号引起的部分称为 控制串 控制串由一些字符组成 这些字符可以分成两类 第一类字符可以直接显示出来 第二类字符作为格式说明符使用 格式说明符是由 开头 后面跟着的是格式码 本例中的 d 就是格式码 它后面输出的数据按照带符号十进制输出 其他格式说明符将陆续介绍 5 关于赋值运算在C语言中 符号 称为赋值运算符 它的作用是把后面 右面 的值 送到其前 左面 的变量 左值 中 31 例1 3计算一个数的正弦值的C语言程序 文件名 ex010301 c include includeintmain void floatx 定义x为实型变量 x sin 0 19199 调用sin函数 printf f n x 调用printf函数 输出x的值 32 说明 1 floatx 是声明 x是一个实型变量 2 x sin 0 19199 执行一次函数调用 求出0 19199弧度的正弦值 并赋给实型变量x sin 是一个库函数 math h是其要求的头文件 3 printf 中的格式说明符 f 指定一个实型格式输出 前面介绍的 d是整型数据格式符 通常输出的数据在小数后有6位数字 小数点前的数字位数根据实际的位数输出 格式说明符的类型要与后面要输出的变量的数据类型一致 4 printf 中的 n 称为转义字符序列 其作用是 回车换行 转义字符还有一些 以后陆续介绍 33 从这一小节可以得出如下结论 C语言程序是由函数组成的 设计C语言程序时 必须设计的是主函数 程序的执行是从系统调用主函数开始的 主函数的部分功能也可以通过其他子函数补充实现 子函数应当首选函数库中的函数 函数库中没有时才自行设计 使用库函数时 要用文件包含命令将需要的头文件包含到程序中调用该库函数之前 34 1 3 2C语言的标准函数的组成单位是语句 基本的语句有表达式语句 流程控制语句和块语句 1 表达式语句C语言程序的具体计算过程是由表达式完成的 表达式是由运算符 如 等 变量 如s sum a b x等 和常量 如2 3 0 19199等 组成 如 s add 2 3 sum a bx sin 0 19199 表达式加上语句结束符 分号 就构成表达式语句 变量和常量的使用涉及它们的数据类型 表示 命名 规则等 后面要专门介绍 35 C语言中的运算符种类很多 正确地使用这些运算符 有三点需要注意 含义 特别要区分一个运算符符号在C语言中和在普通数学中的意义的不同 如 优先级 即在一个表达式中存在多个运算符时 进行运算的先后顺序 结合性 即在一个表达式中有多个优先级别相同的运算符时 先进行哪个运算符的运算 例如 在表达式2 3 5 为乘运算符 为除运算符 中 先进行除呢 还是先进行乘 关于这些问题 后面将专门介绍 36 2 流程控制语句程序中的语句一般是按照书写顺序执行的 但是 有些情况下 需要改变默认的执行顺序 例如像图1 10 a 那样要从两个或多个语句中挑选一个语句执行 或者像图1 10 b 那样要重复执行某一个语句或语句块 前者称为选择控制 后者称为重复控制 a 选择结构 b 重复结构图1 10两种基本的流程控制结构 37 例1 4由键盘输入两个数 输出其中的大数 本例中函数max2 的执行过程如图1 11所示 图1 11函数max2 的执行过程 38 文件名 ex010401 c includefloatmax2 floatx floaty floatmax if x y 选择判断 max x 条件满足进行的运算 elsemax y 条件不符进行的运算 printf Themaxis f max intmain void floata b printf Inputtworealnumbers n 输入提示 scanf f f 39 说明 1 函数max2 中有一个选择结构 条件是 x y 满足则执行max x 不满足则执行max y 这样 就在max中保存了x和y中的大者 2 在主函数中 函数scanf f f a b 的功能是从键盘上输入两个实数 分别存放到地址 a和 b中 地址 a和 b是变量a和b地址 是取地址运算符 3 在函数scanf f f a b 中 f 表示要输入的数据是实型数据 格式说明符的类型 要与输入数据的类型一致 另外 键入的两个数据之间应当以空格 制表符 按Tab键 或回车分隔 程序运行时的情形如下 Inputtworealnumbers 1 2352 345Themaxis 2 345 40 例1 5求累加和的值 程序如下 文件名 ex010501 c includeintsigma intn inti 0 sum 0 while i n i sum sum i renturnsum intmain void intm total scanf d 41 说明 1 声明 inti 0 sum 0 有两个功能 一是定义了两个整型变量 二是设定了两个整型变量初值 这称为变量的初始化 变量在没有初始化时并且也没有执行赋值操作之前 其值是不确定的 为了避免使用这些不确定的值 应当尽量在变量定义的同时对其进行初始化 一般说来 存放和的变量的初始值应当为0 而存放积的变量的初始值应当为1 42 2 在本例中 函数sigma 用来计算 计算的方法是 先设置sum的初值为0 i的初值为0 用表达式 i 将自增1 相当于执行操作 i i 1 每执行一次i的自增1 执行一次sum sum i 用流程图表示右图所示 图1 12函数sigma 的执行过程 43 3 块语句块语句也称为复合语句 就是用一对花括号将一组语句括起来 在一个块语句中可以包括若干声明和若干语句 在例1 8的函数sigma 中 while下面的用花括号括起的两个语句 就组成一个块语句 块语句在语法上相当于一条语句 因此 当语法上需要一个语句 而一个语句又不能满足需要时 就必须使用块语句 44 1 3 3名字与声明1 标识符与关键字标识符也称为名称 变量名 函数名 文件名等 都是关键字 C语言的标识符应当符合以下词法规则 1 标识符是大小写字母 数字和下划线组成的序列 但不能以数字开头 合法标识符 aAAb Ax aXA xabcd不合法标识符 5 A 数字打头 A 3 含非法字符 2 C语言区别同一字母的大小写 3 C89要求C编译器能识别的标识符长度不少于31个有效字符 C99要求C编译器能识别的标识符长度不少于63个有效字符 标识符中超过了该长度的字符可能会不被辨认 例如在符合C99的系统中 当两个标识符的前63个字符都相同时 不管后面的有效字符是否相同 都可能被当作同一个标识符 45 4 普通标识符不能使用对于系统有特殊意义的名称 这些对系统有特殊意义的名称称为关键字 表1 1为C99关键字 表1 1C99关键字 46 在一个程序中 往往要使用大量的名字 可能会造成名字的冲突和使用错误 为此 除了上述词法规则外 人们还总结了在程序中使用 好 名字的一些原则 1 尽量做到 见名知义 以增加程序的可读性 2 尽量避免使用容易混淆的字符 例如0 数字 O 大写字母 o 小写字母 1 数字 I 大写字母 i 小写字母 2 数字 Z 大写字母 z 小写字母 3 名字不要太短 一般函数名尽量使用动宾结构 如PrintCalendar IsPrime等 4 许多国外的Windows程序员还采用匈牙利人CharlesSimonyi提出的将类型作为变量名前缀的命名方法 通常称为匈牙利命名法 表1 2为部分常用匈牙利前缀 47 表1 2部分常用匈牙利前缀 48 续上表 49 2 声明在程序中 有许多东西是需要系统为其开辟存储空间 例如变量 函数类型定义等 它们都有自己的名字 并且要在内存中独立存储 为此可以将它们称做程序实体 那么 如何建立它们的名字与实体之间的关联呢 这就是声明的作用 声明也称为说明 它的作用如下 告诉编译器 一个名字是与哪个实体联系 不能张冠李戴 告诉编译器 也要程序员明白这个实体的类型 告诉编译器 这个实体什么时候建立 在什么范围内可以使用 例1 2中的ints 就是建立变量名s与它的实体之间的关联 50 在一个语句块中关于声明的进一步用法 后面还要陆续介绍 目前要牢记的是 在使用一个程序实体之前 一定要让编译器知道该程序实体的属性 在C99之前 对变量和函数的声明不作为语句 尽管它们也是用分号结尾 它们必须出现在C语句的前面 声明的位置必须集中写在语句之前 C99改变了这一做法 它吸取了C 的做法 声明不必集中放在执行语句之前 可以出现在程序中的任意行 这样 C语句就有执行语句和非执行语句之分 声明是非执行语句 表达式语句和流程控制语句是执行语句 51 1 3 4变量及其赋值1 变量变量 variable 是一种程序实体 它具有一个值 并且这个值是可以通过程序操作改变的 2 变量的赋值运算符号 称为赋值运算符 它连接了左右两个操作数 右操作数也称右值 可以是表达式 左操作数也称左值 只能是变量 赋值操作就是把右操作数的值先转换成左操作数的类型 并把该值存放到左操作数中 例如 inta a 2 6 printf d a 结果为 2这是因为计算机在执行上述语句时 首先将2 6舍去小数部分截尾 truncation 成整型 赋值给变量a 52 注意 是赋值运算符 不是等号 例如inta 2 b 3 a a b 的操作是把表达式a b的值 2 3 送到 赋值给 变量a 即经上述操作后 变量的a的值由2变为5 图1 13表明这一操作过程 先计算a b的值 然后把这个结果送到变量a中 于是 变量a的值由2变为5 图1 13a a b的操作过程 53 赋值运算符具有 自右至左 的结合性 例如inta 0 b 0 c 0 a b c 5 3 相当于inta b c a b c 5 3 即先计算把5 3的值 得8 赋值给变量c 再把变量c的值 8 赋值给变量b 最后把变量b的值 8 赋值给变量a 图1 14表明这一操作过程 执行的结果 a b c三个变量中的值均为8 也就是说 从一个变量向另一个变量赋值后 原来变量中的值并不会消失或改变 所以 赋值操作相当于拷贝 而不是移动 54 c 执行操作b c 5 3后变量a b c的值 b 执行操作c 5 3后变量a b c的值 a 操作前变量a b c的值 d 执行操作a b c 5 3后变量a b c的值 图1 14a b c 5 3的操作过程 55 1 3 5算术运算算术运算是一切计算的基础 C语言中的算术运算符与普通数学中的算术运算符有如下一些不同 运算符符号有所不同 种类有所不同 结合性可能会破坏交换率 1 C语言的基本算术运算符 56 说明 1 这几个算术运算符的运算对象有两个 所以也称为双目算术运算符 2 这几个算术运算符的优先级别为 高于 并且它们都比赋值运算符的优先级别高 3 这几个算术运算符均为 自左至右 4 注意 整数除和模运算的结果都是整数 例1 6分析下面的程序的执行结果 includeintmain void printf 300 2 3 d n 300 2 3 printf 2 3 300 d n 2 3 300 return0 57 观察上面的程序 按照交换率 似乎它们的计算结果应该相同 但是 实际结果是 300 2 3 2002 3 300 0原因在于算术运算符具有自左至右的结合性 即第1个表达式执行的顺序为 300 2 600 600 3 200而第2个表达式执行的顺序则为 2 3 0 注意是整数相除 0 300 0 58 2 自反算术赋值运算符a a b称为赋值表达式 作用是将变量a的值加上变量b的值 再送回到变量a中 C语言提供了另一种简洁形式 a b用一个复合运算符代替原来的两个运算符 这种复合运算符称为自反算术赋值运算符 如 自反减赋值 自反乘赋值 自反除赋值 自反模赋值 自反算术赋值的结合方向与赋值运算符一样 为自右向左 它的优先级较低 与赋值同级 例如表达式语句 c b a 2 相当于如下两个表达式语句 b b a 2 c b 59 3 自加和自减运算自反算术赋值运算中有两种更特殊的情况 即 i i 1即i 1i i 1即i 1i称为计数器 用来记录完成某一工作的次数 C语言为它们专门提供了两个更简洁的运算符 i 或 ii 或 i前一种 i 和i 称为后缀形式 后一种 i和 i 称为前缀形式 都称为自加或自减运算符 60 例如 inti 5 i y i inti 5 i y i 两段程序执行的结果i值都为6 y的值也都为6 但是把它们引用在表达式中就表现出区别了 例如 inti 5 x i 相当于x i i i 1 y i 结果为 x为5 y为6 即后缀方式是 先引用后增值 61 而inti 5 x i 相当于x i i 1 y i 结果为 x为6 y为6 即前缀方式是 先增值后引用 自加和自减运算符的结合方向是 自右至左 它的运算对象只能是整型变量而不能是表达式或常数 例如 5 或 x y 是错误的 62 4 正负号运算符正负号运算符为 正号 和 负号 它们是一元运算符 例如 5和 6 它们的优先级别高于 运算符 例如 a b先使a变符号再乘以b 其实正负号运算相当于一次算术赋值运算 例如 a相当于a 0 a a b相当于 0 a b它的结合方向为自右至左 综上所述 凡赋值运算符及其变种 包括自反算术赋值运算符 自加自减运算符和正负号运算符 的结合方向都是自右至左的 63 1 3 6赋值类运算符的副作用及限制鉴于 软件危机 的教训 现代人们进行程序设计时要遵守的基本规范是 可靠性第一 效率第二 为保证可靠性第一 就要清晰易读第一 这就要求进行程序设计时 把程序写得清晰易懂一些 C语言允许在一个表达式中使用一个以上的赋值类运算符 如 赋值符 自反算术赋值符 自加 自减运算符等 在给程序带来简洁性的同时也会引起如下副作用 1 费解 易于误解 对人的副作用下面是容易引起误解的两个例子 1 c b a 2 容易误解为b a c b 2 2 x i j 应该理解为x i j呢 还是x i j 呢 实际上C编译器总是从左至右尽量多地
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学信息技术二年级上册第2课《中华民族网上游-上网搜集资料》教学设计
- 预应力锚具安装质量验收管理方案
- 2025个体劳动者劳务合同简易模板
- 2025年老年医学科老年病综合治疗评估答案及解析
- 2025版权申请委托合同(网上版权)
- 小学信息技术第二册下册 第7课 美化文章 1说课稿 苏科版
- 2025年内分泌科疾病诊断与治疗规范模拟测试卷答案及解析
- 2025年康复医学功能康复评定综合考核答案及解析
- 2025年药理学常用药物作用机制考察模拟考试卷答案及解析
- 2025年检验科实验室操作流程规范考核试卷答案及解析
- 《简爱》课本剧剧本
- 阳光晾衣房钢结构专项施工方案
- 肿瘤科实习生入科培训课件
- 国际商务谈判英文版课件PPT
- 【课件】1.2 点线传情——造型元素之点线面 课件-2021-2022学年高中美术人美版(2019)选修绘画
- 注塑机安全操作规程
- 运动处方(课堂PPT)
- 第2章曲柄压力机
- 物资储备与物流方案
- 数学课堂教学技能训练
- 译林英语五年级上册教材分析
评论
0/150
提交评论