第6章 基本的程序语句 6.1 基本数据类型及取值范围 6.2 标识符、变量和常量 6.3 基本运算符、表达式及运算的优先级

Slides:



Advertisements
Similar presentations
5 选择结构.
Advertisements

课前回顾 数据类型 基本类型 构造类型 指针类型 空类型 常量与变量 常量及常量的类型 变量 标识符及有关规定 变量声明格式 赋值运算符.
大学程序设计技能训练(C).
C/C++语言程序设计 第二章 数据类型和表达式 龚尚福,贾澎涛主编 《C/C++语言程序设计》 西安电子科技大学出版社.
没有规矩,不成方圆。.
第二章 基本数据类型及运算 数据类型 常量与变量 不同类型数据间的转换 运算符和表达式.
C++程序设计 第二章 数据类型与表达式.
C语言实验 第一课 标题:学号+姓名.
第三讲 数据输入与输出 数据输出 数据输入.
程序设计基础.
第三章 C语言基础 学习目标: 熟练掌握:C语言的基本数据类型、运算符及表达式 掌握:常见的输入、输出函数使用方法;
第3章 最简单的C程序设计 3.1 顺序程序设计举例 3.2 数据的表现形式及其运算 3.3 C语句 3.4 数据的输入输出.
数据类型 第3章 3.1 C数据类型概述 3.2 常量 3.3 变量 3.4 基本输入与输出.
基础篇 基础知识 —C语言程序设计 学习目标 掌握C语言中三种常见的基本类型及其使用方法 掌握常见的算术运算符和表达式的使用
C语言程序设计 第三章 数据类型、运算符与表达式
第2章 数据类型与数据运算.
C语言程序设计 第四章 顺序程序设计.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
第二章 基本数据类型与输入输出.
程序设计基础 第 二 章 谌 卫 军 清华大学软件学院 2008年秋季.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
C语言程序设计基础 刘新国.
C程序设计 第三章 简单的c程序——顺序结构
第二章 Java语言基础.
第2章 数据类型、运算符和表达式.
程序设计基础 谭浩强 著 清华大学出版社.
C卓越工程师班 授课老师:龚涛 信息科学与技术学院 2016年9月 教材:《C程序员成长攻略》 网络课程网址:
C语言大学实用教程 第三章 简单的C程序设计 西南财经大学经济信息工程学院 刘家芬
目录 3.1结构化程序设计 3.2传统流程图及N-S结构化流程图 3.3C语句概述 3.4赋值语句 3.5数据输入输出函数调用语句
3 数据类型、运算符 和表达式.
第二章 数据类型、运算符与表达式.
2.1 C语言的数据类型 2.2 常量与变量 2.3 变量赋初值 2.4 各类数值型数据间的混合运算 2.5 C语言的运算符和表达式
第三章 数据类型、运算符与表达式.
第2章 数据的存储与运算 2.1 数据在计算机中是怎样存储的 2.2 整型数据的运算与分析 2.3 实型数据的运算与分析
第一章 函数与极限.
第三章 顺序结构程序设计 计算机科学学院.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
第1讲 C语言基础 要求: (1) C程序的组成 (2) C语言的标识符是如何定义的。 (3) C语言有哪些基本数据类型?各种基本数
目录 2.1数据类型 2.2常量 2.3变量 2.4库函数 2.5运算符及表达式 1.
C程序设计.
程序设计基础A(C语言) 主讲教师: 许 康 教师主页:
C程序设计.
第 二 章 数据类型、运算符与表达式.
第9章 位 运 算.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
<编程达人入门课程> 本节内容 内存的使用 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群: ,
C语言程序设计 第一章 数据类型, 运算符与表达式 第二章 顺序程序设计 第三章 选择结构程序设计 第四章 循环控制 第五章 数组.
数据类型与运算规则.
浙江长征职业技术学院—计算机与信息技术系—相方莉制作
第4章 Excel电子表格制作软件 4.4 函数(一).
C语言程序设计 李祥 QQ:
第九节 赋值运算符和赋值表达式.
C语言程序设计 李祥 QQ:
第2章 数据类型、运算符与表达式 2.1 程序设计概述
第二章 基本数据类型 ——数据的表示.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
ASP.NET实用教程 清华大学出版社 第4章 C#编程语言 教学目标 教学重点 教学过程 2019年5月5日.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
C程序设计 实验二 数据类型、运算符和表达式 第6讲
第二章 Java基本语法 讲师:复凡.
程序设计基础A(C语言) 第一章 C语言概述 主讲教师: 许 康
Chap 6 数据类型和表达式 6.1 数据的存储和基本数据类型 6.2 常量和变量 6.3 数据的输入和输出 6.4 类型转换
第3章 数据类型、运算符与表达式 3.1 程序设计概述
基本知识 数据类型、变量、常量、运算符.
数据表示 第 2 讲.
第二章 数据类型与表达式 丘志杰 电子科技大学 计算机学院 软件学院.
VFP的基本数据运算(一).
第9章 位 运 算.
第二章 简单数据类型 §2.1 数据类型概述 §2.2 变量和常量 §2.3 简单数据类型 §2.4 简单数据类型的相互转换
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

