第 2 章 C 语言的基本数据类型与表达 式 2. 1 C 语言的语法基础 2. 2 C 语言的基本数据类型 2. 3 常量和变量 2. 4 运算符与表达式 2. 5 数据类型转换
用 第 2 章 C 语言的基本数据类型与表达 2.1 C 语言的语法基础 2. 1. 1 C 语言字符集 式 C 语言的基本符号可分 4 个类, 归纳如下 : (1) 英文字母 : 大小写各 26 个, 共计 52 个 ;(2) 阿拉伯数 : 0 1 2 3 4 5 6 7 8 9 共 10 个数字 ; (3) 下划线 : _ ; (4) 特殊符号 : 通常由 1 ~ 2 个符号组成, 主要 来表示运算符
例如 : 算术运算符 : + - * / % ++ -- 关系运算符 : < > >= <= ==!= 逻辑运算符 : &&! 位运算符 : & ~ ^ >> < < 条件运算符 :?: 和赋值运算符 : = 其他分隔符 : ( ) [ ] { }., ;
2. 1. 2 标识符 (*) 概念 : 就是用来标识变量名 符号常量名 函数名 类型名 文件名等的有效字符序列 定义规则 : (1) 标识符只能由字母 数字和下划线三种字符组成, 且第一个字符必须为字母或下划线 如 : _1 year month student_name sum0 M. D. Jones $123 #a 3b?c a=b
(2) 在 C 语言中, 大小写字母不等效 因此, a 和 A, I 和 i, Sum 和 sum, 分别是两个不同的标识符 (3) 用户自定义的标识符不能与保留字 ( 关键字 ) 同名 保留字
2. 1. 3 关键字 概念 : 就是具有特定含义的标识符, 用户不能用来作自定义标识符 C 语言中的关键字较少, 由 ANSI 标准推荐的关键字有 32 个 常用的有 : (1) 与数据类型有关的 ( 14 ): char int float double signed unsigned short long void struct union typed ef enum sizeof
(2) 与存储类别有关的 : auto extern register static (3) 与程序控制结构有关的 ( 12 ): do while for if else switch case default goto continue break return
2.2 C 语言数据类型 d) 字符型 ( char ) 整型 ( short, i nt, l ong, unsi gne 基本类型数值类型 实型 单精度型 ( fl oat ) 双精度型 ( doubl e ) 枚举类型 ( enum) 数据类型数组类型 ( [ ] ) 构造类型结构体类型 ( struct ) 共用体类型 ( uni on) 指针类型 ( * ) 空类型 ( voi d)
2.3 常量和变量 2.3.1 常量 概念 : 在程序运行中, 其数值不能被改变的量 分类 : 直接常量和符号常量 1. 直接常量 : 是在程序中直接引用的数据 以数据的分为 : 整型 实型 字符型 字符串原形出现!
(1) 整型常量三种表现形式 : 十进制形式 : 与数学上的整数表示相同 例如 : 12, -100, 0 八进制形式 : 在数码前加数字 0 例如 : 012=1*8 1 +2*8 0 =10( 十进制 ) 十六进制形式 : 在数码前加 0X( 数字 0 和字母 X, 大小写均可 ) 例如 : 0x12=1*16 1 +2*16 0 =18( 十进制 )
注意事项 : 八进制的数码范围为 0--7 ; 则 : 018 091 0A2 都是错误的数据表示方法 十六进制的数码除了数字 0-9 外, 还使用英文字母 a-f ( 或 A-F) 表示 10-15 如 : 0x1e 0Xabcdef 0x1000 但 : 0X2defg 0x100L 都是错误的
(2) 实型常量 二种表现形式 : 十进制形式 : 由数字和小数点组成 ; 例如 : 3. 4 4.. 3 指数形式 : 由 十进制小数 - 尾数 + e( 或 E)- 底 + 十进制数整数 - 指数 三部分组成 例如 : 12. 5e-6 表示 12. 5 10-6 十进制小数 e( 或 E) 十进制数整数
注意事项 : 小数点不能单独出现 ; 如 : 0. =. 0 = 0 = 0. 0. e 或 E 的两边必须有数, 且其后面必须为整数 ; 如 : 6E0. 2 e5 6E
(3) 字符型常量二种表现形式 : 用单引号括起来的一个字符 ; 如 : ' A' ' 1' '? ' 等 用单引号括起来的由反斜杠 (\) 引导的转义字符 如 : ' \n' ' \101' ' \x41' 只能是英文的单引号 在统计字符个数时, 只能记为一个字符
转义字符表 字符形式 功能 \n 换行 \t \V 横向跳格 坚向跳格 \b \r \f \\ \ \ \ % \ddd \xhh 退格 回车换页反斜杠 单引号 双引号 百分号 8 进制数表示的 ASCI I 码对应的字符 16 进制数表示的 ASCI I 码对应的字符
一个字符的多种表示方法 : 65D( 十进制 ) =41H( 十六进制 ) =101Q( 八进制 ) 字符 A 可以表示为 ' A' ' \x41' ' \101 6 5 0x41 0101 要避免的错误 : 表示单引号 : ' ' ' 表示百分号 : ' %' 表示斜线 : ' \'
例 2.1 : main( ) { /* 注 @ 代表空格 */ printf( @@ab@c\t@de \nf \\a \n"); printf("h\ti \n"); } 设一个输出区占 8 列, 试分析输出结果 f \ a h a b c d e i
(4) 字符串型常量用双引号括起来的一个字符序列 ; 如 : ABCDEF 只能是英文的双引号 字符串常量在存储时除了存储双引号中的字符序列外, 系统还会自动在最后一个字符的后面加上转义字符 ' \0', 所以一个字符串常量在内存中所占的字节数是字符串长度加 1 如 : "chi na" 的长度为 5, 而在内存中占的字节数为 6 ' \0' 是 ASCI I 码为 0 的空操作字符, C 语言规定用 ' \0' 作为字符串的结束标志, 以便系统根据它来判断字符串是否结束
(4) 字符串型常量 字符串常量中的字符可以是转义字符, 但它只代表一个字符 如 : 字符串 "ab\n\\cd " 的长度是 6, 而不是 8 在 C 语言中没有专门的字符串类型, 需要使用字符型数组, 即用一个字符型数组来存放一个字符串, 数组中的每个单元存放该字符串中一个字符
2. 符号常量 : 概念 : 是用标识符 ( 符号 ) 来表示一个数据 特点 : 在程序中不能给它赋值 定义形式 : #defi ne 标识符常量数据 例如 : #defi ne PI 3. 14159 在程序预处理时, 凡是出现标识符 PI 的地方都将用数据 3. 14159 来替换 如 : 2*2. 3*PI 就等价于 2*2. 3*3. 14159
2.2.3 变量 基本概念 : 变量是指在程序运行中, 其值可以被改变的量 变量代表计算机内存中的某一存储空间, 该存储空间中存放的数据就是变量的值 在同一程序块中, 每个变量都有唯一的名字, 不能被重复定义 使用变量时必须 先定义, 后使用
1. 定义形式 : 类型标识符变量名 1 [, 变量名 2, 变量名 3,... ] ; 如 : int, float,char 例如 : 自己设定, 满足标识符的规定 ; 不可省 i nt a, b, c ; fl oat x, y; char c1, c2; 或 i nt c1, c2 ;
2. 整型变量 (1) 整型变量的分类 基本型, 以 i nt 表示 短整型, 以 short int 表示, 或以 short 表示 长整型, 以 l ong i nt 表示, 或以 l ong 表示 无符号型, 其中无符号型又分为无符号整型, 无符号短整型和无符号长整型, 分别以 unsi gned i nt unsi gned short unsi gned l ong 表示
内存地址 2000 2001 x short x; i nt y; y 2002 2003 2004 2005 内存
(2) 整型常量的类型 在将一个整型常量赋给一个整型变量时如何进行类型匹配?. 短整型 (short) 常量 : 其值在 -32768 - +32767 范围内, 认为它是 i nt 型, 它可以赋值给 short i nt i nt 和 l ong i nt 型变量. 整型 (i nt) 常量 : 其值在 -2147483648 - +2147483647 范围内, 如果超过此范围, 则认为它是 l ong i nt 型 它可以赋值给 i nt 和 l ong i nt 型变量
第 2 章 C 语言的基本数据类型与表达式第二章 2. 2 常量和变量. 长整型常量的表示 : 数据后加一个字母 1 或 L, 则认为是 l ong i nt 型常量. 例如 : 1231, 432L, 0L 等等 这往往用于函数调用中, 如果函数的形参为 l ong nt 型, 则要求实参也为 l ong i nt 型, 此时用 123 作实参不行, 而要用 123L 作实参 i
例 2. 2, 看看下面程序的输出是什么? main() {short int x; int x; x =32769; } printf("%d",x); 运行结果 : -32767 第 2 章 C 语言的基本数据类型与表达式第二章 2. 2 常量和变量
第 2 章 C 语言的基本数据类型与表达式第二章 2. 2 常量和变量 3. 实型变量的分类 (1) 实型变量的分类 单精度 ( fl oat ) 型 双精度 ( doubl e ) 型 占内存 有效数字位数 范围 fl oat 4 个字节 7 10-38- doubl e 8 个字节 14-15 10-308- -38-10 38-308- 10 308
内存地址 (2) 实例 2000 2003 2004 x fl oat x; y doubl e y; 2011 内存
4. 字符变量 字符变量用来存放字符常量, 注意一个字符变量只能存放一个字符 一般以一个字节来存放一个字符, 或者说一个字符变量在内存中占一个字节 例如 : char c; c= a ; c= \034 ; c= \n ; c= \x65 ; c=65;c=0101;c=0x41;
字符的值域 : 即字符的取值范围 ASCI I 字符表中的所有字符, 每个字符型数据在内存中占一个字节, 包括可显示字符和非显示字符 0-127 或 0-255
5. 变量初始化 在说明变量的同时给变量一个初始值 变量定义 分配存储空间 变量初始化 分配存储空间的同时存入数据 a? i nt a, b; b? 不确定 i nt a=1, b=2; a 1 b 2
例 2. 3 : i nt a=5, b=3; i nt a, b, c; a=b=3;
例 2.4 : #define PI 3.14159 main( ) { float s, r; } r=2; s = PI * r * r; /* 计算圆的面积, 存入变量 s */ printf("s=%f\n", s);/* 输出变量 s 的值 ( 面积 ) */ 运行结果 s=12.566360
2.4 运算符与表达式 运算符的分类 分类依据 : 运算符的功能 分类 : 算术运算符关系运算符 逻辑运算符 按位运算符 赋值运算符 其它运算符 表达式 : 是由操作数 ( 如常量 变量 表达式 : 操作数 ( 如常量 变量等 ) 和运算符运算符连接起来的式子 第 2 章 C 语言的基本数据类型与表达式
2.4.1 算术运算符和算术表达式 1. 算术运算符 +: 加法 - : 减法 * : 乘法 / : 除法 %: 取余或模 5%3=2 5/3=1 3%5=3 3+5 3-5 3*5 3/5=0 5%( -3 ) 1+1 1-1 a*b 3. =2 /5=0. 6-5%3=-2 +3-3 3/5. =0. 6-5%( -3 ) =-2
2. 算术表达式 结合性是指同级运算时运算符的结合方向 用算术运算符和括号将操作数连接起来的式子 如优先级 a#b#c : ( # 代表某一运算符 ) ( ) 若先运算 a#b, * 再将其结果与 / % c 运算 +,- 结合性称为左结合性 ; 从左至右运算规则自左向右, 与数学上一致 若先运算 b#c, 再将 a 与其结果运算, 表达式的值为数值型 : 整型 / 实型则称右结合性 从右至左运算规则
例 2. 5 : 已知 : fl oat a=2. 0; i nt b =6, c =3; 求解 : a*b/c-1. 5+ A =? 12. 0/3 4. 0-1. 5 2. 5 +65(i nt) 67. 5
3. 自增与自减运算符 ( 重点和难点 ) ++i, --i i ++, i -- (1) 单独使用时 先增 ( 减 ) 1, 再使用 i 先使用 i, 再增 ( 减 ) 1 ++i ; 等价 i ++; 等价 i =i +1; (2) j =++i ; (3) j =i ++; i =4; j =4; 若 i 的初始值为 3 i =4; j =3;
结合性 : 自右向左 例 : i = 2; j = -i+ 分析 :+; ( 1 ) ++ -- + ( 正号 ) - ( 取负 ) 是同级运算符, 结合方向 : 自右向左 ( 2 ) -i++ 等价于 - ( i++ ) ( 3 ) 对于括号内的自增运算, 又要先使用 i, 再使 i 增加 1 运算结果 : i 的值为 3, j 的值为 -2
2.4.2 关系运算符和关系表达式 1. 关系运算符 关系运算 : 比较运算, 比较两个操 作数, 看是否满足给定的关系 < : 小于, 5<3, 3<5 <= : 小于等于, 5<=3,3<=5, 与数学上 ( ) 不同 > : 大于, 5>3, 3> 5 >= : 大于等于, 5 >=3,3 >=5, 与数学上 ( ) 不同 == : 等于, 5==3, 与数学上 (=) 不同!= : 不等于, 5!=3, 与数学上 ( ) 不同
2. 关系表达式 用关系运算符将表达式连接起来的式子 优先级 算术 运算符 高低 < <= > >= 高 低 ==! = 结合方向自左向右表达式的值为逻辑量 关系成立, 即为真, 结果为 1 ; 关系不成立, 即为假, 结果为 0 ; C 语言中非 0 即为真, 0 值就是假
2.4.3 逻辑运算符和逻辑表达式 1. 逻辑运算符!: 逻辑非, 一元运算符 运算规则 : 取反, 真 假, 假 && : 逻辑与 又称逻辑乘 运算规则 : 只要两个操作数有一个为真, 结果为真 真 运算规则 : 两个操作数均为真, 结果为真 : 逻辑或 又称逻辑加
2. 逻辑表达式的值为逻辑量 1/0 非 0 值 : 真 =1 0 值 : 假 =0 整型 0 实型 0.0 0.0 字符型 \0 \0 指针类型 NULL NULL
3. 逻辑表达式 用逻辑运算符将表达式连接起来的式子 优先级! 逻辑非 高低 算术 运算符 高低 关系 运算符 高 低 && 逻辑与 高 低 逻辑或 结合性!: 自右向左 && : 自左向右
例 2.6 : i nt a=5; fl oat b=3. 5;! a 0! b 0 a&&b 1 a b 1! a&&! b 0
4. 注意 在逻辑表达式的求解中, 并不是所有的逻辑运算符都被执行, 只是在必须执行下一个逻辑运算符才能求出表达式的解时, 才执行该运算符
( 1 ) a && b && c 求解方法 : 只有 a 为真 ( 非 0 ), 才需要判断 b 的值, 只有 a 和 b 都为真, 才需要判断 c 的值 只要 a 为假, 就不必判断 b 和 c, 运算立即中止 例 2.7 : a=0; b=1; c=2; d=a && ( b++ ) && ( - -c ) ; 运算结果 : d=0,a=0,b=1,c=2
( 2 ) a b c 求解方法 : 只要 a 为真 ( 非 0 ), 就不必判断 b 和 c ; 只有 a 为假, 才判断 b ; a 和 b 都为假, 才判断 c 例 2-8 : a=0; b=1; c=2; d=a ( b++ ) ( - -c ) ; 运算结果 : d=1,a=0,b=2,c=2
2.4.4 赋值运算符和赋值表达式 1. 赋值运算符 = ( 数学上的等号 ) 功能 : 将一个表达式的值赋给一个变量变量 2. 赋值表达式 用赋值运算符将变量变量和表达式连接起来的式子形式 : < 变量 >=< 表达式 > 求值规则 : 将 = 右边表达式的值赋给左边的变量 结合性 : 自右至左
例 2.9 : ( 1 ) x=(y=12)/4 y 值为 12, x 值为 3, 表达式的值为 3 ( 2 ) x=y=12/4 y 值为 3, x 值为 3, 表达式的值为 3 ( 3 ) x=(y=12/4) (y 值为 3, x 值为 3, 表达式的值为 3 ( 4 ) (x=y)=12/4 该赋值运算符左边不是变量, 而是一个表达 第 2 章 C 语言的基本数据类型与表达式式
3. 复合赋值运算符 *= /= %= += -= <<= >>= &= Λ = = 共 10 个 由赋值运算符与算术 位移 位逻辑运算符组成 复合运算符是一个运算符, 但功能上, 是两个运算符功能的组合 例 2-10 : a+=b 相当于 a=a+b a*=b+c 相当于 a=a*(b+c) a=2; a+=a*=a;
2.4.5 其它运算符 1. 条件运算符 有两个符号 :?: :,, 它与三个操作数组成三元运算 一般形式 : < 表达式 1>? < 表达式 2>: < 表达式 3> 求值规则和表达式的值 : 求解 求解真 ( 非表达式 2 0) 求解表达式假 (0) 1 表达式 3 表达式 的值
优先级 : 逻辑 > 条件 > 赋值 结合性 : 自右至左 例 2-11 : i nt max, a=5; b=3; max=a>b?a: b --a==b++? a++ : b++ y = x>10? x/10 : x>0? x: -x ;
2. 逗号运算符 形式 : 逗号表达式 1, 逗号表达式 2,, 逗号表达式求值规则 n : 从左至右依次计算各表达式的值 优先级最低结合性 : 自左至右 表达式的值 最后一个表达式的值
例 2. 12: a b y 逗号表达式 y=a=4, b=5, a+b; 4 5 4 9 y=(a=4, b=5, a+b); 4 5 9 9 注意 : C 语言常用逗号作为分隔符, 例如 : i nt a=3, b=4, c=5; pri ntf("%d, %d, %d", (a, b, c));
3. 求字节运算符 形式 : si zeof 功能 : 变量名 si zeof ( 类型名 ) 求得变量或某种数据类型所需的字节数 运算结果 : 整型数例 2-13 : i nt a ; fl oat x ; si zeof a, si zeof x, si zeof(i nt), si zeof(fl oat)
2.5 数据类型转换 C 语言允许整型 实型 字符型数据进行混合运算 有 3 种转换方式 : 自动转换赋值转换强制转换
2. 5. 1 类型自动转换 ( 隐式转换 ) doubl e fl oat l ong i nt unsi gned i nt i nt char, short 总趋势 : 存储长度较短 存储长度较长
例 2. 14 : i nt x=2; doubl e y=1. 6; char c=' A' ; c+x*y=? 65(i nt) 2(i nt) 1. 6 (doubl e) 3. 2(doubl e) 68. 2(doubl e)
2. 5. 2 赋值转换 在赋值时, 将赋值符右边值的类型转换成与其左边变量类型一致的类型 几种情况 : (1) 实型整型 ( 字符型 ) 取整数部分, 去掉小数部分 (2) 整型 字符型实型 补足有效位 fl oat f=23; 23. 00000 ( 7 位 )
2. 5. 3 强制转换 形式 : 注意 : ( 类型名 ) 表达式 强制类型转换时, 得到所需类型的值, 原来变量的类型和值都不变 例 : i nt a=2, b=5; fl oat x=4. 4; (fl oat)b/a 2. 5 (fl oat)(b/a) 2. 0
第 2 章本章小结 1 常量的定义 变量的定义和赋值 整型 i nt short l ong 实型 fl oat doubl e 字符型 char
2 自增自减运算符 ++/-- 3 常见运算的优先级别 ( 参见附录 2) 逻辑非! 算术运算符关系运算符逻辑与 或条件运算符赋值运算符 逗号运算符 低高
第 2 章 C 语言的基本数据类型与表达式第一章 1. 3 C 语言上机操作步骤 课堂练习 实训二 课后作业