C程序设计教程(第二版式)1-2_第1页
C程序设计教程(第二版式)1-2_第2页
C程序设计教程(第二版式)1-2_第3页
C程序设计教程(第二版式)1-2_第4页
C程序设计教程(第二版式)1-2_第5页
已阅读5页,还剩93页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第二章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. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论