第6章 基本的程序语句 6.1 基本数据类型及取值范围 6.2 标识符、变量和常量 6.3 基本运算符、表达式及运算的优先级 6.1 基本数据类型及取值范围 6.2 标识符、变量和常量 6.3 基本运算符、表达式及运算的优先级 6.4 标准输入/ 输出函数简介 6.5 程序范例

6.1 基本数据类型及取值范围 C语言的数据类型可分为: 基本数据类型、构造数据类型、指针数据类型。

无符号长整型(unsigned long int) 无符号短整型(unsigned short int) 基本数据类型 整型(int) 字符型(char) 实型 空类型(void) 有符号整型(int) 有符号长整型(long int) 有符号短整型(short int) 无符号整型(unsigned int) 无符号长整型(unsigned long int) 无符号短整型(unsigned short int) 单精度(float) 双精度(double)

决定该类数据在内存中的存放长度、数据可执行的操作以及数据的取值范围) 1.C的数据类型: 决定该类数据在内存中的存放长度、数据可执行的操作以及数据的取值范围) 2. 基本数据类型的长度及取值范围 : 表6.1 基本数据类型在不同实现环境中的长度 实现环境 数据类型 字 节 长 度 Turbo C Borland C++ Visual C++ Dev C++ GCC char(字符型) 1 short int(短整型) 2 int(整型) 4 long int(长整型) float(单精度浮点型) double(双精度浮点型) 8 注:数据类型的长度随CPU类型和编译器的不同而不同

表6.3 基本数据类型的长度和取值范围(tc编译器,P139) 类型符 长度 取值范围 字符型 char 1 0~255 整型 int 2 -32768~32767 长整型 long int 4 -2147483648~2147483648 单精度实型 float 约±3.4*10±38 双精度实型 double 8 约±1.7*10±308 例:验证数据类型的字节长度 6-0   参考:数值数据的表示(P50) 取值范围

1.无符号整数(unsigned int) 例1:unsigned i=1 存储形式 00 00 00 00 00 00 00 01 取值范围: 0~65535

2.有符号整数(int) 例2:int i=1 存储形式 00 00 00 00 00 00 00 01 符号位 取值范围: <= 32767

例3:int i=-1 原码 10 00 00 00 00 00 00 01 原码 补码:取反+1 补码 11 11 11 11 11 11 11 11 取值范围: >= -32767 1000 0000 0000 0000  -32768

总结: 计算机储存有符号的整数时,是用该整数的补码进行储存的,0的原码、补码都是0,正数的原码、补码相同,负数的补码是它的反码加1。

表6.4 基本数据类型所占字节数及其取值范围

6.2 标识符、变量和常量 6.2.1 标识符 标识符就是一个名字,用于标志某个事物,如变量、常量、函数和其他各种用户定义的对象。是由字母、数字、下划线组成且由字母或下划线开头的字符串。

如: _sum , sum, stu_name, price30 为合法的标识符。 Number-of-moves (含有非法字符-) piece flag (含有非法字符空格) 5_6_7 (数字开头) 为不合法的标识符。

在定义标识符时应注意以下几点: 1. 为了增加可读性,应尽量"见名知意"。 如:sum,area,day,name等等 2. 应尽量避免使用容易混淆的字符。 例如: O(大写字母) o(小写字母) 0(数字) I(大写字母) l(小写字母) 1(数字) Z(大写字母) z(小写字母) 2(数字)

3.C语言区分大小写 如:Price 和 price,系统会认为是两个不同的标识符。 4.标识符的长度最长不超过32个字符 5.不能与C语言的关键字(附录A)相同,也不能与用户自定义的函数或C语言库函数同名

6.2.2 变量和常量 一、变 量 变量程序执行过程中可以不断改变其值的一种量。变量在内存中占据一定的存储单元,该存储单元里存放变量的值,在程序运行过程中其值可以被改变。 变量名 变量值 x 125 5

