




已阅读5页,还剩78页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1 第2章数据类型与表达式 2 1C 的数据类型数据 人们记录概念和事物的符号表示 在计算机中 它以某种特定的形式存在 如整数 浮点数 字符等 数据类型 简称类型 代表一些数据的集合 同时确定了可在这些数据上施加的操作 数据结构 数据的组织形式 如数组 链表等 2 3 VC 数值型和字符型数据的字节数和数值范围 4 某种数据类型的取值范围计算 以8位二进制为例 01111111 正数 27 1 最大值 110000000 27负数在计算机中以补码的形式存在 11111111补 负数 不是最小值 对应的真值为10000000 1 110000000补是最小值 对应的真值为 11111111 1 27 5 6 我们以 1为例 来看看不同字节数的整数中 如何表达 1这个数 7 几点说明 P 20 1 整型分为短整型 一般整型 长整型 在不同的计算机上 每种类型所占用的内存空间的长度不一定相同 例如 在16位机中 short与int型占2个字节 long型占4个字节 而在32位机中 short型占2个字节 int与long型占4个字节 2 整型数据以二进制数形式存储 例如 十进制整数85的二进制形式为1010101 则在内存中的存储形式如下图所示 8 3 修饰符signed和unsigned只能修饰char和int long只能修饰int和double 一般情况下 默认的char和int为signed 实型数float和double总是有符号的 不能用unsigned修饰 如果指定为signed 则数值以补码形式存放 存储单元中的最高位 bit 用来表示数值的符号 如果指定为unsigned 则数值没有符号 全部二进制位都用来表示数值本身 9 4 浮点型数据分为float double longdouble三种 VC 6 0给float提供6位有效数字 double提供15位有效数字 longdouble提供19位有效位 5 表示其中内容可以省略 10 2 2常量 2 2 1什么是常量常量 在程序运行过程中 值不能被改变的量 常量的划分 1 从常量的类型来划分 11 2 从形式上划分 它分为字面常量和符号常量 又称标识符常量 两种表示方法 字面常量 从字面形式即可识别的常量 如12 0 3 A a constant 等都是字面常量 符号常量 符号常量是一个标识符 需事先定义 定义时需赋值且程序运行过程中不能改变 例如 definePI3 14 符号常量constinta 10 常变量 12 2 2 2数值常量 常数 1 整型常量 整数 它有十进制 八进制和十六进制三种表示 1 十进制整数十进制整数由正号 或负号 开始的 接着为首位非0的若干个十进制数字 0 9 所组成 若前缀为正号则为正数 若前缀为负号则为负数 若无符号则认为是正数 如38 25 120 74286等都是符合书写规定的十进制整数 在一个整型常量后面加一个字母l或者L 则表示longint型常量 13 2 八进制整数八进制整数由首位数字为0的后接若干个八进制数字 借用十进制数字中的0 7 所组成 如0 012 0377 04056等都是八进制整数 对应的十进制整数依次为0 10 255和 2094 3 十六进制整数十六进制整数由数字0和字母x 大 小写均可 开始的 后接若干个十六进制数字 0 9 A F或a f 所组成 如0 x0 0X25 0 x1ff 0 x30CA等都是十六进制整数 对应的十进制整数依次为0 37 511和4298 14 注意 P 21 当一个整数介于 32768与 32767范围内时 认为它是shortint型 当一个整数超出了以上范围 介于 2147483648与 2147483647范围内时 认为它是longint型 如果一个计算机系统的C 版本确定int与longint型数据在内存中占据的长度相同 则它们能够表示的数值范围相同 常量无unsigned型 15 4 在整数末尾使用u和l字母对于任一种进制的整数 若后缀有字母u 大 小写等效 则硬性规定它为一个无符号整数 unsignedint 若后缀有字母l 大 小写等效 则硬性规定它为一个长整型 longint 数 在一个整数的末尾 可以同时使用u和l 并且对排列无要求 如25U 0327UL 0 x3ffbL 648LU等都是整数 其类型依次为unsignedint unsignedlongint longint和unsignedlongint 16 2 浮点型常量 实型常量 实型常量简称实数 它有十进制的定点和浮点两种表示方法 不存在其他进制的表示 1 定点表示 十进制小数形式 定点表示的实数简称定点数 它由整数部分 小数点和小数部分组成 小数点可以处在任何一个数字位之前或之后 两个部分可以省略其中之一 但不能二者皆省略 如 12 1 2 12 0 12 12 40 3 14 02037 36 0等都是符合书写规定的定点数 17 2 浮点表示 指数形式 浮点表示的实数简称浮点数 它是由一个十进制整数或定点数后接一个字母e 大 小均可 和一个1至3位的十进制整数所组成 字母e之前的部分称为该浮点数的尾数 之后的部分成为该浮点数的指数 该浮点数的值就是它的尾数乘以10的指数幂 例如 3 25E5 3 25e 8 2E4 0 376E 15 1e 6 6 04E 12 43E0 96 e24等都是合乎规定的浮点数 它们对应的数值分别为 3 25 105 3 25 10 8 20000 0 376 10 15 10 6 6 04 1012 0 43 96 1024等 a 3 25E5 与a 0 325E6 等价 18 说明 如果在实数之后加字母F或f 则表示此数为float型 它占用4个字节的存储空间 如果加字母L或l 则表示此数为longdouble型 缺省情况下默认为double型 它占用8个字节的存储空间 例如 3 24和3 24f 虽然数值相同 但分别代表一个双精度数和一个单精度数 同样 2 78E5为一个双精度数 而 2 78E5F为一个单精度数 无论把浮点数写成小数形式还是指数形式 在内存中都是以指数形式存储的 19 2 2 3字符常量 1 普通的字符常量用单撇号括起来的一个字符 在内存中占一个字节 例如 a D 注意 字符常量只能包括一个字符 例如 AB 是不合法的 字符常量区分大小写母 例如 A 与 a 是两个不同的字符常量 单撇号 是定界符 不是字符常量的一部分 例如 cout a 输出的是一个字母a 而不是3个字符 a 20 2 转义字符常量以反斜杠 开头的字符序列 它表示将 之后的字符转换成另外的意义 例如 n 表示换行符 它不能在屏幕上显示 也无法用一个一般形式的字符表示 转义字符及其含义 P 24表2 2 21 3 字符数据在内存中的存储形式及其使用方法字符数据在内存中以ASCII码形式存储 字符数据与整型数据可以通用 只要注意其表示的范围合理 0 255 例如 inta b 正确charc 97 正确例2 1 将字符赋给整型变量 includeusingnamespacestd intmain inti j i A j B cout i j n return0 22 例2 2将小写字母转换为大写字母 includeusingnamespacestd intmain charc1 c2 c1 a c2 b c1 c1 32 字符数据与整型数据相减c2 c2 32 cout c1 c2 endl return0 23 4 字符串常量用双撇号括起来的字符序列 字符串在内存中存放以 0 作为结束标志 例如 abc 是一个字符串常量 它的长度为3 但在内存中占用4个字节 其中一个字节用于存放 0 注意 1 a 与 a 含义不同 2 abc n 字符串长度为4 在内存中占用5个字节 3 在一个字符串中最后一个字符为 表示续行符 24 2 2 4符号常量 符号常量定义格式为 预处理命令 例如 definePI3 1415926 defineNULL0 defineLength100注意 1 定义结束无分号 2 符号常量的值在程序运行过程中不能改变 也不能被赋值 3 它在预编译时用常量值来代替符号常量 define符号常量名 25 例2 3 符号常量的使用 includeusingnamespacestd definePRICE30intmain intnum total num 10 total num PRICE cout total total endl return0 26 2 3变量 2 3 1什么是变量变量 在程序运行期间其值可以改变的量 变量名与变量值的区别 变量名代表内存中的一个存储单元 在对程序编译连接时由系统给每个变量分配一个地址 变量值为该单元中存放的值 27 2 3 2变量名命名规则 标识符 identifier 用来标识变量 符号常量 函数 数组 类型等实体名字的有效字符序列 变量名命名规则 1 由字母 数字和下划线3种字符组成 且第一个字符必须是字母或下划线 2 不能是C 的关键字 系统函数名和类名 28 C 关键字 29 3 区分大小写 4 不能以数字开头 5 中间不能有空格 6 变量名中不能包含 之类的特殊符号 7 不要太长 一般不超过32个字符为宜 合法的变量名 sum average total day li ling等 非法的变量名 M D John 123 33 3G63 C liling 等 30 几种变量命名法 骆驼表示法 如果名字需要两个单词 则以小写字母开头 以后的单词都以大写字母开头 如myCar 匈牙利变量命名法 在每个变量名的前面加上若干表示类型的字符 如iMyCar表示整型变量 ipMyCar表示整型指针等 31 2 3 3定义变量 原则 先定义 后使用 格式 变量类型变量名表列 1 可以在一个语句里建立多个同一类型的变量 方法是在类型后写上多个变量名 中间用逗号隔开 例如 unsignedmyAge myWeight longarea width length 2 在同一语句里不能混合定义不同类型的变量 例如 inta charb 非法3 C 可以在程序的任何地方定义变量 只要在使用之前 32 2 3 4为变量赋初值 1 用赋值运算符 给变量赋值 例如 unsignedshortwidth width 5 赋初值2 也可以在定义时直接给变量赋值 变量的初始化 在定义的同时 赋给变量一个初始值 unsignedshortwidth 5 定义并初始化3 在定义时也可以初始化多个变量 例如 longwidth 7 length 7 4 不是所有的变量在定义时都需要初始化 例如 doublearea radius 23 5 对多个变量赋予同一初值 必须分别指定 不能连等 例如 floata b c 4 5 非法定义6 初始化不是在编译阶段完成的 是在程序运行时完成的 33 2 3 5常变量 只读变量 定义格式 例如 constdoublePI 3 1415926 constintNULL 0 constintLength 100 注意 1 定义时必须同时对它进行初始化 且以后不能改变它的值 例如 constinta a 3 非法应写成 constinta 3 2 可以用表达式对常变量初始化 例如 constintb 3 6 const 34 3 区别符号常量与常变量 共同点 都是常量 不同点 符号常量用 define定义 常变量用const定义 符号常量在预编译时用它的值代替所有的符号常量名 符号常量无类型 没有对应的存储单元 常变量具有变量的特征 有类型 有对应的存储单元 4 区别常变量与一般变量 常变量的值不能改变 而一般变量的值可以改变 35 基本数据类型例子 includeusingnamespacestd definePI3 14159voidmain constintPRICE 30 intnum total doublev r h num 10 total num PRICE cout total endl r 2 5 h 3 2 v PI r r h cout v endl 变量声明 变量 整型常量 常量声明 浮点型double常量 36 2 4C 运算符 1 算术运算符 加 减 乘 除 整除求余 自加 自减 2 关系运算符 大于 大于或等于 按位右移 按位与 按位或 按位异或 按位取反 37 5 赋值运算符 及其扩展赋值运算符 6 条件运算符 7 逗号运算符 8 指针运算符 9 引用运算符和地址运算符 10 求字节数运算符 sizeof 11 强制类型转换运算符 类型 或类型 12 成员运算符 13 指向成员的运算符 14 下标运算符 15 其他 如 函数调用运算符 38 2 5算术运算符与算术表达式 2 5 1基本的算术运算符 加法运算符 或正值运算符 如3 5 3 减法运算符 或负值运算符 如5 2 3 乘法运算符 如3 5 除法运算符 如5 3 模运算符 或称求余运算符 两侧均应为整型数据 如7 4的值为3 39 注意 两个整数相除的结果为整数 例如 5 3的结果值为1 舍去小数部分 如果除数或被除数中有一个为负值 则舍入的方向是不固定的 例如 5 3在有的C 系统上得到结果 1 有的C 系统则给出结果 2 多数编译系统采取 向零取整 的方法 即5 3的值等于1 5 3的值等于 1 取整后向零靠拢 如果参加 运算的两个数中有一个数为float型数据 则运算的结果是double型 因为C 在运算时对所有float型数据都按double型数据处理 40 2 5 2算术表达式和运算符的优先级与结合性 算术表达式 用算术运算符和括号将运算对象 也称操作数 连接起来的 符合C 语法规则的式子 其中 运算对象包括常量 变量 函数等 例如 a b c 1 5 a 优先级 先乘除后加减 在求解表达式时 先按运算符的优先级别高低次序执行 例如 a b c 相当于a b c 如果在一个运算对象两侧的运算符的优先级别相同 则按规定的 结合方向 处理 算术运算符的结合方向为 自左至右 即先左后右 例如 a b c 41 优先级与结合性 P 484 附录B 42 2 5 3表达式中各类数值型数据间的混合运算 表达式中不同类型的数据要先转换成同一类型 然后进行运算 转换由系统自动进行 转换的规则如下 43 例 假设已指定i为整型变量 f为float变量 d为double型变量 e为long型 有下面表达式 10 a i f d e运算次序为 进行10 a 的运算 先将 a 转换成整数97 运算结果为107 进行i f的运算 先将i与f都转换成double型 运算结果为double型 整数107与i f的积相加 先将整数107转换成双精度数 小数点后加若干个0 即107 000 00 结果为double型 将变量e转换成double型 d e结果为double型 将10 a i f的结果与d e的商相减 结果为double型 44 2 5 4自增和自减运算符 自增 运算符 使变量的值增1 自减 运算符 使变量的值减1 属于单目运算符 只需要一个操作对象 自增 自减运算符有前置和后置两种形式 前置运算为先自加 或自减 后引用 例如 i或 i 表示在使用i之前先使i加1或减1后置运算为先引用后自加 或自减 例如 i 或i 表示在使用i之后再使i加1或减1 45 问 若i 3 则分别执行 1 j i 2 j i 3 j i 4 j i 后i与j的值为多少 答 1 i 4 j 4 2 i 4 j 3 3 i 2 j 2 4 i 2 j 3 46 注意 自增运算符 和自减运算符 的运算对象只能是变量 不能为常量和表达式 且变量的数据类型通常为整型 自增运算符 和自减运算符 的优先级高于基本算术运算符 与正负值运算符 相同 与 的结合方向是 自右向左 自增运算符 和自减运算符 使用十分灵活 但在很多情况下可能出现歧义性 自增 减 运算符常用于循环语句中 使循环变量自动加1 也用于指针变量 使指针指向下一个地址 47 2 5 5强制类型转换运算符 强制类型转换的两种形式 1 类型名 表达式 例如 double a 将a转换成double类型 int x y 将x y的值转换成整型 float 5 3 将5 3的值转换成float型 注 如果要进行强制类型转换的对象是一个变量 该变量可以不用括号括起来 如果要进行强制类型转换的对象是一个包含多项的表达式 则表达式应该用括号括起来 例如 int x y只将x转换成整型 然后与y相加 48 2 类型名 表达式 例如 int x 或int x y 注 类型名不加括号 而变量或表达式用括号括起来 注意 1 在强制类型转换时 得到一个所需类型的中间变量 但原来变量的类型未发生变化 例如 int x 若floatx 3 6 进行强制类型运算后得到一个int型的中间变量 它的值等于3 而x原来的类型和值都不变 2 有两种类型转换 系统自动进行的类型转换 强制类型转换 49 例2 4强制类型转换 includeusingnamespacestd intmain floatx inti x 3 6 i int x cout x x i i endl return0 50 2 6赋值运算符与赋值表达式 2 6 1赋值运算符 作用 将一个数据赋给一个变量 例如 a 3 把常量3赋给变量a a 3 5 将一个表达式的值赋给一个变量 结合性 自右向左 51 2 6 2赋值过程中的类型转换 如果赋值运算符两侧的类型不一致 但都是数值型或字符型时 在赋值时会自动进行类型转换 1 将浮点型数据 包括单 双精度 赋给整型变量时 舍弃其小数部分 2 将整型数据赋给浮点型变量时 数值不变 但以指数形式存储到变量中 3 将一个double型数据赋给float变量时 要注意数值范围不能溢出 4 字符型数据赋给整型变量 将字符的ASCII码赋给整型变量 52 5 将一个int short或long型数据赋给一个char型变量 只将其低8位原封不动地送到char型变量 发生截断 例如shortinti 289 charc c i 将一个int型数据赋给一个char型变量 53 6 将signed 有符号 型数据赋给长度相同的unsigned 无符号 型变量 将存储单元内容原样照搬 连原有的符号位也作为数值一起传送 例2 5 将有符号数据传送给无符号变量 includeusingnamespacestd intmain unsignedshorta shortintb 1 a b cout a a endl return0 54 1 原 1000000000000001 1 反 1111111111111110 1 补 1111111111111111 不同类型的整型数据间的赋值原则 按存储单元中的存储形式直接传送 55 2 6 3复合的赋值运算符 复合的赋值运算符 在赋值运算符 之前加上其他运算符 例如 a 3 等价于a a 3x y 8 等价于x x y 8 x 3 等价于x x 3 56 a b 其中a为变量 b为表达式 a b 将有下划线的 a 移到 右侧 a a b 在 左侧补上变量名a 注意 如果b是包含若干项的表达式 则相当于它有括号 如 x y 3 x y 3 x x y 3 不要错认为x x y 3 57 凡是二元 二目 运算符 都可以与赋值运算符一起组合成复合赋值运算符 C 可以使用以下几种复合赋值运算符 复合运算符的优点 一是为了简化程序 使程序精炼 二是为了提高编译效率 58 2 6 4赋值表达式 1 赋值表达式 由赋值运算符将一个变量和一个表达式连接起来的式子 2 形式 3 对赋值表达式求解的过程 先求 表达式 的值 然后赋给赋值运算符左侧的变量 赋值运算符左侧的标识符称为 左值 leftvalue 简写为lvalue 注意 并不是任何对象都可以作为左值的 变量可以作为左值 而表达式a b就不能作为左值 常变量也不能作为左值 因为常变量不能被赋值 59 出现在赋值运算符右侧的表达式称为 右值 rightvalue 简写为rvalue 例如 inta 3 b c b a b是左值c b b也是右值4 赋值表达式中的 表达式 又可以是一个赋值表达式 例如 a b 5 60 下面是赋值表达式的例子a b c 5a 5 c 6 a b 4 c 6 a b 10 c 2 赋值表达式值为5 a b c值均为5 表达式值为11 a值为11 c值为6 表达式值为10 a值为10 b等于4 c等于6 表达式值为5 a等于5 b等于10 c等于2 61 请判断以下赋值表达式的正误 a 3 5 4 3a 3 5 4 3 正确 错误 62 试问 若a 12 则赋值表达式a a a a的值是多少 此赋值表达式的求解步骤如下 先进行 a a a 的运算 它相当于a a a a 12 144 132 再进行 a 132 的运算 它相当于a a 132 132 132 264 注意 用cout语句输出一个赋值表达式的值时 要将该赋值表达式用括号括起来 如果写成 cout a b 将会出现编译错误 63 2 7逗号运算符与逗号表达式 1 逗号表达式 用逗号运算符 将两个表达式连接起来构成的表达式 例如 3 5 6 82 逗号表达式的一般形式为 表达式1 表达式23 逗号表达式的求解过程 先求解表达式1 再求解表达式2 整个逗号表达式的值是表达式2的值 例如 逗号表达式a 3 5 a 4 值为60 赋值运算符的优先级高于逗号运算符 64 4 逗号表达式的一般形式可以扩展为 表达式1 表达式2 表达式3 表达式n它的值为表达式n的值 5 一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式 如 a 3 5 a 4 a 56 逗号运算符的优先级是所有运算符中级别最低的 65 比较下面两个表达式 x a与表达式的值分别是多少 x a 3 6 3 x a 3 6 a 这两个表达式的值都等于18 a 3 但是 中的x 18 x 3 注意 在用cout输出一个逗号表达式的值时 要将该逗号表达式用括号括起来 如 cout 3 5 43 6 5 67 3 endl 赋值表达式 逗号表达式 66 补充 位运算符 位运算符用于对二进制位进行运算 位运算符的操作数只能是整型或字符型的数据 不能为实型数据 运算结果为整数 各个位运算符及其优先级是 除了 以外 其余均为双目运算符 按位取反运算符 运算符是一个单目运算符 用来对一个整数的各个二进制位取反 即0变成1 1变成0 例如 35是对十进制数35 即二进制数00100011 按位取反 结果为二进制数11011100 即十进制数 36 注意 此处是用8位二进制表示数据 如果用16位 32位 64位二进制表示数据 结果都一样 67 按位与运算符 用来对两个数的每个对应的二进制数位进行与运算 如果对应的二进制位都为1 则该位结果为1 否则为0 即0 0 0 0 1 0 1 0 0 1 1 1 例如 5 7 5 又如 5 7 3 注意 参加位运算的数据如果是负数 要用补码表示 68 按位或运算符 用来对两个数的每个对应的二进制数位进行或运算 如果对应的二进制位有一个为1 则该位结果为1 即0 0 0 0 1 1 1 0 1 1 1 1 例如 5 7 7 又如 5 7 1 69 按位异或运算符 如果两个数对应二进制数位的数据相同 则该位结果为0 否则为1 即0 0 0 1 1 0 0 1 1 1 0 1 例如 5 7 2 又如 5 7 4 70 按位左移 用于将一个数的各二进制位全部左移若干位 并在最低位补0 例如 5 2 20 对于一个正整数 左移1位相当于将该数乘以2 左移2位相当于将该数乘以4 即左移n位相当于乘以2n 注意 此结论只适合于左移时没有1被移出舍去的情况 例如 127 2高位的01被移出舍去 结果并不是127乘以4 用移位方法实现整数的乘法比直接做乘法速度快 5 00000101 20000010100移出00 71 按位右移 用于将一个数的各个二进制位全部右移若干位 移出右端的低位被舍弃 左边空出的位填写原数的符号位 即用原数的第1位数据填写空白位 例如 8 2 2 又如 8 2 2 注意 数据右移1位相当于将该数除以2 右移2位相当于将该数除以4 即右移n位相当于除以2n 用移位方法实现整数的除法比直接做除法速度快 8 00001000 200000010移出00 8 11111000 补码 211111110 72 上机练习 实验2预习 不同数据类型的常量与变量的表示方法 例2 1 2 5 各种运算符的运算规则课后作业 第1次P 41第3 4题第2次P 42第5 6 7 8题 73 课堂练习 一 填空题1 字符串 字符串 占用 字节的空间 2 字符串 This sabook n 的长度为 3 在C 中存储字符串 a b c 至少需要 个字节 4 假定x和y为整型 其值分别为16和5 则x y和x y的值分别为 和 5 假定x和y为整型 其值分别为16和5 则x y和double x y的值分别为 和 6 十进制常数25对应的八进制和十六进制的C 表示为 和 答案 7 答案 15 答案 6 答案 13 答案 33 2 答案 0310 x19 74 7 执行 cout 55 045 显示在屏幕上的是 8 常数100和3 62的数据类型分别为 和 9 若x 5 y 10 则计算y x表达式后 x和y的值分别为 和 10 表达式3 4 5 6的值为 11 算术表达
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论