




已阅读5页,还剩242页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C程序设计教程 上 林小茶 第一章 1 1程序设计语言1 2通过实例认识C程序的结构1 3C语言的标准和编译器1 4程序的调试 1 1程序设计语言 程序计算机程序是由计算机指令构成的序列 计算机程序的操作对象是 数据 程序设计语言低级语言机器语言101110001110100000000011汇编语言movax 1000高级语言a 1000a a 1 编译程序高级语言到机器语言要经过编译程序进行 翻译 编译程序的种类解释系统对高级语言编写的程序翻译一句执行一句 编译系统将高级语言编写的程序文件全部翻译成机器语言 生成可执行文件以后再执行 1 2通过实例认识C程序的结构 问候界面例1 1在屏幕上显示welcome字样 Aprogramtoprintwelcome include stdio h voidmain printf welcome 用 和 括起来的是注释行 注释行用于说明程序的功能和目的 编译系统会跳过注释行 不对其进行翻译 使用 和 括起来的语句并不一定在一行 可以是多行 以 开始的语句是预处理命令 这些命令是在编译系统翻译代码之前需要由预处理程序处理的语句 每个C程序都必须包含一个主函数main 也只能包含一个主函数 用 括起来的部分是一个程序模块 在C语言中也称为分程序 每个函数中都至少有一个分程序 C程序的执行是从主函数中的第一句开始 到主函数中的最后一句结束 分号 是C语言的执行语句和说明语句的结束符 C语句在书写上采用自由格式 但是好的程序员应该学会使用缩进格式 C语言的关键字和特定字使用小写字母 printf是C语言提供的标准输入输出库函数 计算两个整数的差例1 2计算两个整数30与20的差 并将结果在屏幕上 Thedifferencebetweenaandb include stdio h voidmain inta b difference a 30 b 20 difference a b printf Thedifferencebetweenaandbis d n difference 运行结果 Thedifferencebetweenaandbis10 分析与说明 变量的数据类型定义 变量是由程序命名的一块计算机内存区域 用来存储一个可以变化的数值 每个变量保存的是一个特定的数据类型的数值 在C语言中规定 任何变量都要经过数据类型的定义 以便在程序运行时分配相应的存储空间 直接常量 又称无名常量或文字常量 常量是在程序执行过程中不会变化的数值 直接常量就是在代码中直接书写的数值 没有名字 赋值运算符 注意 这里的 与数学上的等号在概念上完全不同 赋值运算符号最简单的用法是 赋值运算符的左边是一个变量 右边是一个常量 其功能是将右边常量的值送到左边的变量中 使变量中的内容与常量相等 例如a 30 就表示使a中的内容变为30 运算符 difference a b 表示将a的内容与b的内容相减以后 赋值到difference变量中 printf使用初步printf是一个标准输出函数 它执行格式化输出 调用格式是 printf 格式信息 数据参数1 数据参数2 数据参数可有可无 格式信息用于控制数据参数的输出格式 格式信息中字符除了冠以斜杠 和 的字符 其它字符原封不动按照原样输出到屏幕上 格式信息中的 d是转换说明 它指定了显示数据参数的格式 printf d i 表示将参数i按整型十进制输出 C语言规定 转换说明符的个数应与参数的个数相等 例如 printf d d d n x y z 格式信息中的 n是字符转义序列 n表示换行 使用自定义函数计算两个整数的差例1 3 Thedifferencebetweenaandb usingFunction include stdio h voidshow intx inty 自定义 函数说明 voidmain main函数定义 inta b a 30 b 20 show a b printf Seeyou n voidshow x y 自定义 函数定义 intx y intdifference difference x y printf Thedifferencebetweenaandbis d n difference return 运行结果 Thedifferencebetweenaandbis10 Seeyou 1 3C语言的标准和编译器 C语言的标准83ANSIC87ANSICANSI ISOstandardCISOCC99常用的C语言编译器TurboC2 0TurboC 3 0VisualC 1 4C程序的调试 调试步骤编辑源程序编译源程序连接目标程序运行可执行程序 第二章C语言的基础知识 2 1标识符 变量与常量2 2C语言的数据类型2 3运算符和表达式2 4指针类型与指针运算符 2 1标识符 变量与常量 字符集字符集是高级语言的编译系统所能识别的字母 数字 和特殊符号 每种高级语言都有自己特定的字符集合 标识符标识符是用来标识在C程序中的变量 常量 指符号常量 数据类型和函数的 通俗一点说 标识符是程序员为变量 常量或者函数起的名字 它实际上是一个字符序列 2 1 1标识符 1 大 小写英文字母 A B Z a b z 2 数字 0 1 2 9 3 运算符 6 特殊符号 7 空白符 空格符 换行符 制表符 C语言的字符集合包括 1 字母或下划线中的任一字符打头 2 在第一个字符后 可以是任意的数字 字母 下划线组成的序列 长度不超过8个 关键字 保留字 标识符的分类 特定字用户定义字 任何一个标识符必须符合下列语法规则 关键字 又称保留字 一般为小写字母 关键字是C编译程序预先登录的标识符 它们代表固定的意义 用户不能随便使用 若随便使用 可能出现意想不到的错误 编译能通过 但运行结果不对 且不容易检查错误之所在 关键字 保留字 特定字 特定字 具有特殊含义的标识符 它们虽然不是关键字 但是在习惯上把它们看成关键字 所以一般用户定义的标识符也不要使用它们 特定字包括 defineundefincludeifdefifndefendifline 用户按照语法规则定义的标识符 用户定义字可以用来标识用户自己使用的变量 符号常量 数据类型以及函数等 注意 1 不能使用关键字和特定字 2 用户定义字为了标识不同的对象 标识符的前8个 甚至7个 字符要有区别 3 标识符最好有含义 4 避免使用容易混淆的字符 如l与1 0与o z与2等 5 大 小写代表不同的意义 6 尽量不要与某个库函数同名 用户定义字 2 1 2变量 变量变量是由程序命名的一块计算机内存区域 是用来存储一个可以变化的数值 在使用一个变量之前 程序员必须为每个变量起个名字 同时还要声明它的数据类型 以便编译系统根据不同的数据类型为其静态地分配内存空间 我们称之为定义变量 定义变量的格式为 类型说明符变量名表 关于不定值 定义变量 2 1 3常量 常量在程序的执行过程中数值不会发生改变的量 无名常量 或称文字常量 a 100 100是无名常量符号常量 用预处理命令 define为常量命名 deineMAX100 2 2C语言的数据类型 整型int基本数据类型浮点型floatdouble字符型char数组以 为标志结构struct构造类型复杂数据类型联合union枚举enum指针类型以 为标志 C语言的数据类型 整型短整型shortint长整型longint普通整型int浮点型普通浮点型float双精度浮点型double字符型char 不同数据类型的数据由于其在内存的存储方式不同 存储所占的二进制位 bit 大多不相同 即使是相同类型的数据在不同种类的计算机所占位 bit 数也不完全相同 2 2 2问题的提出问题一 从键盘接收一个字符 输出该字符的按字典排列顺序的下一个字符 例如 输入a 输出b 问题二 从键盘接收两个整数 输出它们的和 问题三 从键盘接收两个浮点数 输出它们的乘积 2 2 3整型数据 整型数据在内存中的存储方式整型变量整型常量整型数据的输出整型数据的输入 在IBMPC机上 普通整型占16位 bit 短整型也占16位 bit 而长整型占32位 bit 根据整型数据所占的位数 计算一个整型数据能表示的数据的取值范围 第 位是符号位 如果符号位为0 表示是正整数 从 到15位全为1时表示的数最大 0111 1 1 21515个1则16bit能表示的最大整数是215 1 即32767 整型数据在内存中的存储方式 如果符号位为1 表示是负整数 从 到15位都为0时表示的数最小 10 0015个0在计算机中 这个数是 215的补码表示 因此 最小整数是 215 即 32768 按照整型变量所占的二进制位数来分类 short 短整型 int 普通整型 long 长整型 根据整型变量是否带符号位来分类 不带符号的整型变量带符号的整型变量无符号用关键字unsigned表示说明整型变量的语法是 限定词int变量名表 整型变量 整型常量表示 十进制表示八进制表示以数字0开头十六进制表示以数字0和x开头 inta b c a 10 b 010 c 0 x10 长整型 要在数字后加上字母L longs s 10L 整型常量 需要注意的是 如果整型常量超过机器所能表示的范围 则会发生溢出 而在C语言中的整数溢出并不会使程序出错 而是得到一个非正确的值 inta b a 10000 b 10000000 变量b的值会被系统认为是 27008 d表示把数据按十进制整型输出 o表示把数据按八进制整型输出 x表示把数据按十六进制整型输出 u表示把数据参数按无符号整型输出 注意 除了 d 其余的格式都将数据作为无符号数输出 printf ld 100000L 正确printf d 100000L 结果 31072 整型数据的输出 例2 1 include stdio h voidmain intx y z x 12 y 012 z 0 x12 printf d d d n x y z printf o o o n x y z printf x x x n x y z 运行结果 12 10 1814 12 22c a 12 例2 2输出负数 include stdio h voidmain intx y z x 12 y 012 z 0 x12 printf d d d n x y z printf o o o n x y z printf x x x n x y z 运行结果 12 10 18177764 17766 177756fff4 fff6 ffee说明 本程序中的 012和 0 x12并不是八进制和十六进制常量 实际是运算符 y 012 是取012的负数 使用 o和 x格式显示的数据是无符号数 scanf是格式输入函数 其功能是按指定的格式将标准输入设备 例如键盘 输入的内容送入变量中 scanf函数的使用格式 scanf 格式信息 输入项1 输入项2 其中 格式信息 与printf的用法相似 可以在其中使用 和转换字符来指定数据的输入方式 需要注意的是 输入项必须使用地址 普通变量的地址是在变量名前加取地址符 整型数据的输入 输入整型数据的转换字符有d o x u d表示把数据按十进制整型输入 o表示把数据按八进制整型输入 x表示把数据按十六进制整型输入 u表示把数据参数按无符号整型输入 与printf函数类似 如果希望输入的数据是长整型 需要在转换字符前加l 例2 3输入两个普通整型数 计算并输出它们的和 include stdio h voidmain intx y sum printf nPleaseentertwointegers n scanf d d 运行情况 Pleaseentertwointegers 1020 回车符 10 20 30 注意 1 scanf读入一组整数时 scanf扫视输入信息 跳过空格 tab或换行 寻找下一个输入域 一个输入域就是一个连续的非空白字符的数字串 例如 若输入为 78231920 回车符 38则输入域有四个 2 格式信息中除了有 开始的转换说明 还可以有普通字符 只是这些字符不是显示在屏幕上的 而是要求使用者在输入数据时 要在相应位置输入相同的字符 除了空格 tab或换行符 例2 4输入格式与键盘输入的匹配 include stdio h voidmain intx y sum printf nPleaseenterexpressionLikea b n scanf d d 运行程序 PleaseenterexpressionLikea b 10 20 回车符 30 假设输入的内容是 1020将会得到一个意想不到的结果 例如可能是 510scanf d d 一句要求在两个整数之间输入 号 并在第二个整数后面输入 否则 x和y接收的数据就不正确 也就是说 并没有将10和20正确地送到x和y这两个变量中 从而得出一个奇怪的结果510 例2 5输入两个普通八进制整数 计算并输出它们的和 include stdio h voidmain intx y sum printf nPleaseentertwooctalintegers n scanf o o Pleaseentertwooctalintegers 1020 回车符 010 020 0308 16 24 通过在 和转换说明符之前加整数数字就可以控制显示数字的域宽 在 后面加符号 规定显示数据在显示区域内左对齐 没有符号 数据显示时右对齐 通过控制域宽和对齐方式的目的是为了使输出的数字格式清晰明了 容易看懂 例2 6显示时整数增加域宽和左对齐 include stdio h voidmain intx y sum printf nPleaseentertwointegers n scanf d d Pleaseentertwointegers 1020 回车符 10 20 3010 20 30 2 2 4字符型数据 字符变量与字符常量使用getchar和putchar函数对字符型数据进行输入和输出使用printf和scanf函数对字符型数据进行输入和输出字符串常量 字符变量数据类型说明符char例如 charaloha beta c 一个字符变量能存储一个字节的信息 每个字符有固定的编码 最常用的就是ASCII编码 标准ASCII编码是把每个字符和与0 127的数值联系起来 用7位二进制表示 再将最高位充0 就是一个字节了 例如 在ASCII编码表中 A用数值65表示 其8位二进制表示是 01000001 字符常量C语言中的字符常量是用单引号将一个字符括起来 例如 a b 可以用字符常量为字符变量赋值 charalpha a charbeta b 注意 1 引号中的字符只能是一个字符 2 不能用双引号括起一个字符表示单个字符常量 3 非图形字符 如退格 换行等 也可以表示成字符型常量 表示方法是使用转义符 与一些特殊字符构成转义序列 例如 n 就是一个转义序列 表示 回车换行 4 字符型数据可以像整型数据一样参与四则运算 b a 198 97 1 用getchar输入字符和用putchar输出字符putchar 函数的用法putchar 是向标准输入输出设备上输出一个字符 一般的标准输出设备是屏幕终端 注意 参数是不能缺省的 另外 尽管参数可以是整型数 但参数的值最好在0 127之间 否则 输出可能是一些乱码 例2 7输出字符a include stdio h voidmain intc a i putchar c getchar 函数的用法getchar 是接收一个从标准输入输出设备上输入的字符 一般的标准输入设备是键盘 该函数没有参数 函数返回的数据类型为整型 值为字符的ASCII码值 例2 8getchar函数的用法 include stdio h voidmain charc printf nPleaseenteronechar n c getchar putchar c 运行情况1 Pleaseenteronechar a 用户输入 a 运行情况1 Pleaseenteronechar abc 用户输入 a 例2 9从键盘接收一个字符 输出该字符的按字典排列顺序的下一个字符 例如 输入a 输出b include stdio h voidmain charc printf nPleaseenteronechar n c getchar putchar c 1 或者 include stdio h voidmain printf nPleaseenteronechar n putchar getchar 1 运行情况 Pleaseenteronechar a 用户输入 b 使用printf和scanf函数对字符型数据进行输入和输出 例2 10修改例2 9 使用printf和scanf函数完成操作 include stdio h voidmain charc printf nPleaseenteronechar n scanf c 运行情况 Pleaseenteronechar a 用户输入 b 注意 使用scanf函数时 尽量不要将 c与其它转换说明一起使用 当scanf读入一组数据时 如果不使用 c做转换时 scanf扫视输入信息 跳过空格 tab或换行 寻找下一个输入域 但是若使用 c做转换时 情况则不同 scanf不会跳过空格 tab或换行 而是直接把下一个字符输入给参数 不论它是什么 例如 scanf d c 字符串常量用双引号括起来的字符序列是字符串常量 howareyou 1234 5 字符串的存储与字符不同 C编译程序在存储字符串常量时自动采用 0作为字符串结束标志 how 实际上所占的字节数是4 a 与 a 是完全不同的 前者是字符串常量 占的字节数是2 后者是字符常量 占的字节数是1 字符串常量的输出printf howareyou printf s howareyou 2 2 5浮点数 浮点数据在内存中的存储方式浮点变量与浮点常量浮点数据的输入和输出 浮点数在机器中的表示一般分为三部分 符号位 阶码 尾数 32位浮点数的有效数字的个数是7位十进制数字 取值范围为10 38 1038 64位浮点数的有效数字的个数是15位十进制数字 取值范围为10 308 10308 不同的机器可能会有一些微小的差别 浮点数据在内存中的存储方式 浮点变量单精度浮点数 float 双精度浮点数 double longdouble定义浮点变量 floata b doublec d 单精度浮点数和双精度浮点数两者在计算机上的表示方式是完全相似的 只是所占的二进制位数不同 单精度浮点数的有效数字 或称精度 和取值范围与双精度浮点数不同 浮点常量小数表示法127 3科学计数法1 273 102在C语言中 实际上也是用这两种方式 只不过102用E 2表示 C程序中的浮点常数由整数部分 小数部分 指数部分构成 浮点常量构成规则是 1 整数部分可以不写 小数部分也可以不写 但不能同时不写 2 指数部分可以省略 相当于使用小数表示法 3 若有指数部分 e 或E 两边都至少有一位数 4 指数的数字必须是整数 范围为1到3位的整数 可以为负或正 正号可以省略 例如 4 50E3 1 0 1 1234 123 4都是合法的浮点常量 注意 浮点常量在存储时按double类型存储 即占32位 bit 浮点常量也象整型常量一样 如果浮点常量超过机器所能表示的范围 则会发生溢出 浮点溢出也不会使程序出错 而是得到一个非正确的值 f显示小数表示的普通浮点数 e显示科学记数法表示的浮点数输出双精度 double 类型时 还需要在转换字符前加上字母l 输出浮点数时控制输出域宽和有效位 在 与f 或e 之间加上两个数字并在两个数字之间加一个句点 例如 10 3f表示输出格式是域宽10 有效位3 注意 域宽的含义 缺省有效位 与数据本身的域宽的关系 浮点数据输入与输出 例2 11输入两个浮点数 输出它们的和 include stdio h voidmain floatx y floatsum printf nPleaseentertworeals n scanf f f 运行情况 Pleaseentertworeals 1 2345671 234567 用户输入 1 234567 1 234567 2 469134 输出浮点数时不仅可以控制输出域宽 还可以控制有效位的输出位数 例2 12输出浮点数据 include stdio h voidmain floatx doubley x 12 3456789 y 987654 321098 printf n e le x y printf n f lf x y printf n 3f 3lf x y printf n 14 3f 14 3lf x y printf n 14 3f 14 3lf x y printf n 8 3f 8 3lf x y printf n 14f 14lf x y 2 3运算符和表达式 2 3 1表达式与简单语句2 3 2算术运算符2 3 3赋值运算符2 3 4增1 减1运算符2 3 5位逻辑运算符2 3 6逗号运算符2 3 7求字节运算符2 3 8不同数据类型数据间的混合运算2 3 9赋值表达式的类型转换 2 3 1表达式与简单语句 表达式的概念表达式是用运算符与圆括号将操作数连接起来所构成的式子 C语言的操作数包括常量 变量 函数值等 根据表达式进行运算 得到的数值即为表达式的解 表达式与简单语句在C语言中 在一个表达式的后面加上分号 就构成了简单语句 有意义的简单语句无意义的简单语句 2 3 2算术运算符 种类及运算 注意 两个整数相除 结果仍为整数 商向下取整 取模运算符 实际上是数学运算的求余数运算 其两个操作对象都必须是整数 减法运算符还可以用做单目运算符 是取负运算 其余操作符均为双目运算符 算术表达式及算术运算符的优先级算术表达式就是用算术运算符和圆括号将操作数连接起来的式子 算术表达式的解就是经过算术运算得到的表达式的值 算术运算符的优先级与数学基本相同 即先乘除 后加减 取模运算的优先级与乘除相同 函数和圆括号的优先级最高 注意 算术表达式应能正确的表达数学公式 例如 数学表达式是3 x2a相应的C语言表达式应该是什么呢 算术表达式的结果应该不超过其所能表示的数的范围 例如 最大的整型数是32767 那么 32767 3就不会是正确的结果 而32767L 3的结果是正确的 因为32767L是长整型数 算术运算符的结合性运算符的结合性是指如果一个操作数左边和右边的两个运算符的优先级相同 应该优先计算的操作符 例如 a b c操作数b左右的运算符 和 的优先级相同 那么 是先计算b c 还是先计算a b呢 C语言规定双目算术运算符的结合性是自左至右 也就是b先与左边a结合 再与右边c结合 所以是先计算a b 然后用a b的结果减c 双目运算符的结合性与数学运算并无不同 2 3 3赋值运算符 普通赋值运算符赋值表达式的一般形式是 变量名 表达式赋值语句的一般形式是 变量名 表达式 赋值运算符的优先级小于算术运算符 赋值运算符的结合性是自右至左 以a b 2为例 复合赋值运算符把赋值运算符与算术 位逻辑 移位运算符放在一起 就构成复合赋值运算符 复合算术赋值运算符有5个 还有与移位和位逻辑结合的复合赋值运算符5个 复合赋值运算符的使用规则是 Xop Y与X XopY等价 2 3 4增1 减1运算符 和 这两个运算符都是单目运算符 其功能分别是将变量自身的内容增1和减1 i和 i是前缀表示法 i 和i 是后缀表示法 如果直接在 i和i 的后面加上分号构成C的执行语句 即 i 和i 前缀与后缀并无区别 减 符号也一样 但是 将它们用在表达式中则前缀与后缀是有区别的 前缀表示法是先将i值增 减1 再在表达式中使用 而后缀表示法是先在表达式中使用i的值 再将i值增 减1 例如 i 3 i 3 j i j i 结果j的内容为3j的内容为4i的内容为4i的内容为4 注意 增1 减1运算符的操作对象是一个变量2 2以及 x y 均为非法增1 减1运算符的优先级高于算术运算符 与单目运算符 取负 逻辑非 的优先级相同 结合方向自右至左 例如表达式 i 等价于 i 副作用 printf d d i i 在不同的编译环境下结果有可能不同 尽量不要在一般的表达式中将增1 减1运算符与其它运算符混合使用 2 3 5位逻辑运算符 按位取反左移右移按位与按位或按位异或操作数在实现位操作时按二进制进行运算 7一般应为无符号型整数 按位与w3的内容可以通过下式运算 0000101000001000 按位与 00001000 结果 运算经常用于把特定位清零 屏蔽 例如 a的值为11011010 b的值为11110000 a b11011010 1111000011010000相当于把a的低4位屏蔽 高4位不变 按位或 按位或的运算规则是 0 0 00 1 11 0 11 1 1例如 charw1 w2 w3 w1 10 w2 8 w3 w1 w2 w3的内容可以通过下式运算 0000101000001000 按位或 00001010 结果 按位异或 按位或的运算规则是 0 0 00 1 11 0 11 1 0例如 charw1 w2 w3 w1 10 w2 8 w3 w1 w2 w3的内容可以通过下式运算 0000101000001000 按位异或 00000010 结果 按位取反 按位取反的规则是 0 1 1 0注意 对于位逻辑反来说 0 x7在16位机上的表示是1111111111111000即0 xfff8 但在32位机上的表示是0 xfffffff8 所以通常用 0 x7来表示7的逻辑非 而不用0 xfff8或oxfffffff8 移位运算符左移 双目运算符 运算符右边的表达式表示移位的位数 x x 2表示把x进行左移以后赋值给x 注意不能只用x 2左移可以扩大原数的倍数 左移 位扩大 倍 左移 位扩大 倍 右移可以缩小原数的倍数 右移时 若符号位为 则右边填零 若符号位为 根据机器不同分为算术移位 填充 逻辑移位 填充 2 3 6逗号运算符表达式1 表达式2逗号表达式的求值过程是 先求解表达式1 再求解表达式2 并将表达式2的解作为逗号表达式的解 例如5 6的值是6z y 3 x y 与z x y 3 是等价的逗号运算符一般用于循环for语句 不提倡使用在其它的表达式中 2 3 7求字节数运算符sizeof是一个比较特殊的单目运算符 也是一个非常有用的运算符 经常用于动态分配空间 其语法格式为 sizeof 表达式 表达式可以是变量名 常量 以及数据类型名 它的功能是 求表达式中变量名所代表的存储单元所占的字节数 或是求表达式中常量的存储单元所占的字节数 或是求表达式中的数据类型表示的数据在内存单元中所占的字节数 sizeof int 的结果是2 sizeof运算符比较灵活 同样是求整型int数据所占的字节数 可以使用三种办法 1 求sizeof int 2 求sizeof 10 3 使用inta 求sizeof a 例2 13求各种数据类型在内存中所占的字节数 include stdio h voidmain printf char dbyte n sizeof char printf shortint dbyte n sizeof shortint printf int dbyte n sizeof 10 printf longint dbyte n sizeof 10L printf float dbyte n sizeof float printf double dbyte n sizeof 2 3 printf china dbyte n sizeof china 2 3 8不同数据类型数据间的混合运算自动转换所谓 自动转换 就是系统根据规则自动将两个不同数据类型的运算对象转换成同一种数据类型的过程 而且 对某些数据类型 即使是两个运算对象的数据类型完全相同 也要做转换 例如float 强制转换在C语言中 允许程序员根据自己的意愿将一种数据类型强制转换成另一种数据类型 强制转换的格式为 数据类型名 操作对象注意 强制转换并不改变操作对象的数据类型和数值 例如 int f的确切含义是将f转换成为整型值参与运算 而f本身的数据类型和数值都没有任何改变 2 3 9赋值表达式的类型转换当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型相同时 不需要进行数据类型的转换 当赋值运算符左边的变量与赋值运算符右边的表达式的数据类型不相同时 系统负责将右边的数据类型转换成左边的数据类型 此时 会有两种情况产生 一种是转换以后会丢失数据 另一种是转换以后不会丢失数据 这与赋值号两边的表达式的数据类型所占的字节数及存储表示方式有关 详细内容自学 例2 15字符赋值给整型变量 include stdio h voidmain intc charc c B printf nc c c a A 运行结果 c b 例2 16整型变量赋值给长整型变量 include stdio h voidmain longc inta a 32763 c a printf nc ld c 运行结果 c 32763 例2 17float类型的数赋值给double类型的变量 include stdio h voidmain floatx doubley x 1 234567E 37 y x printf ny le y 运行结果 y 1 234567E 37 例2 17float类型的数赋值给double类型的变量 include stdio h voidmain floatx doubley x 1 234567E 37 y x printf ny le y 运行结果 y 1 234567E 37 2 4指针的基本概念和运算 2 4 1指针概念内存是以一个字节为单位的连续的存储空间 每个内存单元都有一个编号 称为内存地址 请看下图 变量i的地址是1000 变量i的内容是30 30 1000 i 用另一个变量记住i的地址 这个变量就是指针类型的变量 一般称为指针变量 因此 一个指针变量的值就是某个内存单元的地址 称为某内存单元的指针 30 1000 i 1000 p 用p变量记住了i的地址 p的数据类型就是指针类型 这时 我们可以称p指向变量i 或者说p是指向变量i的指针 严格地说 一个指针是一个地址 是一个常量 例如1000 2000都是指针 而一个指针变量的内容是可以变化的 是变量 但实际上为了方便 在不会引起混淆的情况下 经常把指针变量简称为指针 变量就需要在使用之前事先定义 然后才能使用 指针变量的定义格式 指针所指对象的数据类型 指针变量名1 指针变量名2 定义格式中的 表示变量是一个指针变量 int p 表示p是一个指针变量 p指向的存储单元是整型的 注意 指针变量与其他变量一样 如果是自动变量并且未赋值 指针变量的值将是不定值 如果想让p的内容是i的地址 需要做一个取地址运算 inti 定义整型变量i int p 定义指针变量p p p指向i 定义指针的目的是为了通过指针去访问内存单元 运算符 写在指针变量的前面 就是通过该指针访问它所指向的存储单元 我们在上面三条语句后面 再加上一条执行语句 变成 inti 定义整型变量i int p 定义指针变量p p 使i的内容为3 最后一句是将p指向的存储单元i的内容赋值为3 要点 1 如果有了定义int p 说明p是指针变量 也可以简称指针 p的值应该是地址 可以通过取地址运算符 指向一个存储单元 p本身要占一个存储单元 这一点经常被初学者忽略 要点 2 指针变量可以指向任何一种基本数据类型的存储单元 指向何种类型的存储单元 定义时要明确地指出 并且不能随便指向其他数据类型的变量 例如 如果有定义float q 则q只能指向单精度浮点型的数据单元 而不能指向整型数据 inti float p p 错误 上述程序段可能会引起预想不到的结果 要点 3 注意 号的不同含义 它可以作为算术运算符乘号 可以定义指针 还可以存取指针所指的存储单元的内容 例如 inti 定义整型变量i int p 定义指针变量p p 使i的内容为3 6 18 要点 4 指针只是概念上的地址 不需要关心它的具体数值 是2000还是3000 都无关紧要 因为对某个变量来说 由系统为它申请动态或静态内存 在C程序中不可直接将内存地址值赋值给一个指针变量 int p p 2000 错误 要点 5 指向相同的数据类型的指针变量可以相互赋值 指向不同类型对象的指针一般不要做相互赋值 除非做强制转换 而且有时候 强制转换也可能不能完全移植 inti int py 上面程序段执行以后 px也指向i 2 4 2指针运算符 运行结果 y 7 注意 1 使用指针运算符 和 时 必须注意运算符之间的优先级 和 是同级的 单目运算符与操作数结合方式是从右至左 d的结果就是d 2 运算符 只能用于变量或数组元素 所以 d 1 4 A A为数组名 均为非法 3 不能用运算符 取寄存器变量的地址 因为寄存器变量没有地址 4 x不能出现在赋值号的左边 例2 24分析下面程序的运行结果 include stdio h voidmain intbeta 10 int pointer q pointer 运行结果 q 50 例2 25指针作为scanf函数的参数 include stdio h voidmain intx y sum p p 第3章结构化程序设计 3 1结构化程序设计思想3 2语句与分程序3 3顺序结构程序设计3 4关系运算符与逻辑运算符3 5选择结构程序设计3 6循环结构程序设计 3 1结构化程序设计思想 3 1 1结构化程序设计思想的产生20世纪60年代 软件危机 的产生是否在程序设计中使用 goto 语句的争论CorradoB hm和GuiseppeJacopini 就证明了只要有顺序 选择和循环三种形式的控制结构 就足以导出其它各式各样的程序结构 从而在理论上奠定了结构化程序设计的基础 3 1 2结构化程序设计的三种基本结构 1 顺序结构顺序结构就是一组逐条执行的可执行语句 按照书写顺序 自上而下的执行 2 选择结构 分支结构 选择结构是一种先对给定条件进行判断 并根据判断的结果执行相应命令的结构 3 循环结构循环结构是指多次重复执行同一组命令的结构 具有循环结构的程序一般必须指定循环的终止条件 以便对程序的循环进行有效的控制 以免进入无限循环 或称死循环 的状态 C程序的执行部分由执行语句构成 执行语句的种类表达式语句函数调用语句控制语句复合语句 或称分程序 空语句 3 2语句与分程序 最简单的可执行语句 只要在表达式后面加上分号就可以了 例如 i x y 有效的表达式语句一般都要有赋值运算 否则 不做任何赋值运算的表达式大多数是无意义的 表达式语句 函数调用语句 由函数名 实际参数以及分号构成 例如 printf welcome printf是函数名 welcome 是实际参数 函数名既可以是C语言提供的库函数名 也可以是我们自己定义的函数名 控制语句 控制语句是用于控制程序流程的语句 控制语句一般指那些改变了顺序结构的语句 C语言的控制语句分支语句 if和switch 循环语句 while do while for 转向语句 break goto continue return 熟练掌握控制语句是学会程序设计的基础 复合语句和分程序结构 复合语句是用 和 把数据说明语句和若干个有序的执行语句组合在一起而构成 其一般格式为 数据说明 语句 复合语句在语法上相当于一个简单语句 在程序中可以作为一个独立语句来看待 因此又称为分程序 空语句 C语言中有一个很特殊的语句 即空语句 空语句 顾名思义 就是什么也不存在的语句 只有一个分号 尽管空语句不会有任何命令执行 但仍然是一个有用的语句 常用于循环语句中 使循环体为空 例如 for sum 0 i 0 i 9 i sum sum i 3 3顺序结构程序设计 顺序程序设计的步骤可以归纳为 1 用预处理命令包含文件或进行宏定义 不是必须的 根据具体情况 2 定义变量 分配内存空间 3 为变量赋初值 可以用赋值语句或输入函数 4 计算 5 输出结果 用输出函数 例3 1编写程序输入长方形的长和宽 求长方形的面积和周长并输出 用浮点数据处理 include stdio h voidmain doublelength width area 定义变量 printf nEnterlengthofrectangle 提示用户输入长方形的长 scanf lf 输出长方形的周长 例3 2编写程序 输入x和y 交换它们的值 并输出交换前后接收输入 swapxandy include stdio h voidmain intx y temp printf nPleaseinputtwointnumber 提示用户输入两个整数 scanf d d 输出交换以后x和y的内容 3 4关系运算符与逻辑运算符 3 4 1关系运算符所谓关系运算 实际上就是比较两个数值的大小 那么 比较两个数值的大小的运算符就是关系运算符 关系运算符有六个 由关系运算符连接起来的表达式就是关系表达式 关系表达式的解一般应为真或假 C语言用整数1表示真 整数0表示假 初学者经常会混淆关系运算符 和赋值运算符 因此要注意区分这两个运算符 例3 3 include stdio h voidmain intx y z1 z2 x 2 y 2 z1 x y z2 x y printf d d n z1 z2 六个关系运算符中的 和 的优先级小于其余四个运算符 关系运算符的优先级小于算术运算符 大于赋值运算符 关系运算符的结合性均为自左至右 当多种运算符在一个表达式中同时使用时 要注意运算符的优先级 防止记错运算符优先级的最好方法是加圆括号 3 4 2逻辑运算符 如果将 与 或 非 运算应用于逻辑值 逻辑真和逻辑假 则称为逻辑运算 C语言中的逻辑运算符有三个 逻辑与 逻辑或 和逻辑非 其中逻辑与和逻辑或是双目运算符 而逻辑非是单目运算符 逻辑运算的规则与二进制的位逻辑是相似的 逻辑运算的规则下表 C语言系统对任何非0值都认定为是逻辑真 而将0认定为逻辑假 如果一个表达式参与逻辑运算 只要这个表达式的解为非0 则系统就认为这个表达式的结果是逻辑真 但是要注意 系统逻辑运算的结果仍然只有两个 1 逻辑真 和0 逻辑假 逻辑运算符经常与关系运算符一起使用 C语言表达式 x 10 x 100 的数学含义是 10 x 100 逻辑运算符的优先级 高低 的优先级高于算术运算符 当然也高于关系运算符 和赋值运算符 和 的优先级高于赋值运算符 但是低于算术运算符和关系运算符 单目运算符 其结合性是自右至左 和 的结合性是自左至右 计算表达式79 0的值 注意 在C语言中 如果逻辑运算符的左操作数已经能够确定表达式的解 则系统不再计算右操作数的值 x 1 y 0若x此时不为1 在检测x 1以后 就不会再检测y 0 因为x 1的结果是逻辑假 逻辑假与任何数进行逻辑与操作结果都会是逻辑假 x y x 0若x y成立 则表达式的值为真 不需要继续做x 0了 但是 若x y不成立 由于x 0是个赋值表达式 表达式的结果很可能是错误的 假设该表达式计算以前 x值为 y的值为 x y的计算结果是 这时需要执行赋值x 0 表达式的结果仍然是 而实际上这时的x和y的值均为 又满足了x y 这不是产生了矛盾吗 不要在一般的表达式中夹杂赋值运算 3 5选择结构程序设计 3 5 1问题的提出3 5 2if语句的三种形式3 5 3switch语句3 5 4条件运算符3 5 5选择结构程序举例 3 5 1问题的提出 鸡蛋昨天3 30元一斤 如果今天鸡蛋3 35一斤 说明鸡蛋今天涨价了 暂时先不买鸡蛋 否则说明鸡蛋没涨价 可以买一些 编写程序 输入两个浮点数 分别表示昨天和今天的鸡蛋的单价 根据输入的数据 输出提示信息 不要买鸡蛋 或 可以买鸡蛋 这个问题用顺序结构是不能解决的 因为要根据x鸡蛋的价钱 做不同的动作 只有用选择结构才能解决问题 3 5 2if语句的三种形式 1 if形式最简单的条件语句 语法 if 表达式 语句1 下一条语句 功能 检测表达式 如果表达式的值为非0 真 则执行语句1 然后执行下一条语句 如果表达式的值为0 假 直接执行下一条语句 条件表达式 注意 1 表达式必须用圆括号括起来 不能省略 2 表达式可以使用关系表达式 例如if x 10 表示如果x大于10 也可以使用逻辑运算符连接关系表达式 例如 if a b b c 还可以是一般的表达式 甚至是一个常量或一个变量 例如 if x 和if checkstate 只要x或checkstate 的值为非0 表达式即为真 例3 4使用if形式编写程序 输入x 求出并输出x的绝对值 include stdio h abs x voidmain intx scanf d 例3 5使用if形式编写程序 若a b将两个数的位置调换 否则 保持不变 include stdio h swapaandb voidmain inta b temp scanf d d 例3 6请判断下面程序的执行结果 并解释该程序的功能 include stdio h voidmain inta 10 b 20 x x a if a b x b printf d n x 2 ifelse形式 ifelse形式的语法是 if 表达式 语句1 else语句2 下一条语句 功能 检测表达式 如果值为非0 真 则执行语句1 然后执行下一条语句 如果值为0 假 执行语句2 再执行下一条语句 例3 7编写程序 输入两个浮点数 分别表示昨天和今天的鸡蛋的单价 如果鸡蛋涨价了提示 不要买鸡蛋 否则提示 可以买鸡蛋 include stdio h priceofegg voidmain floata b printf nPleaseinputpriceofeggyesterday 提示用户输入昨天的鸡蛋单价 scanf f 输出提示今天可以买鸡蛋 例3 8编写程序 输入两个数 求两个数的商 要求除数不为零时输出商 除数为零时 提示用户输入有误 include stdio h adividedbyb voidmain inta b printf nPleaseinputtwointnumber scanf d d 例3 9将输入字符的大写字符转换成小写字符输出 小写字符原样输出 include stdio h lowercase voidmain intc c getchar if c A 例3 10请问下面程序是否能够通过编译 为什么 include stdio h max voidmain inta 30 b 20 x if a b x include stdio h max voidmain inta 30
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025授权文字作品创作合同模板
- 蒸汽洗车合同样本
- 协议书离婚再起诉
- 协议书封面排版
- 赔偿谅解协议书
- 2025企业与个人之间借款合同模板
- 2025年福建省莆田市大济镇向社会招聘1人考前自测高频考点模拟试题有完整答案详解
- 2025广西崇左天等县宁干乡卫生院招聘中医科专业技术编外工作人员2人考前自测高频考点模拟试题附答案详解(黄金题型)
- 2025合同范本昌盛金融:融资租赁合同协议书简化版
- 2025授权代购协议新范文
- 媒介素养概论 课件 第0-2章 绪论、媒介素养、媒介素养教育
- 羽毛球竞赛编排知识与方法
- 2023数据标准管理实践
- 非洲水坝施工方案
- Unit 3 Understanding ideas The Road to Success课件 2023-2024学年高中英语外研版选择性必修第一册
- 项目需求分析文档(模板)
- 长阳清江画廊
- 四川2023年专业技术人员公需科目“数字经济与驱动发展”参考答案(通用版)
- 液压泵站使用说明书
- 职工三级安全教育卡模版
- 化工企业物料编码规则物料分类清晰、编码简短、容易识别
评论
0/150
提交评论