(通常用小写字母标识变量,大写字母标识常量) C语言中:变量须先定义(说明),后使用 变量定义形式: 类型关键字 变量名1,变量名2,…,变量名n; 如: int student; student=30; (通常用小写字母标识变量,大写字母标识常量) 则若写成student=30, 则未定义, 编译时指出其错。 可以在说明变量时赋初值 如: int i=9; int a=3,b=6,c=9;

注:变量的类型决定了变量的存储空间和取值范围,所以给变量赋值时符合该类型的取值范围 例:了解变量取值范围及C语言特性 6-0-1 

二、常 量 常量 程序运行过程中值不能被改变的量。 C语言中,有整型常量、实型常量、字符常量、字符串常量和枚举常量等。

1. 整型常量 整型常量就是整型常数。 C语言提供了三种形式: (1) 十进制 (2) 八进制: 以0开头 (3) 十六进制:以0x开头

整型常量 进制 十进制数值 123 十 0123 八 83 1*82+2*81+3*80=83 -011 八 -9 0x123 十六 291 1*162+2*161+3*160=291 -0x12 十六 -18 例:整型常量的不同进制表示法 6-0-2 

2. 实型常量 实型常量就是实数。 (1)浮点记数法: 一个实数的表示包括数字和小数点。 如: 0.126, 523.64等

一个实数的表示包括整数部分、小数点、小数部分和指数部分。 (2) 科学记数法: 一个实数的表示包括整数部分、小数点、小数部分和指数部分。 如: 12.57e-4、16e-3、1E15。 12 .57 e-4 整数部分 指数部分 小数点 小数部分 例:实型常量的两种表示法 6-0-3 

3. 字符常量 字符常量是用一对单引号括起来的单个字符。 如:‘ a ’, ‘ A ’(二者不一样), ‘ 3 ’ 等。 注意:数字3和字符‘3’的区别,前者为整型常量,占2个字节;后者为字符常量,占1个字节,‘3’的值为51。 由于C语言中的字符数据是按整数值存放的,因此,字符数据可以像整数一样在程序中参与运算。(P144表6.8) ‘A’+4 结果为:69 

例:6-1.c  在C中,字符型数据与整型数据可以相互赋值和运算。 在C中,字符常量的有效取值为0~127,因此在运算中要注意不要超过其有效范围。

4. 转义字符 转义字符:以“ \”开头后接一个字符或n个字符代表了一种特殊字符常量。(P145表6.9) 

转义字符 字符形式 功能 \n 换行 \t 横向跳格(跳到下一个输出区< 8列 >) \v 竖向跳格 \b 退格 \r 回车 \f 走纸换页 \\ 反斜杠字符“ \” \' 单引号(撇号)字符 \ddd 3位8进制数所代表的字符 2位16进制数所代表的字符 \xhh

例:6-1-1.c  注意 ① 转义字符中的字母只能是小写字母,每个转义字符只能看作一个字符。 ② 表2-12中的\r、\v和 \f对屏幕输出不起作用,但会在控制打印机输出执行时响应其操作。 ③ 在程序中,使用不可打印字符时,通常用转义字符表示。

5. 字符串常量 字符串常量是用一对双引号括起来的若干个字符。 如:“ Good Morning!”,”128.7369” 字符串存放时,在最后加上“\0” –– 空字符。

G o d M r n i g ! \0 A A \0 于是: 比较: 字符串常量“A” 和 字符常量‘A’ “A” ‘A’ ∴ 字符串长度=实际字符个数+1,但最后\0不输出. 比较: 字符串常量“A” 和 字符常量‘A’ “A” ‘A’ A A \0

6. 符号常量 C语言允许将常量定义为一个标识符,称为符号常量。 用预处理命令#define”定义符号常量: 如: #define PRICE 30 #define PI 3.1415926

例: #define PRICE 30 main ( ) { int num, total; num=10; total=num*PRICE; printf("total=%d",total); } 符号常量(一般用大写,以区分变量) 符号常量的用处: 提高可读性, 降低输入错误的可能性, 保证一致性.

6.3 基本运算符、表达式及运算优先级 C语言有丰富的运算功能,先简述之。 1. 算术运算符 +, –, , /, % , 等 2. 关系运算符 >, <, = =, > =, <=, != 3. 逻辑运算符 !, &&, ¦¦ 4. 位运算符 <<, >>, ~, ¦, ^, & 5. 赋值运算符 = 等 6. 条件运算符 ? 等 7. 逗号运算符 ,

