




已阅读5页,还剩185页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
四 C 语言的语法规则 四类语句 说明性语句 表达式语句 控制语句 复合语句 C 语言的语法和语义 雷小eiyunhui 四 C 语言的语法规则 人类语言的语法规则如何由单词构造句子 如何由句子构造段落 C 语言的语法规则如何由单词构造语句 如何由语句构造函数 如何由函数构造程序 基于过程的程序设计 四 C 语言的语法规则 程序 程序 子程序 函数 语句 表达式 数据引用 算符 函数调用 语法规则 词法规则 四 C 语言的语法规则 程序由一系列语句组成 C 程序由四类语句组成 4 1 说明性语句 主要说明程序中的数据 4 2 表达式语句 主要说明数据的运算 4 3 复合语句和空语句 4 4 流程控制语句 控制语句的执行顺序 4 1 说明性语句 变量说明 变量及其定义 变量名 数据类型常变量 数组 指针 引用 字符串 结构 联合 枚举 类 4 1 说明性语句 说明性语句对程序中所有由程序员给出的名字标识符 包括变量名 常量名 对象名 类名 函数名和参数名等在使用之前进行说明或定义的语句 最重要的内容 如何说明变量 变量及其说明 什么是变量程序执行时状态可能发生改变的量 与代数中的变量含义相同 用符号代替具体的数值 x y变量可以视为一块有名字的内存存储区 可以通过程序对其进行读 写处理属于程序中的数据成分 30 MyAge 变量及其说明 变量可以视为一块有名字的内存存储区 可以对其进行读写处理 变量的数据值 存储区中的内容 右值 变量的地址值 存储区的地址 左值 1111111111111111 MyAge 2Bytes 1111111111111111 MyAge的地址 0 x0012FF7CMyAge的数据值补码 FF 2Bytes MyAge 变量及其说明 变量可以视为一块有名字的内存存储区 可以对其进行读写处理 这块内存区的名字怎么取 这块内存区有多大 这块内存区里面放的内容如何解释 对这个变量能够进行何种运算操作 通过变量可以找到对应的内存地址 左值 以及该内存中的数据值 右值 变量及其说明 定义变量就是回答上述问题的过程定义变量的语法 数据类型变量名1 变量名n 例如 定义一个整型变量intMyAge MyAge 30 赋值语句intMyAge 30 定义和初始化同时进行 变量及其说明 变量名符合标识符的构词法可读性遵循某种命名法匈牙利命名法 iMyAge驼峰式命名法 myAge帕斯卡命名法 MyAge 变量及其说明 变量的数据类型基本数据类型int char float double bool void基本数据类型可加上修饰词 signed unsigned long short复合数据类型 常变量 符号常量 数组 指针 引用 字符串扩充新的数据类型 结构 联合 枚举 类 复合数据类型 六类复合数据类型 常变量 符号常量 数组变量 指针变量 引用变量 字符串变量 变量及其说明 常变量 voidmain doubleradius area 定义圆半径 面积doublecircumference 定义圆周长cout radius area 3 14159265 radius radius circumference 2 0 3 14156265 radius cout 面积 area n cout 周长 circumference n 1 难以保证常量之间的一致性 2 修改繁琐 圆周率改成3 1415926535898 变量及其说明 常变量 常变量 又称为符号常量一块有名字的内存区 在其中存储着一个常量 在程序执行过程中其值保持不变常变量具有常量的特性和变量的方便易读常变量存储在数据区 可寻址举例 constdoublePI 3 1415926 floatarea PI r r 变量及其说明 常变量 voidmain 定义圆周率常量PIconstdoublePI 3 1415926535898 doubleradius area 定义圆半径 面积doublecircumference 定义圆周长cout radius area PI radius radius circumference 2 0 PI radius cout 面积 area n cout 周长 circumference n 变量及其说明 数组变量 实际问题 编程求各班同学的某科的总成绩 假设每班50人 inttotal 87 67 92 60 ints1 s2 s50 变量数目太多 inttotal s1 s2 s50 ints 50 total 0 for inti 0 i 50 i total s i 变量及其说明 数组变量 数组变量 表示一块有名字的内存存储区 在其中顺序存储着一组数据类型相同的对象 定义数组变量即指定如下信息 数组变量名元素的数据类型指明元素的个数 数据类型数组名 常量 数据类型数组名 常量 常量 一维数组 intOurAges 32 多维数组 doubleMatrix 3 4 变量及其说明 数组变量 举例 intOurAges 32 定义整型数组OurAges元素的数据类型为整型该数组有32个数组元素 OurAges 0 OurAges 1 OurAges 31 元素在内存中顺序存放 006E2000H 006E2004H 0 1 30 31 变量及其说明 数组变量 试着总结出一般的公式数组的起始地址为A数组元素大小为s个字节第n个元素的地址为 A n s n从0开始 变量及其说明 数组变量 如何使用数组 引用整个数组 使用数组名 C 规定 数组名代表数组的起始地址 引用数组元素 数组名 下标 例如 OurAges 28 表示数组的第29个元素注意数组越界问题 OurAges 32 OurAges 32 的使用及存储映像 变量及其说明 指针变量 变量的左值和右值变量的数据值 存储区中的内容 右值 变量的地址值 存储区的地址 左值 变量的地址值不过是一个整数 标识内存地址 如 0 x0012FF00问题 能否将变量的地址值存储到另一个变量中 变量及其说明 指针变量 指针变量 一块有名字的内存区 在其中存放了某个对象的地址值 通过指针变量可以间接地操作该对象 指针指向某个对象 在指针变量中存放了该对象的地址值定义指针变量需规定如下信息 指针变量名指针变量所指对象的类型 int p 变量及其说明 指针变量 定义字符指针变量pCh 使其指向变量achara 66 pCh 问题 指针变量pCh的左值 右值 以及所指变量的值分别是什么 7CFF1200 0 x0012FF78 pCh的左值 0 x0012FF78pCh的右值 0 x0012FF7CpCh所指变量的值 pCh 0 x42 42 0 x0012FF7C a 变量及其说明 指针变量 举例 定义字符指针 1 char p 定义一个字符型的指针变量 2 chara 66 定义字符变量a 3 p 解引用操作符 变量及其说明 指针变量 举例 定义字符指针char p a 66 p 多级指针 变量及其说明 指针变量 指向数组的指针intOurAges 32 int pInt OurAges 或者int pInt 006E2000H 006E2004H 0 1 30 31 OurAges 006E2000H pInt 通过指针变量操作数组 变量及其说明 指针变量 举例 无类型指针inta 10 void pv 无类型指针变量可以持有任何类型变量的地址值不能通过无类型指针操作所指对象 因为编译器不知道如何解释那块内存区 变量及其说明 引用变量 指针的问题 操作空指针int p 0 for inti 0 i 32 i p i 10 引用变量 类似于指针 但必须指向一个固定的对象 又称为该对象的 别名 一块有名字的不可变内存区 在其中存放了一个已存在对象的地址值 且地址值不可改变 通过引用变量可以间接地操作该对象 变量及其说明 引用变量 举例 定义整型引用变量int 表示什么含义 1 引用变量一旦定义就不能再指向其他对象 2 对引用变量进行的任何操作等同于直接操作a 变量及其说明 字符串变量 字符串变量 一块有名字的内存区 其中顺序存放一个字符序列 且最后一个字符为 0 注意 字符 0 的ASCII编码为0字符串变量的两种定义方式C风格的字符串 字符数组标准C 的string类 变量及其说明 字符串变量 举例 C风格的字符串 Hi Stop charcstr 8 cstr 0 H cstr 1 i cstr 2 cstr 3 cstr 4 S cstr 5 t cstr 6 o cstr 7 p cstr 8 0 charcstr H i S t o p 0 charcstr Hi Stop 变量及其说明 字符串变量 举例 标准C 的字符串 Hi Stop includestringstr Hi Stop char pAsciiStr ABC char pGbkStr 英语学习ABC char pUnicodeStr L 英语学习ABC 扩充新的数据类型 定义自己的数据类型 结构 联合 枚举 类 扩充新的数据类型 使用方式与内置和复合数据类型相同新的数据类型名变量名 例如 inta 1 定义新的数据类型Student 2 定义变量Students1 自定义类型 结构变量 结构变量一块有名字的内存区 在其中存储了一组对象 形成逻辑上的整体结构对象例如 学生信息由学号 姓名 性别和考试成绩组成日期由年 月 日组成定义结构变量定义结构类型定义结构变量 举例 定义两个结构类型 structstudent intnumber charname 10 charsex intscore structdate intyear intmonth intday 举例 定义结构变量 structstudentstu1 1024 ABC F 97 structstudentstu 10 stu1 number 1024 strcpy stu1 name ABC stu1 sex F stu1 score 97 cout sizeof stu1 endl 20cout sizeof stu endl 200 举例 定义结构变量 定义结构变量structdateMyBirthday MyBirthday year 1978 MyBirthday month 12 MyBirthday day 19 BA0700000C00000013000000 MyBirthday 内存映像12Bytes 自定义类型 联合变量 联合变量一块有名字的内存区 在其中存储了一组对象 但在同一时刻只能存放一个对象联合变量所占用的内存大小 字节数 与成员中占用内存最大的那个成员的大小相同联合类型的声明方式与结构同联合变量的定义方式与结构同 自定义类型 联合变量 举例 定义联合类型 uniondata inta charch doubled 声明联合变量 uniondatamydata mydata a 10 mydata ch a mydata d 1 0 0A000000CCCCCCCC 61000000CCCCCCCC 000000000000F03F 自定义类型 枚举变量 举例 季节的取值可以通过集合表示 1 2 3 4 更完美的表示 spr sum aut win 枚举变量一块有名字的内存区 在其中存放一个命名的整型常数 且该整型常数的取值范围为一个固定的枚举集合 enum枚举类型名 整型符号常量1 整型符号常量n 自定义类型 枚举变量 enumseasons spring summer autumn winter enumseasonss1 定义枚举变量s1 summer s1 1s1 winter s1 3enumseasons spring 1 summer autumn winter enumseasonss1 定义枚举变量s1 summer s1 2s1 winter s1 4 自定义类型 类变量 类变量一块有名字的内存区 在其中存放用户自定义类类型的对象 该对象具有表示属性的数据以及对数据的操作定义方法 声明类类型定义类变量 举例 声明时钟类的类型 classClock 时钟类的声明public 公有成员voidSetTime intH intM intS voidShowTime private 私有数据成员intHour Minute Second 举例 声明时钟类的类型 时钟类成员函数的具体实现voidClock SetTime intH 0 intM 0 intS 0 Hour H Minute M Second S voidClock ShowTime cout 现在是 Hour 小时 Minute 分钟 Second 秒钟 endl 举例 定义时钟类的变量 ClockMyClock 定义一个时钟ClockAllClocks 10 定义10个时钟 定义时钟类型的指针变量Clock pClock 比较下 Clock类型与int等基本类型的相似性与区别 变量说明小结 说明的形式变量类型说明 变量名变量类型 基本类型复合类型 常变量 数组 指针 引用 字符串 自定义类型 结构 联合 枚举 类变量类型说明 唯一地规定变量所对应的内存区的规格 特性 解释方式和运算变量名符合标识符的构词法 易读性 4 2 表达式语句 通过变量说明确定程序中的数据那么 对这些数据进行什么样的运算处理呢 表达式语句 4 2 表达式语句 表达式语句 表达式 表达式 由操作数和运算符连接成的式子 规定对操作数执行的运算处理 原子表达式 文字常量 变量例如 1 2 MyBirthday简单表达式 只有一个运算符例如 a b x 2复合表达式 多个运算符例如 a b c 4 2 表达式语句 问题1 如何确定表达式的求值顺序原子表达式和简单表达式 没有困难复合表达式 多个运算符哪个先运算 哪个后运算 问题2 C 有哪些运算符和表达式 问题3 操作数的类型不一致时表达式如何求值 类型转换 4 2 表达式语句 4 2 1 运算符及其优先级和结合性 4 2 2 基本运算符及其表达式 4 2 3 类型转换 4 2 1 运算符及其优先级和结合性 运算符的分类按操作数的数目 单目 双目 三目运算符按运算功能分 条件运算符逗号运算符sizeof运算符其它运算符 算术运算符关系运算符逻辑运算符位运算符赋值运算符 4 2 1 运算符及其优先级和结合性 运算符的优先级和结合性优先级 运算符的优先级用序号表示 序号越小 则该运算符优先结合a b c加 和减 的优先级是6乘 和除 的优先级是5 故乘 先结合 运算顺序为 b c bc a a bc 4 2 1 运算符及其优先级和结合性 运算符的优先级和结合性结合性 当多个运算符优先级相同时 规定结合顺序是从左向右还是从右向左 举例 a b c 的优先级相同 结合性从左向右 故 a b a b c a b c 4 2 1 运算符及其优先级和结合性 优先级和结合性确定的一般基本规则 1 优先级高的运算符优先结合 2 优先级相同的运算符根据结合性结合 如果是从左向右的结合性 则左边的运算符优先结合 如果是从右向左的结合性 则右边的运算符优先结合 4 2 1 运算符及其优先级和结合性 举例 x y z 5赋值运算符 的优先级为16赋值运算符 的结合性 从右向左故x y z 5 4 2 2 基本运算符及其表达式 C 的基本运算符及其表达式算术运算符及其表达式赋值运算符及其表达式关系运算符及其表达式逻辑运算符及其表达式位运算符及其表达式条件运算符及其表达式sizeof运算符及其表达式逗号运算符及其表达式其它运算符 4 2 2 基本运算符之算术运算符及其表达式 4 2 2 基本运算符之算术运算符及其表达式 整数的算术运算整除截断小数 21 6 21 7 3取余符号问题 21 6 321 6 3 21 6 3 21 6 3运算异常 除0 溢出 结果依赖于机器 charc 32 8 4 2 2 基本运算符之算术运算符及其表达式 浮点数的算术运算float double longdouble精度问题 浮点舍入floatfval 10 1 编译警告 warningC4305 initializing truncationfrom constdouble to float 4 2 2 基本运算符之算术运算符及其表达式 举例 说明以下两个除法表达式的区别doubledval1 10 0 dval2 3 0 intival1 10 ival2 3 dval1 dval2 ival1 ival2 4 2 2 基本运算符之算术运算符及其表达式 自增 自减运算符 使变量当前值加1或减1 再赋给该变量操作数只能是变量 不能是常量或表达式inti 5 i 或者 ii 或者 i此时运算符前置或后置没有影响 可是视为是i i 1 的缩略写法 4 2 2 基本运算符之算术运算符及其表达式 自增 自减运算符 前置 先增减后引用后置 先引用后增减 inti 5 j 5 m n m i 后置 相当于 m i i i 1 结果 i的值为6 m的值为5 n j 前置 相当于 j j 1 n j 结果 j的值为6 n的值为6 4 2 2 基本运算符之算术运算符及其表达式 问题1 填充以下问号的内容inti 5 j 5 m n m i 后置 相当于 结果 i的值为 m的值为 n j 前置 相当于 结果 j的值为 n的值为 问题2 说明如下表达式的计算过程inta 5 c c a a 4 2 2 基本运算符之赋值运算符及其表达式 赋值 用一个新值覆盖变量的当前值语法 变量名 表达式inti j i 10 j i 6 赋值表达式赋值运算符的左操作数必须是左值 即必须有一个相关联的 可写的地址值1024 i 错误 常量不可寻址constintarysize 24 arysize 25 错误 有地址但不可写 4 2 2 基本运算符之赋值运算符及其表达式 赋值运算不是等于判断 赋值具有方向性赋值与初始化 均使用 运算符初始化是为对象提供初值 一个对象只能在定义时被初始化一次 赋值是用新值取代旧值 可以对一个对象进行多次赋值操作inti 10 j 初始化 j有没有初值 j i 6 赋值j j 赋值 4 2 2 基本运算符之赋值运算符及其表达式 复合赋值运算符 由双目算术运算符和位运算符与赋值运算符组成的单一运算符 共10个 4 2 2 基本运算符之赋值运算符及其表达式 赋值表达式求值赋值表达式作为表达式可以求值 其值是存储在赋值运算符左边变量中的值 因此 一个赋值表达式能作为另一赋值表达式的右操作数 多个赋值运算符能连接在一个表达式中 intm n p m n p 100 即 n m p 100 m n p 100 2 即 m n p 100 2 m n p 10 即 m m n p 10 4 2 2 基本运算符之关系运算符及其表达式 关系运算符两个操作数大小的比较 结果为逻辑值true或false包括六个运算符 关系表达式 由关系运算符连接的表达式 表达式的值为true或false关系成立则为true 否则false 注意 C 中true对应于整数1 false对应于整数0 反之 0对应于false 非0对应于true 4 2 2 基本运算符之关系运算符及其表达式 举例 1 a b c d a b c d 结果为0或1 2 y a b 计算a b的值0或1赋给y y的值为0或1 3 a b c a b c 先求a b的值 再将结果0或1与c比较大小 4 2 2 基本运算符之逻辑运算符及其表达式 逻辑运算符C 提供了3种逻辑运算符逻辑非 逻辑与 逻辑或 逻辑表达式操作数和求值结果均为true或false 4 2 2 基本运算符之逻辑运算符及其表达式 4 2 2 基本运算符之逻辑运算符及其表达式 举例 5 5 5 6 6 65 6 6 5 2010 510 5 510 0 已知 inta 10 b 20 c 30 floatx 1 8 y 2 4 ay ay a b c t1 1 t2 0 t4 0 t3 0 t5 b t6 1 得整个表达式的值为 1 4 2 2 基本运算符之逻辑运算符及其表达式 短路优化 一旦逻辑表达式的值能够确定 就不再进行后续的运算expr1 expr2expr1 expr2如果满足如下条件之一 就不再计算expr2 1 在逻辑与表达式中 expr1的求值结果为false 2 在逻辑或表达式中 expr1的求值结果为true 4 2 2 基本运算符之逻辑运算符及其表达式 已知 inta 10 b 20 c 30 求如下表达式的结果以及a b c的值a b c 短路优化有可能产生副作用出乎设计人员的意料 得到预想不到的结果 4 2 2 基本运算符之位运算符及其表达式 C 提供6种位运算符 可以进行二进制位的运算 1 按位取反运算符 优先级3 2 按位与运算符 优先级10 3 按位或运算符 优先级12 4 按位异或运算符 优先级11 5 左移位运算符 优先级7 4 2 2 基本运算符之位运算符及其表达式 10011011 01100100 a01001101b00001111a b00001101 a01001101b00001111a b01001111 a01001101b00001111a b01000010 低4位保留 高4位置0 高4位保留 低4位置1 高4位保留 低4位取反与0异或保持原值 与1异或取反 使用异或实现数值交换 chara 10 b 11 a a b b a b a b ba a b a b a b bcout int a endl cout int b endl a00001010b00001011a b00000001 a00000001b00001011a b00001010 a00000001b00001010a b00001011 4 2 2 基本运算符之位运算符及其表达式 移位运算符 将一个位串向左或向右移动一定的位数unsignedchara 10 00001010 00101000 a 2 00000010 a 2 等同于 10 22 等同于 10 22 4 2 2 基本运算符之位运算符及其表达式 左移位运算 a n 右移后 低位舍弃高位补数 若a为无符号数 则补0 若a为有符号数 则补 符号位 4 2 2 基本运算符之位运算符及其表达式 位运算有什么用 假设某班有32名学生 按序号记录同学们在某次测验中是否通过方法一 使用数组 浪费存储空间boolpassornot 32 方法二 使用位串 0未通过 1通过unsignedintpassornot 0 32位 0 0 0 0 0 1 2 31 32 4 2 2 基本运算符之位运算符及其表达式 位运算有什么用 如果某同学 序号31 通过测验 则该同学所对应的位应置为1 passornot 1 30 如果发现实际上31号同学没有通过 则需要将该同学所对应的位修改为0 passornot 1 30 0 1 0 0 0 1 2 31 32 4 2 2 基本运算符之位运算符及其表达式 位运算有什么用 如果想知道某同学 假设序号28 是否通过测验 则需要取得该同学所对应位的值boolispassed passornot表达式求值 a 0377 b 0 xff 8 4 2 2 基本运算符之条件运算符及其表达式 条件运算符C 中唯一的三目运算符 有三个操作数 操作数1 操作数2 操作数3操作数1一般是关系表达式 若关系成立 则整个表达式的值为操作数2 否则值为操作数3举例 inta 10 b 20 intmin a b a b 4 2 2 基本运算符之条件运算符及其表达式 条件表达式可以作为另一个表达式的操作数inta 10 b 20 intc a b a b 100 条件表达式可以嵌套 从右向左结合 c a b a b a 3 b a等同于 c a b a b a 3 b a 4 2 2 基本运算符之sizeof运算符及其表达式 功能 用于计算一个操作数类型或一个变量所占的字节数一般格式 sizeof 数据类型 或sizeof 变量名 例如 sizeof int 值为4sizeof float 值为4doublex sizeof x 值为8 4 2 2 基本运算符之sizeof运算符及其表达式 sizeof应用于复合数据类型数组 返回整个数组的字节长度指针 返回地址所需长度 32位机上为4doubleia 1 2 3 double pi ia double 8 4 2 2 基本运算符之sizeof运算符及其表达式 sizeof应用于复合数据类型结构枚举类类型 待续 structdate intyear intmonth intday cout sizeof date endl enumsex male female cout sizeof sex endl 4 2 2 基本运算符之逗号运算符及其表达式 逗号表达式 用逗号连接起来的表达式格式 表达式1 表达式2 表达式n逗号表达式中的每个表达式都会被运算逗号表达式的值为最后一个表达式的值 例1 a x 3 x 6 5 6 a 11x 9例2 intm n min intmCount 0 nCount 0 min m n mCount m nCount n 4 2 2 基本运算符之其它 C 还有一些比较特殊的运算符域运算符 限定全局域 member name限定类域 CMyClass member name限定名字空间域 std cout括号 及函数调用基于对象的成员访问运算符 基于指针的成员访问运算符 数组访问运算符 解引用和取地址运算符 内存分配和释放运算符 new delete 4 2 3 类型转换 若表达式中操作数的类型不一致 如何求值 intival 10 ival 2 5 12 截断小数部分怎样得到呢 通过编译器的隐式算术转换 自动将两个操作数转换为同一类型转换规则 小类型提升为大类型常量2 5为double型 整型变量ival被提升为double型 运算结果12 5 然后12 5赋值给整型变量ival 截断小数得12 4 2 3 类型转换 隐式类型转换隐式算术转换 目标类型是最宽的数据类型所有含有小于整型的有序类型的算术表达式 在计算之前 其类型都会被转换成整型intintival 3 5 a true 隐式赋值转换 目标类型是被赋值对象的类型 例如 int p 0 4 2 3 类型转换 显式类型转换又称强制类型转换两类类型转换运算符 1 旧式转换符 类型标识符 2 新式转换符 static cast dynamic cast const cast reinterpret cast 旧式强制类型转换 使用类型标识符作为类型转换符 C 强制转换符type expr C强制转换符 type expr 例如 inta 7 b 5 floatx a b 结果为 floaty float a float b 结果为 floatz float a b 结果为 旧式强制类型转换 新式强制类型转换 转换语法 cast name expr cast name的取值 static cast 完成编译器的任何隐式类型转换const cast 消除掉表达式expr的常量性dynamic cast 运行时动态类型转换reinterpret cast 重新解释相关联的内存区举例 doubled 97 0 charch static cast d 显式类型转换举例 void 指针及其解引用void 指针可以指向任意类型的指针void 指针无法直接解引用 没有类型信息告诉编译器如何解释与其相关联的内存区 intival 10 pi 隐式类型转换 cout pi endl cout pc endl 错误 直接解引用cout pv endl 显式类型转换举例 void 指针及其解引用 charch a pc 错误 旧式强制类型转换char oldpc char pv cout oldpc endl 新式强制类型转换char newpc static cast pv cout newpc endl charch a pc 错误 旧式强制类型转换int oldpi int pv cout oldpi endl 新式强制类型转换int newpi static cast pv cout newic endl 4 2 3 类型转换 显式类型转换的使用场合在标准的类型转换不适用时在void型指针解引用时在需要消除二义性的重载函数调用时慎用 强制类型转换关闭了C 语言的类型检查机制 极易造成程序错误 4 2 表达式语句小结 任何表达式都可以求值 且有一个确定的值和类型求值的顺序由优先级和结合性决定基本运算符及其表达式 算术 赋值 关系 逻辑 位运算 条件运算 sizeof 逗号 其它运算符求值时可能涉及类型转换 隐式 显式 新式 旧式 4 3 复合语句和空语句 简单语句由单一语句构成 简单语句可以组合成更大的逻辑单位 复合语句 4 3 复合语句和空语句 最简单的语句 空语句 当语法上需要一条语句 而实际逻辑却不需要的情况下 例如 实现字符串拷贝while string inBuf 空语句 4 3 复合语句和空语句 复合语句由一对花括号括起来的语句序列 若干语句 复合语句可以作为一个逻辑单位 出现在任何允许单个语句出现的地方如果复合语句中包含声明语句 则称该复合语句为语句块 4 4 流程控制语句 默认情况下 语句是顺序执行的 然而 顺序的语句执行过程对于大千世界中的问题求解是远远不够的要改变程序的执行流程 流程控制语句 4 4 控制语句 语句是构造程序最基本的单位 程序运行过程就是执行语句的过程流程 程序语句执行的次序C 提供三种控制结构以及跳转语句 4 4 1 顺序结构 4 4 2 分支结构 4 4 3 循环结构 4 4 4 跳转语句 4 4 1 顺序结构 流程图 举例 从键盘输入的一个大写字母 将其输出为小写字母 includeusingnamespacestd intmain charch1 ch2 cout 请输入一个大写字母 cin get ch1 ch2 ch1 32 cout 输入的大写字母 ch1 t对应的小写字母 ch2 endl 4 4 1 顺序结构 举例 从键盘输入的一个大写字母 将其输出为小写字母程序并不完美 1 如果用户输入的不是大写字母 而是小写字母 或者干脆是 回车等符号呢 2 如果用户输入 A 得到 a 后 又想继续输入 S W 呢 includeusingnamespacestd intmain charch1 ch2 cout A 4 4 2 分支结构 改进程序的处理流程 1 条件表达式求值 ch A 且ch Z 2 若true 则将ch转换为小写3 若false 则输出 输入的不是大写字母 流程图 语句1 语句2 真 假 4 4 2 分支结构 C 提供三种分支语句实现分支结构if语句条件运算符 switch语句 4 4 2 分支结构 if语句 两种if语句 语句1 语句2 真 假 真 假 if else 简单if if 条件 语句 if 条件 语句1else语句2 语句 if语句 举例 例1 输入一个年份 判断是否闰年 算法分析 假定年份为year 闰年的条件是 year 4 0 分析 读入三个数 先求出两个数中较大者 再将该大数与第三个数比较 求出最大数 intmain inta b c max cout a b c coutb max a elsemax b if c max cout 最大数为 c endl elsecout 最大数为 max endl return0 if语句 举例 例2 从键盘上输入三个整数 输出其中的最大数 4 4 2 分支结构 if语句 嵌套if 实现多选一的多路分支嵌套在if分支或else分支中 if 条件 语句 if 条件 简单if语句 if 条件 if else语句 if 条件 语句1else语句2 if 条件 简单if语句else简单if语句 if 条件 if else语句elseif else语句 4 4 2 分支结构 if语句 嵌套if 实现多选一的多路分支举例 用嵌套if完成例2 求三数最大者 a b a c b c Y N max a Y N max c N Y max b max c 分析 嵌套在if和else分支中intmain inta b c max cout a b c coutb if a c max a elsemax c elseif b c max b elsemax c cout 最大数为 max endl return0 if语句 举例 例2 从键盘上输入三个整数 输出其中的最大数 分析 嵌套在else分支中 合并条件intmain inta b c max cout a b c coutb if语句 举例 例2 从键盘上输入三个整数 输出其中的最大数 4 4 2 分支结构 if语句 嵌套if 实现多选一的多路分支嵌套if容易导致else空悬问题 当if子句多于else子句时 如何配对呢 解决的规则 就近原则 即相距最近且还没有配对的一对if和else首先配对 4 4 2 分支结构 if语句 嵌套if 配对的就近原则举例 语句一 if n 3 0 if n 5 0 cout n 是15的倍数 endl elsecout n 是3的倍数但不是5的倍数 endl 语句二 if n 3 0 if n 5 0 cout n 是15的倍数 endl elsecout n 不是3的倍数 endl 编程三步曲intmain 1 准备数据 包括用户输入 2 处理数据 计算总价 3 输出结果 总价return0 if语句 举例 例3 某商场优惠活动规定 某种商品单价为80元 一次购买5件以上 包含5件 10件以下 不包含10件 打9折 一次购买10件以上 包含10件 打8折 设计程序根据客户的购买量计算总价 编程三步曲intmain 1 准备数据 包括用户输入 搞掂constintprice 80 单价intcount 0 购买量floatdiscount 1 0f 折扣率floatamount 0 0f 总价cout count 2 处理数据 计算总价 2 1确定折扣率discount 2 2计算总价 搞掂amount count price discount 3 输出结果 总价 搞掂cout 总价 amount endl return0 if语句 举例 编程三步曲intmain 1 准备数据 包括用户输入 2 处理数据 计算总价 2 1确定折扣率discountif count 10 discount 0 8f elseif count 5 discount 0 9f elsediscount 1 0f 2 2计算总价 搞定 3 输出结果 总价 搞定 if语句 举例 intmain 1 准备数据 包括用户输入constintprice 80 单价intcount 0 购买量floatdiscount 1 0f 折扣率floatamount 0 0f 总价cout count 2 处理数据 计算总价if count 10 discount 0 8f elseif count 5 discount 0 9f elsediscount 1 0f 此行可省去 WHY amount count price discount 3 输出结果 总价 搞掂cout 总价 amount endl return0 编程三步曲intmain 1 准备数据 包括用户输入a b c 2 处理数据 计算delta 3 根据delta的取值 输出结果 无根 有二相同实根 有二不同实根return0 if语句 举例 例4 求一元二次方程ax 2 bx c 0的根 其中系数a0 b c的值由键盘输入 编程三步曲intmain 1 准备数据 包括用户输入a b cfloata b c delta x1 x2 constfloatzero 0 00001f cout a b c if fabs a zero cout 系数a不能为0 endl return0 2 处理数据 计算delta 3 根据delta的取值 输出结果 无根 有二相同实根 有二不同实根return0 if语句 举例 编程三步曲intmain 1 准备数据 包括用户输入a b c 搞掂 2 处理数据 计算deltadelta b b 4 a c 3 根据delta的取值 输出结果 无根 有二相同实根 有二不同实根if fabs delta 0 x1 b sqrt delta 2 a x2 b sqrt delta 2 a cout 有二不同实根 x1 x1 tx2 x2 endl elsecout 无实根 endl return0 if语句 举例 4 4 2 分支结构 条件运算符 条件运算符 可用来简化if语句 其形式为 expr1 expr2 expr3若expr1成立 则整个表达式的值为expr2 否则为expr3 4 4 2 分支结构 条件运算符 举例 inta 6 b 7 求以下语句执行后min a b的值min a b a b min a b a b min a b a b 4 4 2 分支结构 条件运算符 举例 将以下语句中的条件运算符转化为if语句的形式 并给出a b c的值inta 10 b 20 c c a b a b 100 c a b a b a 10 b a 4 4 2 分支结构 switch语句 if语句实现较多分支时笨拙解决方案 switch开关语句实现从多个互斥选项中选一 switch 整数expr case常量表达式 语句序列 break case常量表达式n 语句序列n break default 语句序列 4 4 2 分支结构 switch语句 switch语句的执行流程1 计算整数表达式的值 假设结果为i 2 如果存在某个case的常量表达式值为i 则执行流程跳转到该行继续执行 3 如果没有任何case的常量表达式值为i 则跳转到由default标记的行继续执行 4 如果在执行中遇到break语句 则跳出switch 执行其后的语句 问题 如果没有遇到break语句呢 switch num case1 语句序列1 break case2 语句序列2 break case3 语句序列3 break default 语句序列 计算num的值 ifnum 2 跳转到这里执行 ifnum 5 跳转到这里执行 4 4 2 分支结构 switch语句 判断是否元音字母charch i switch ch case a cout 元音字母 endl break case e cout 元音字母 endl break case i cout 元音字母 endl break case o cout 元音字母 endl break case u cout 元音字母 endl break default cout 辅音字母 endl 允许多个常量表达式对应同一个语句序列 判断是否元音字母charch i switch ch case a case e case i case o case u cout 元音字母 endl break default cout 辅音字母 endl 如果省去break 程序执行的输出是什么呢 4 4 2 分支结构 switch语句 注意事项 1 各case 包括default 分支出现的次序可以任意 通常将default放在最后 3 允许多个常量表达式对应同一个语句序列 2 每个常量表达式的取值必须各不相同 4 switch表达式和常量表达式的值必须为某种整数 包括字符 枚举 4 4 2 分支结构 switch语句 注意事项 4 break语句可选通常每个case分支都与break语句联用 在遇到break时跳出switch 若没有break语句 则每一个case分支只作为switch的执行入口 执行完该分支后 还将接着执行其后的所有分支 enum red orange yellow green blue violet indigo intcode cin code if code red 使用枚举常量作为case常量表达式 举例 设计一个计算器程序 实现加 减 乘 除运算 分析 读入两个操作数和运算符 根据运算符完成相应运算 intmain floatnum1 num2 charop cout num1 op num2 switch op case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break case cout num1 op num2 num1 num2 endl break default cout op 是无效运算符 return0 4 4 3 循环结构 回顾例子 从键盘输入的一个大写字母 将其输出为小写字母程序并不完美 1 如果用户输入的不是大写字母 而是小写字母 或者干脆是 回车等符号呢 2 如果用户输入 A 得到 a 后 又想继续输入 S W 呢 intmain charch1 ch2 cout ch1 if ch1 q break if ch1 A 解决办法 循环结构 4 4 3 循环结构 循环结构允许重复执行同一个语句序列 循环体 直到满足指定的条件 循环条件 为止C 提供三种类型的循环while循环do while循环for循环 循环条件不指定重复次数 循环条件指定重复次数 4 4 3 循环结构 while while 表达式 循环体 表达式求值 表达式值为真 是 否 执行循环体 while举例 求1 2 3 4 N的值 4 4 3 循环结构 while while举例 求1 2 3 4 N的值算法分析 N个连续整数累加1 输入 N 变量i存放加数 变量sum存放被加数 i初始为1 sum初始为0 2 处理 使i分别等于1 2 N 然后循环执行sum i 即累加 3 输出sum 源程序如下 includeusingnamespacestd constintN 100 用常变量利于修改程序intmain inti 1 sum 0 循环初始条件while i N sum i i 修改循环条件 cout sum sum endl return0 4 4 3 循环结构 while 注意事项循环条件 i N循环变量的初始化 i 1修改循环变量 i 问题1 如果不初始化循环变量i会如何 问题2 如果不修改循环变量会如何 问题3 如果不初始化变量sum会如何 小心啊 4 4 3 循环结构 while 常见的灵活写法 while i n sum i 或者while sum i i n 4 4 3 循环结构 do while do 循环体 while 表达式 否 是
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年金川集团春季校园招聘280+人笔试参考题库附带答案详解
- 2025年福州市人才发展集团有限公司招聘6人笔试参考题库附带答案详解
- 2025年河南种业集团招聘7人笔试参考题库附带答案详解
- 2025年度中国东航股份信息部校园招聘笔试参考题库附带答案详解
- 2025四川江油招投商业运营管理有限公司招聘6人笔试参考题库附带答案详解
- 危险气体安全培训内容课件
- 地铁信号专业安全培训
- 地铁保安安全培训内容课件
- 地质安全教育培训课件
- 危货司机安全培训简报课件
- 重症胰腺炎护理查房
- 共青团入团团章知识考试题库300题(含答案)
- 老旧护栏加固施工方案
- 2025年青海海东通信工程师考试(通信专业实务终端与业务)高、中级考前题库及答案
- 露天煤业安全生产培训课件
- 2025年全国医学基础知识试题(附答案)
- 食堂安全培训课件
- 【课件】角的概念+课件+2025-2026学年人教版(2024)七年+数学级上册+
- 2025年防雷检测专业技术人员能力认定考试题库及答案
- 《房屋市政工程生产安全重大事故隐患判定标准(2024版)》解读
- 美发裁剪理论知识培训课件
评论
0/150
提交评论