8. 指针运算符 *, & 9. 求字节数运算符 sizeof 10. 强制类型转换运算符 (类型) 11. 分量运算符 •,  12. 下标运算符 [ ] 13. 其它运算符 如函数的调用( )

6.3.1 算术运算符 1. 基本的算术运算符 + 加法,正值 如:3+6, +3 – 减法,负值 如:6– 4, –5 6.3.1 算术运算符 1. 基本的算术运算符 + 加法,正值 如:3+6, +3 – 减法,负值 如:6– 4, –5  乘法 如:38 / 除法 如:8 / 5 % 模运算 如:7 % 4 的值为3

注意: (1) 两个整型数据相除  –5/ 3  – 1 (结果取整) (2)有一个 float –5.0/ 3  – 1.666667 (结果为double型) (3) % 求余(取模)运算,两边须为整型数据。

2. 自增、自减运算符 + + 自增1 – – 自减1 + +i: 先使i值+1,再使用i值; 前置自增 i+ +: 先使用i值,再使i值+1; 后置自增 - - i: 先使i值-1,再使用i值; 前置自减 i - -: 先使用i值,再使i值-1. 后置自减

如:(1) i=5; j=++i; 结果: (1) j=6,i=6 如:(2) i=5; j=i++; 结果: (2) j=5,i=6 注意: 自增运算符(+ +)和自减运算符(– –)只能作用于变量,不能用于常量和表达式。

有关自增/自减表达式使用中的问题说明: (1) 要慎用++、 – –运算符。 例:6-2.c  #include<stdio.h> main( ) { int i=3,j; j=(i++)+(i++)+(i++); printf("i=%d,j=%d\n",i,j); } 实际运行结果:i=6,j=9

这是因为运算时是先取i的原值:3 i+i+i=9 然后再把6赋给i值 如果表达式j=(i++)+(i++)+(i++);改为: j=(++i)+(++i)+(++i); 则运行结果: i=6, j=18 先对i进行3次自加, 结果i的值为6,然后三个i值相加为18。

如: i+++j, 究竟理解为(i++)+j还是i+(++j)? (2) 在表达式中,有的运算符为一个字符,有的为两个字符。 如: i+++j, 究竟理解为(i++)+j还是i+(++j)? 一般地: 自左至右尽可能多地将若干字符组成一个运算符。(左结合性) 例:6-3.c  #include<stdio.h> main( ) { int i=3,j=3,m; m=i+++j; printf("i=%d,j=%d,m=%d\n",i,j,m); } 对语句m=i+++j; 系统理解为m=(i++)+j; 运行结果:i=4, j=3, m=6

(3) 在函数调用时要注意参数的计算顺序, 如: int i=3; int j=3; printf("i=%d, i++=%d\n", i, i++); printf("j=%d, j++=%d", j, j++); 输出结果:i=4, i++=3 j=4, j++=3 这是因为:参数的计算顺序从右到左。

3. 算术表达式的运算 算术表达式: 用算术运算符和括号将运算对象连接起来,且符合C语法规则的式子。 运算对象: 常量、变量、函数等 优先级: ++,--, , /, %, +, – (P148 表6.10) 结合性: 同一优先级, 自左向右,为左结合性,反之为右结合性。

6.3.2 关系运算符和关系表达式 1. 关系运算符及其优先次序 C语言提供了六种关系运算符 6.3.2 关系运算符和关系表达式 1. 关系运算符及其优先次序 C语言提供了六种关系运算符 < <= > >= = = !=

优先级为: (P153 表6.12)  <、 >、 <=、 >=为同一优先级, = =、 !=为同一优先级,且前者高于后者。  关系运算符优先级低于算术运算符。  关系运算符优先级高于赋值运算符。 如下图: 算术运算符 (+、-、*、/、%) 赋值运算符 (=) 关系运算符 高 低 <、<=、>、>= = =、!=

2. 关系表达式的运算 定义:用关系运算符将两个表达式(算术、关系、逻辑、赋值、字符等表达式)连接起来的式子。 如: a>b, a+b>b+c, (a=3)>(b=5) , ' a ' > ' b ', (a>b)>(b<c) 关系表达式的结果值规定为1或0. 1 –– 结果为真 (成立) 0 –– 结果为假 (不成立)

a>b为1, a>b>c为0,所以f=0. 成立 1 b+c<a 不成立 0 d=a>b 则a>b值为1, 所以d=1. f=a>b>c a>b为1, a>b>c为0,所以f=0.

在使用关系运算符时,应注意以下几点: 1. 数学中在判别x是否在区间[a,b]时,习惯写成ax b。 在C语言中不能写成"a<=x<=b",而应写成 a<=x && x<=b &&是逻辑运算符(下一节介绍)

2. 在判定两个浮点数是否相等时,由于存储上的误差,可能会得到错误的结果。 如:1.0/15.0*3.0*5.0=1.0 数学中为恒等式 1.0/15.0*3.0*5.0 = =1.0 C语言中结果可能为假 应改为下面的形式: fabs(1.0/15.0*3.0*5.0-1)<1e-5

6.3.3 逻辑运算符和逻辑表达式 1. 逻辑运算符及其优先级 三种: && (与)、|| (或)、 ! (非) 6.3.3 逻辑运算符和逻辑表达式 1. 逻辑运算符及其优先级 三种: && (与)、|| (或)、 ! (非) 其运算规则见真值表(P154表6.14) a b !a !b a&&b a||b 真 真 假 假 真 真 真 假 假 真 假 真 假 真 真 假 假 真 假 假 真 真 假 假 总结 真变假、假变真 全真为真 全假为假

2. &&和¦ ¦低于关系运算符,!高于算术运算符 优先级定义: ! 高 && || 低 1. !(非)优先于&&(与),&&优先于¦ ¦ 即: !&& || 2. &&和¦ ¦低于关系运算符,!高于算术运算符 ! 高 算术运算符 关系运算符 && || 赋值运算符 低 例: !a&&b || x>y && c ((!a)&&b) || ((x>y)&&c)

2. 逻辑表达式 用逻辑运算符将关系表达式、逻辑量连接起来的式子–––逻辑表达式。 以下是逻辑表达式的值及具体的运算。

1. 逻辑表达式的值与关系表达式值一样,真为1,假为0。 例1: (1) a=4 则 !a 值为: 在逻辑运算中,非0值参加逻辑运算时被看成1处理. (2) a=4, b=5 a&&b为: 1 (3) a=4, b=5 a || b为: 1 例2: 计算表达式的值 5 > 3 || 2 && 8 < 4 - !0 结果:1

2. 一个逻辑表达式中的逻辑运算符并不是一定全部执行. 如: a&&b&&c. 则当a=0(假)时, b,c不需判断。当a=1,b=0,则不需判c. 又如: a || b || c. 当a=1时,b, c均不必判别。 例1: 设i=1,则执行表达式i++ || ++i后,i的值: 2 例2: 设i=1,则执行表达式--i&&i--后,i的值: 例:分析复杂逻辑表达式运算的语法规则 6-0-4  

例: 判断年号是否为闰年。 闰年必须满足下列条件中的任意一个: (1) 年号能被4整除但不能被100整除。 (2) 年号能被400整除。 设用变量year表示年号 则: 当((year%4= =0&& year% 100 !=0) || year%400= =0) 为1时,year为闰年,否则为非闰年。

如果要判别非闰年可在上述表达式前加非(!)运算符. 即: 当!( (year%4= =0 && year%100!=0) || year% 400= = 0) 为1时,year为非闰年。 或者: 当(year%4!=0) || (year%100==0 && year%400!=0) 为1时, year为非润年。

6.3.4 位运算符及其表达式 位 运 算 符 含 义 优 先 级 ~ 按位取反 高(14) & 位与 低(8) ^ 位异或 低(7) | 6.3.4 位运算符及其表达式 位运算的作用:直接对变量的二进制按位进行操作 注意:位运算只适合于整型和字符型变量。 位运算符及其含义和优先级如下: 位 运 算 符 含 义 优 先 级 ~ 按位取反 高(14) & 位与 低(8) ^ 位异或 低(7) | 位或 低(6) << 位左移 中(11) >> 位右移

1. ~ 作用:按位取反 如:a=10011010 则:~a=01100101 2. << 作用:按位左移 如:a=10011010 则:a<<2=01101000

3. >> 作用:按位右移 如:a=10011010, b=01010011 则:a>>2=11100110 (a为负数) b>>2=00010100 (b为正数) 4. & 作用:按位与(1&1=1, 1&0=0, 0&0=0) 如:a=10011010 b=01010011 则:a&b=00010010

5. | 作用:按位或(1|1=1, 1|0=1, 0|0=0) 如:a=10011010 b=01010011 则:a|b=11011011 6. ∧ 作用:按位异或(1∧1=0, 1∧0=1, 0∧0=0) 如:a=10011010 b=01010011 则:a∧b=11001001

例:计算表达式的值  x=2,y=3, 计算(x&y)<<2 的结果 结果:8

6.3.5 条件运算符 条件运算符 ? : 条件运算符为三目运算符。 一般形式: 表达式1 ? 表达式2 : 表达式3 6.3.5 条件运算符 条件运算符 ? : 条件运算符为三目运算符。 一般形式: 表达式1 ? 表达式2 : 表达式3 运算规则: 先判表达式1, 若非0,则值为表达式2的值,否则为表达式3的值。 例:取两个数中的最大值 max=a>b? a:b; 当a>b. max  a. 否则maxb

优先级和结合性: 1. 优先级 例1: max=(a>b? a:b)  max=a>b? a:b 算术运算符 高 关系运算符 ?: 赋值运算符 低 例1: max=(a>b? a:b)  max=a>b? a:b 例2: max=a>b? a:b+1  max= a>b? a:(b+1)

2. 条件运算符结合性为从右至左. 如: a>b? a:c>d ? c:d 相当于 a>b? a:(c>d? c:d) 设 a=1,b=2,c=3,d=4,则 表达式的值为:4

例: 输入一个字符,判别它是否大写字母,如果是,将它转换成小写字母;如果不是,不转换。然后输出最后得到的字符。 6-4 .c  main ( ) { char ch; scanf ("%c", &ch); printf("%c", ch); } ch=(ch>='A' && ch<='Z')? (ch+32):ch;

6.3.6 逗号运算符和逗号表达式 逗号表达式一般形式: 表达式1, 表达式2 其计算规则: 6.3.6 逗号运算符和逗号表达式 逗号表达式一般形式: 表达式1, 表达式2 其计算规则: 先计算表达式1,再计算表达式2,最后值为表达式2的值。 例:a=35, a  4 注:优先级最低 则: 先计算3  5, a15, a  4=60,结果为60。

又如: (a=35, a  4), a+5 (1) 3  5=15a (2) a  4=60 (此时a值仍未变) (3) a+5a 即 20a. 结果为20(作为逗号表达式的值) 扩展形式: 表达式1, 表达2, …,表达式n, 结果为表达式n的值

6.3.7 数据类型的转换 C语言允许双精度、单精度、整型及字符数据之间混合运算。 6.3.7 数据类型的转换 C语言允许双精度、单精度、整型及字符数据之间混合运算。 如:10+'a'+1.5–8765.1234  'b'是允许的。但有一个规则:先转换成同一类型,再计算。 有二种方法进行数据类型转换: 1. 系统自动 2. 强制

1. 系统自动转换 转换方法: double  float  高低 long  unsigned  int  char, short 图中“  ” 表示必定转换(即使是同一类型)。如'a' +' b',先转换为int。结果为 int。 图中“  ” : 表示低, 高型数据运算时,均先转换为高型。

例: 10+' a'+if –d /e 其中: i –– int f –– float d –– double e –– long 则运算时: (1) if: 转为double, 结果为double (2) d /e : 转为double (3) 10+'a': 转为int, 结果为int (4) (3)+(1) : 转为double (5) (4) - (2) 转为double

例1: 6-0-5   (数据丢失) 结论:两边类型若不一致,赋值时要进行类型转换。 转换规则: 1. [整型变量]=[实型数据] 舍弃实数的小数部分 2. [实型变量]=[整型数据] 数值不变, 以浮点数存储 

2. 强制类型转换 用强制类型转换运算符将一个算术表达式转换为所需类型。 形式: (类型名) (表达式) 例如: (double) a 将a转换为double (int) (x+y) 将x+y转换为int 注: 优先级最高 (float) (5%3) 将5%3转换为float 例2: 6-6 (较长的数据类型强制转换为较短的数据类型)

6.3.8 复杂表达式的计算顺序 C语言共有各类运算符47个,按优先级可分为11个类别共15个优先级。 6.3.8 复杂表达式的计算顺序 C语言共有各类运算符47个,按优先级可分为11个类别共15个优先级。 运算符的优先级与运算方向:P158表6.15

自反赋值运算符(复合赋值运算符) 在" ="号之前加一个其它运算符。 例: a+=3; 等价表达式: a=a+3 x=y+8; 等价表达式: x=x (y+8) x%=3; 等价表达式: x=x%3 C语言规定:凡是二目运算符均可构成复合运算符。

赋值表达式说明: <变量> = <表达式>  <表达式>又可以是一个赋值表达式。 例: x=(y=10) 相当于 y=10;x=y 由于赋值号为右结合性,于是" ( ) "可省略, 即为:x=y=10; 又: a=5+(c=6) c=6, a=11 a=(b=4)+(c=6) b=4, c=6, a=10

 赋值表达式可以包含复合的赋值运算符。 例: a + = a – =aa (设a12) 步骤: aa144. a – =a a a=a –a a=12 –144= –132 a + = –132  a = a+(–132) = –264 例: 6-0-6 (复杂表达式的计算顺序)

6.3.9 C语言基本语句结构 一. 表达式语句 表达式加上一个分号“;”. 如: i=i+1; i++; x+y; 其函数调用也可理解为表达式语句. printf (“a=%d\n”,a); 空语句 ; 任何事情都不做.

二. 复合语句 用{ } 括起来的一系列语句。 如: { z=x+y; t=z/100; printf ("%f", t); }

三. 控制语句––由控制结构组成的语句 共有5种控制语句: (1) if ( ) ~ else ~ (条件) (2) switch ( ) ~ (多分支) (3) for ( ) ~ (循环) (4) while ( ) ~ (循环) (5) do ~ while (循环) ( )表示条件, ~表示语句

四、转向控制语句––改变程序流程(结合控制语句) (1) continue ; (结束本次循环) (2) break ; (中止整个循环或switch结构) (3) goto  <标号> ; (转移) (4) return ; ( 函数返回)

6.4 基本输入/输出函数简介 C语言本身无输入/ 输出语句, 通过调用系统提供的一组标准输入/输出函数函数实现,如printf等。

6.4.1 printf 函数––格式化输出函数 C语言中使用得最多的一种输出函数,它可按格式一次输出多个不同类型的数据。 输出表列 ––– 用“ ,”号隔开的变量或表达式序列,其变量的值按对应的格式控制符所指定的格式输出。

格式控制序列–––用双引号“ ...”括起来的格式符序列。 格式控制序列由格式说明符和普通字符组成。 1. 格式说明符: 由%接格式字符组成 如: %f, %d等 2. 普通字符: 原样输出 例: a=3; b=4; printf("a=%d, b=%d", a, b);  … 结果: a=3,b=4

二、格式字符 不同类型的数据输出,用不同格式字符:(P162表6.16) 1. d格式符––十进制整数输出。 (1) %d: 按数据的实际长度输出。 (2) %md: m是字段宽度修饰符,表示输出字段宽度。若实际位数<m,左边补空格。 如: int i=12345; printf("i=%10d\ni=%d", i, i); 例 6-7 

(3) %ld: 输出长整数 例: long a=1234567; printf(" %ld", a); 如直接用%d,则将出错。 如要指定宽度, 则用%mld即可。

2. o格式符––– 按八进制形式输出. int a= –1; printf(" %d, %o", a, a); 1 1 11 11 11 11 11 11 11 – 1的补码形式 注: 连符号位一起组成八进制数输出 则输出结果: –1, 177777

3. x格式符–––以十六进制形式输出整数. 例: int a= –1; printf("%x, %o, %d”, a, a, a) 输出结果: ffff, 177777, –1

printf ("a=%d, %o,%x,%u\n", a, a, a,a); 例: main( ) { unsigned int a=65535; int b= –2; printf ("a=%d, %o,%x,%u\n", a, a, a,a); printf ("b=%d, %o,%x,%u\n", b, b, b,b); } 运行结果为: a= –1, 177777, ffff, 65535 11 11 11 11 11 11 11 11 a=65535 b= –2, 177776, fffe, 65534 11 11 11 11 11 11 11 10 b= –2

5. c格式符–––输出一个字符. char c=' a'; printf("%c", c); 注: (1) 若有一整型变量,其值在0~255之间,则可以字符形式输出. (例 6-8 ) (2) 一个字符型变量亦可以一个整型数据输出. (例 6-8 ) 也可以指定输出字符宽度和对齐方式,如: printf (“%-3c", c)

6. s格式符–––用来输出一个字符串. 例: printf("%s", "CHINA"); 结果: CHINA 允许一定的编辑即允许%ms, %–s, %m.ns, %–m.ns四种形式, 每一形式的意义如下: (1) %ms, 输出的字符串占m列,如字符串本身长度大于m,则突破m的限制,将字符串全部输出。若串长小于m,则左补空格。

(2) %–s, 对齐方式修饰符,默认右对齐,加”-”左对齐。 (3) %m.ns,输出占m列,但只取字符串中左端n个字符。这n个字符输出在m列的右侧,左补空格。 (4) %–m.ns,其中m、n含义同上,n个字符输出在m列范围的左侧,右补空格。如果n>m,则m自动取n值,即保证n个字符正常输出。 例 6-9 

7. f格式符–––以小数形式输出单、双精度实数,有以下几种形式: %f %m.nf %–m.nf %lf %f, 不指定字段宽度,由系统自动指定,使整数部分全部如数输出,并输出6位小数。 %m.nf, 指定输出的数据共占m列,其中有n位小数。如果值长度小于m,则左端补空格。 %–m.nf, 与%m.nf基本相同,只是使输出的数值向左端靠,右端补空格。 %lf, 精度型,输出double型数据。 例 6-9 

8. e格式符–––以指数形式输出单,双精度实数基本形式: %e 例: printf (" %e ", 123.456) 结果: 1.23456 e+02 可有%m.ne和%–m.ne的形式 9. g格式符––根据实数大小自动选择f格式,或e格式输出单双精度实数。

6.4.2 scanf 函数––格式化输入函数 形式: scanf(格式控制序列, 地址表列) 格式控制序列–––同printf(…..) 地址表列 –––变量的地址或字符串首地址。 用&(变量名)表示取<变量名>的地址 如:&a, &b等等。 功能: 在标准输入装置(键盘)上按指定格式 输入各种类型的数据

例: 从键盘输入三个整数并输出( 6-10 or  ) 注意:  变量地址: &变量名  “格式控制”字符串中,若还有除格式说明以外的其它字符,则在输入数据时应输入与这些字符相同的字符。如: scanf(“%d%d”,&a,&b); 12 scanf(“%d,%d”,&a,&b); 1, 2  scanf(“%d:%d:%d”,&m,&n,&p); 1:2:3  scanf(“a=%d,b=%d,c=%d”,&a,&b,&c); a=1,b=2,c=3 例: 6-10 

 用“%c”格式输入字符时, 空格和转义字符都为有效字符。 eg:scanf(“%c%c%c”,&c1,&c2,&c3); 输入: abc时

格式字符: 1. 字段宽度修饰符 例如:int a, b scanf(" %3d%3d ", &a, &b); printf("a=%d, b=%d", a, b) 则当输入123456789 后 显示: a=123, b=456 2.输入格式字符没有u和g(其他同于输出格式字符),对于输入unsigned型数据,不用%u,而用%d, %o, %x.

3. 在%后加“ *”表示跳过相应的数据 scanf("%2d %*3d%2d", &a, &b); 则当输入为12  345  67↙ 则a12 b67 4. 输入数据不能规定精度. scanf (" %7.2f ", &a);是错误的

6.4.3 字符输出函数 C语言专门为字符提供了专用的字符输出函数,常用的字符输出函数:P170表6.19 函 数 原 型 函 数 功 能 int putc(int ch,FILE *stream); 将ch所对应的字符输出到stream指定的 文 件流中(stdout表示屏幕) int putch(int ch); 将缓冲区中ch所对应的字符输出到屏幕 int putchar(int ch); 将ch所对应的字符输出到屏幕 例: 了解字符函数的功能( 6-0-7  )

6.4.3 字符输入函数 C语言专门为字符提供了专用的字符输入函数,常用的字符输入函数:P171表6.20 函 数 原 型 函 数 功 能 int getc(FILE *stream); 从指定的输入流stream中读取字符(stdin表示键 盘) int getch(); 将键盘读取的字符放入缓冲区,键盘输入的字符 不显示在屏幕上 int getchar(); 将键盘读取的字符放入缓冲区,键盘输入的字符 会显示在屏幕上

注意: 1.使用getch()函数输入字符后,输入的字符不会显示在屏幕上。 2.用字符输入函数接收字符时,并不是从键盘输入一个字符后立即响应,而是将输入的内容先读入缓冲区,待输入结束后再一并执行。 3.与scanf()输入函数不一样,字符输入函数将空格符、制表符、换行符也作为字符接收。 例: 了解字符函数的功能( 6-0-8  )

程序举例 例1: 输入三角形三边, 求三角形面积。(6-13.c) 例2: 输入三个整数, 输出最大值。(6-14.c) 例3: 输入一个字符,用该字符组成X形状的图案。(6-15.c) 例4: 输入半径,输出圆的面积,保留小数点后两位。(6-16.c)

本章小结: 1.基本数据类型及取值范围。 不同类型的变量有不同的取值范围。 2.基本表达式的意义 算术表达式、关系表达式、逻辑表达式 3.复杂表达式的优先级和表达式的意义 任何复杂表达式都是基本表达式的组合。 4.几组输入/ 输出函数

作业: P181 题6.45,题6.50