1清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础乔 林计算机程序设计基础
Email,qiaolin@cic.tsinghua.edu.cn
Tel,62792961
2清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础第二章 基本数据类型及其运算
学习目标
– 了解数据类型的一般概念,熟悉 C 语言中的基本数据类型
– 熟悉 C 语言中常量与变量的概念,掌握定义常量与变量的方法
– 掌握 C 语言中的基本运算
– 掌握基本的输入输出函数的用法
– 了解 C 语言操作符的优先级与结合性
3清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
2.1 C 语言的数据类型
数据类型的一般概念
C 语言数据类型关系图
常 量
– 整型常量
– 实型常量
– 字符型常量与反斜杠字符常量
– 字符串常量
– 符号常量
4清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础数据类型的一般概念
确定了以值为元素的数据集
– 值的可能范围,即定义域
确定了操作(运算)集
– 不同数据类型具有不同的操作集,不同数据类型类型间也可以进行混合运算
规定了值的存储格式
– 不同类型数据在计算机中存储格式不同,相同类型数据在不同计算机与编译器下的存储格式也可能不同
数据处理的基本对象
– 常量与变量,均属于某种数据类型
5清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
C 语言数据类型关系图基本数据类型复合数据类型字符型数值型空值型整型整 型无符号整型有符号整型短整型无符号短整型有符号短整型长整型无符号长整型有符号长整型实型单精度实型双精度实型结构联合数组枚举指针数据类型
6清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础整型常量
十进制表示
– 以数字 1~9开头的 0~9序列,如 9,–876,55
十六进制表示
– 以,0x”或,0X”开头的 0~9,A/a~F/f序列,如
0x55,0x1F,0x2a
– 0x5516 = 8510
八进制表示
– 以 0开头的 0~7序列,如 055
– 0558 = 4510,注意不要与十进制混淆!
7清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础实型常量
一般形式:小数表示法
– 由整数部分、小数点与小数部分组成
– 例,3.1416,–2.718281828
指数形式:科学计数法
– 由尾数部分、字符‘ E’ /‘ e’与指数部分组成
– 例,3.14e3 = 3.14?103,–2.7E–2 = –2.7?10–2
8清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础字符型常量与反斜杠字符常量
字符型常量
– 以单引号括起来的单一字符,如‘ A’,‘ c’
– 字符常量按照其在字符集(一般为 ASCII)中的编码值存储并参与运算
反斜杠字符常量
– 以‘ \’开头,后跟字符或数字,用于表示一个特定含义的字符,例如‘ \n’表示换行字符,称为转义字符序列
– 常与普通字符混杂于某个字符串中
9清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
ASCII 码表
0 1 2 3 4 5 6 7 8 9
0 \000 \001 \002 \003 \004 \005 \006 \a \b \t
10 \n \v \f \r \016 \017 \020 \021 \022 \023
20 \024 \025 \026 \027 \030 \031 \032 \033 \034 \035
30 \036 \037 space ! " # $ % & '
40 ( ) * +,–,/ 0 1
50 2 3 4 5 6 7 8 9,;
60 < = >? @ A B C D E
70 F G H I J K L M N O
80 P Q R S T U V W X Y
90 Z [ \ ] ^ _ ` a b c
100 d e f g h i j k l m
110 n o p q r s t u v w
120 x y z { | } ~ \177
10清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础转义序列及其意义转义序列 功能与意义
\a 响铃
\b 退格
\f 换页
\n 换行
\r 返回到当前行首
\t 水平制表键
\v 垂直制表键
\0 ASCII码 0
\\ 字符‘ \’自身
\‘ 字符‘’’(仅在字符常数中需要‘ \’)
\? 字符‘?’(仅在字符串常数中需要‘ \’)
\ddd? ddd?表示八进制的该字符 ASCII码值
11清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
T s i n g h u a \0
字符串常量
字符串:以双引号括起来的一串字符
– 例:,Tsinghua”,,Programming in C”
字符串的长度:其中的字符数目
– 长度 n,占用 n+1字节,最后一个字节存储 NULL字符‘ \0’
– 例:,Tsinghua”占用 9个字节
字符串常量与字符常量不同
字符串至少占用一个字节,为什么?
\084 \115 \105 \110 \103 \104 \117 \097
12清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础符号常量
宏定义
– #define指令:预处理命令
– 例,#define PI 3.14
– 一旦定义,可以代替常量使用
– 可理解为对常量进行命名
目的与意义
– 增强程序可读性
使用有意义的名字命名
– 增强程序的可维护性
将值定义为符号常量,则程序中仅需要修改一次
#include <stdio.h>
#define PI 3.14
int main()
{
float r,area;
r = 3.0;
area = PI * r * r;
printf(?%f?,area);
return 0;
}
13清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
2.2 数据类型及变量
基本数据类型
变量及变量的定义
变量的初始化
14清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础基本数据类型
基本数据类型的分类
– 字符型,char; 整型,int; 浮点型,float; 双精度浮点型,double; 无型,void
基本数据类型的长度(位数)和取值范围与计算机和 C 编译器有关
– 整型二进制位数与 CPU长度相同;字符单字节;浮点型 4
字节;双精度浮点型 8字节
修饰符
– 有符号,signed; 无符号,unsigned; 短型,short; 长型,long
– 修饰除 void之外的其他四种基本数据类型
15清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础整数的取值范围类型标识符 位数 最小值 最大值
char 8 –128 127
unsigned char 8 0 255
signed char/char 8 –128 127
int 32 –2,147,483,648 2,147,483,647
signed int/int 32 –2,147,483,648 2,147,483,647
unsigned int 32 0 4,294,967,295
short int/short 16 –32,768 32,767
signed short int/short 16 –32,768 32,767
unsigned short int 16 0 65,535
long int/long 32 –2,147,483,648 2,147,483,647
signed long int/long 32 –2,147,483,648 2,147,483,647
unsigned long int 32 0 4,294,967,295
16清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础浮点数与无型数据的取值范围类型标识符 位数 有效位 最小值 最大负值 最小正值 最大值
float 32 7 –3.40e38 –1.18e–38 1.18e–38 3.40e38
double 64 15 –1.80e308 –2.23e–308 2.23e–308 1.80e308
long double 80 19 –1.19e4932 –3.36e–4932 3.36e–4932 1.19e4932
类型标识符 位数 最小值 最大值
void 32 不确定 不确定
17清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础变量与变量的定义
变量的定义:在程序执行过程中,其值改变的量
– 与常量的定义不同,常量在程序执行期间不可改变值
– 系统为每个变量分配合适的存储空间,以存放其值
– 保存待处理的数据,中间与最终运算结果
变量的四个基本特征,VANT
– 值( value),在任一时刻,每个变量均具有惟一值
– 地址( address),每个变量均具有惟一地址,且除非其生命结束,地址不可更改
– 名称( name),每个变量具有固定的名称或名字标识
– 类型( type),每个变量均具有确定的类型,不可更改
18清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础变量的定义与使用示例
#include <stdio.h>
int main()
{
char c;
int x,y,z;
unsigned long distance;
float m;
m = 1.11;
m = 2 * m;
m = m + 2.2;
printf(?%f\n?,m);
return 0;
}
定义三个整型变量 x,y,z
定义字符变量 c
定义无符号长整型变量 distance
定义浮点型变量 m
对浮点型变量 m进行赋值计算过程中修改 m的值再次修改 m的值输出 m的值(计算结果)
19清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础变量的初始化
在定义变量时设定初始值
char c = ‘c’;
float x,y,z = 4.53;
double a = 15.5,b = 2.0;
将 z初始化为 4.53,x,y未初始化将变量 c初始化为 ‘ c’,ASCII值
99
a,b均进行初始化
未初始化变量
– 并不意味空值
– 保持原先的位序列不变,可以参与运算,但没有意义,往往导致错误结果
20清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
2.3 运算符与表达式
运算符(操作符)与表达式概述
混合类型数据的运算
赋值语句与赋值表达式
算术运算符与算术表达式
关系运算符与关系表达式
逻辑运算符与逻辑表达式
位运算符
其他运算符与表达式
21清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础运算符与表达式概述
表达式
– 由操作符与操作数组成的序列,完成一系列的运算,得到最终的计算结果
– 表达式结果的数据类型由参与运算的操作数确定
操作数
– 常量、变量、函数调用、括号内的子表达式
操作符
– 种类繁多,意义丰富,功能强大,39个,46种
– 优先级,15级
22清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础操作符及其优先级优先级 操作符
15,[] () {函数调用 } ++{后缀 } – –{后缀 }
14 sizeof ++{前缀 } – –{前缀 } ~ ! + – &{取址 } *{引领 } (){类型转换 }
13 *{乘 } / %
12 + –
11 << >>
10 < <= > >=
9 == !=
8 &{位与 }
7 ^
6 |
5 &&
4 ||
3?,
2 = *= /= %= += –= <<= >>= &= ^= |=
1,
23清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础混合类型数据的运算
混合类型数据运算
– 表达式中的数据类型不可能总相同
– 在实际运算前将两个操作数转换成同一数据类型
类型转换
– 隐式类型转换:系统自动进行
基本原则:确保运算精度不会降低
整数提升:从短型到长型,先有符号后无符号
浮点数转换:从 float到 double再到 long double
– 显式类型转换:程序员手工进行
可简化计算,提高程序效率
格式,(类型标识符 )表达式 ;例,b = c + (int)a;
24清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础赋值语句与赋值表达式
赋值表达式
– 赋值操作符:优先级较低
– 赋值表达式的值:赋值操作符赋给目标变量的值
– 例,while( ( c = getchar() ) != EOF ){ /* < */ }
赋值语句
– 以分号结束的赋值表达式
– 格式,变量名 = 表达式; 例,b = c + (int)a;
– 赋值语句对左边变量名或等价的数组元素名实施写操作
– 右边的表达式结果若与左边的类型不同,则先转换再赋值,此时可能导致数据精度的损失
25清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础复合赋值操作符
注意事项
– 赋值操作符右边的子表达式作为整体参与运算
– 例,y *= x + 1 等价于 y = y * (x + 1)
复合赋值操作符 名称 示例 等价于
+= 加赋 y += x; y = y + x;
–= 减赋 y –= x; y = y – x;
*= 乘赋 y *= x; y = y * x;
/= 除赋 y /= x; y = y / x;
%= 余赋 y %= x; y = y % x;
26清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础算术运算符与算术表达式
基本算术运算符
– 加( +)、减( –),乘( *)、除( /)、余( %)
递增递减运算符
– 前缀:先递增递减,再参与运算
– 后缀:先参与运算,再递增递减
– 操作数必须为变量,而不能为其他表达式
算术表达式
– 例,x = ( –b + sqrt( b * b – 4 * a * c ) ) / ( 2 * a )
27清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础关系运算符与关系表达式
关系运算符
– 大于( >)、等于( ==)、小于( <)、不大于( <=)、
不小于( >=)、不等于( !=)
关系表达式
– 关系运算符与两个操作数构成的表达式
– 运算结果:真或假
– C语言以 0表示假,以非 0表示真(经常以 1表示)
示 例
– 例,x == y,’a’ < ‘b’
– 常用于条件语句,if( grade < 60 ) printf(?Fail\n?);
28清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础逻辑运算符与逻辑表达式
逻辑运算符
– 逻辑与( &&)、逻辑或( ||)、逻辑非 ( !)
逻辑表达式
– 逻辑运算符与一个或两个操作数构成的表达式
– 运算结果:真或假
x && y,若 x,y均为真,则结果为真,否则为假
x || y,若 x,y均为假,则结果为假,否则为真
!x,若 x为真,则结果为假,否则为真
复杂逻辑表达式
– 例,x > y || ’a’ < ‘b’ && 3 <= 2
– 计算时一定要留意运算符的优先级,拿不准时加括号
29清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础位运算符
位运算符:以单独的二进制位为操作对象
– 按位与( &)、按位或( |)、按位异或( ^)、
按位取反 ( ~),左移( <<)、右移( >>)
位运算表
x y x & y x | y x ^ y ~y
0 0 0 0 0 1
0 1 0 1 1 0
1 0 0 1 1 1
1 1 1 1 0 0
30清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础按位与运算
按位与:用以屏蔽某些位或取出某些位
– 示例,x = x & y,其中 x原为 0xB675,y原为 0x00FF
– x为 16位,取出低 8位,高 8位置 0
x = 0xB675 1 0 11 0 11 0 10 1 01 1 10
y = 0x00FF 0 0 00 0 00 0 11 1 11 1 11
x = x & y 1 0 11 0 11 0 10 1 01 1 100 00 00
测试指定位是否为 0
– 测试左边第 4位是否为 0,y = x & 0x1000; 结果,y为 0表示测试位为 0,否则为 1
31清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础按位或运算
按位或:用以打开某些位(将其置 1)
– 示例,x = x | y,其中 x原为 0xB675,y原为 0x00FF
– x为 16位,低 8位全置 1,高 8位不变
x = 0xB675 1 0 11 0 11 0 10 1 01 1 10
y = 0x00FF 0 0 00 0 00 0 11 1 11 1 11
x = x | y 1 0 11 0 11 0 10 1 01 1 101 1 1
32清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础按位异或运算
按位异或:用以判断两个操作数相应位是否相异
– 示例,x = x ^ y,其中 x原为 0xB675,y原为 0x00FF
– x为 16位,低 8位全置 1,高 8位不变
x = 0xB675 1 0 11 0 11 0 10 1 01 1 10
y = 0x00FF 0 0 00 0 00 0 11 1 11 1 11
x = x ^ y 1 0 11 0 11 0 10 1 01 1 1001 0 10 0 01
按位异或的本质:按位进行的不进位加法
按位异或既可使各位翻转,也可使各位保持
33清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础按位取反运算
按位取反:将单个操作数的所有位全部翻转
– 示例,x = ~x,其中 x原为 0xB675
x = 0xB675 1 0 11 0 11 0 10 1 01 1 10
x = ~x 1 0 11 0 11 0 10 1 01 1 100 1 00 1 00 1 01 0 10 0 01
34清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础移位运算符
<<(左移):相当于乘 2n,原高位舍弃,低位补 0
– 格式,操作对象 << 左移位数
– 例,y = x << n,其中 x原为 0xB675,n为 2
x = 0xB675 1 0 11 0 11 0 10 1 01 1 10
y = x << n 1 0 11 0 11 0 10 1 01 1 101 0 1 00 1 1 0 0
>>(右移):相当于除 2n,原低位舍弃,高位补 0(无符号数)或符号位(有符号数)
– 格式,操作对象 >> 右移位数
– 例,y = x >> n,其中 x原为 0xB675,n为 2
x = 0xB675 1 0 11 0 11 0 10 1 01 1 10
y = x >> n 1 0 11 0 11 0 10 1 01 1 100 0 1 0 1 01 0 11
35清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础其他运算符与表达式
条件运算符与条件表达式
– 格式,表达式 1? 表达式 2,表达式 3
– 计算过程:先计算表达式 1的值,若为真,则结果为表达式 2的值,否则为表达式 3的值
– 例,x = ( a > b )? a,b;
– 上例等价于,if( a > b ) x = a; else x = b;
逗号运算符与逗号表达式
– 以逗号连接的表达式
– 计算过程:从左到右逐个计算各个子表达式,结果为最后一个子表达式的值
– 例,z = ( x = m + n,y = m – n,x / y );
36清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础
2.4 基本输入输出函数
基本事实
– 输入输出是语言与算法必须具备的功能
– C 语言本身没有输入输出语句或命令,输入输出需使用标准库函数
– 基本输入输出函数原型位于头文件,stdio.h”中
输入输出函数
– 格式化输出函数
– 格式化输入函数
– 字符输入输出函数
37清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础格式化输出函数 printf()
格式化输出函数 printf() 调用格式
– printf(?输出格式描述字符串,,输出项列表 );
– 例,printf(?age = %d\n?,age);
%y,格式转换说明符
– %d,十进制整数; %i,十进制整数; %f,浮点数; %e:
指数形式的浮点数; %c,单个字符; %s,字符串; %u:
无符号整数; %x,十六进制整数; %o,八进制整数
– %[–]m[.n]y,?m”表示以,%y”格式输出时,数据所占用的位数(场宽),,.n”可选,表示小数点后的位数,,–”
表示数据左对齐(缺省时,数据右对齐,前补空格)
38清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础格式化输出示例
指出下述程序的运行结果
#include <stdio.h>
int main()
{
int x,y,z;
x = 10;
y = 15;
z = 25;
printf(?Results as follows:\n?);
printf(?x = %d,y = %d,z = %d\n?,x,y,z);
printf(?x + y = %d\nx + y + z = %d\n?,x + y,x + y + z);
return 0;
}
Results as follows:
x = 10,y = 15,z = 25
x + y = 25
x + y + z = 50
39清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础格式化输入函数 scanf()
格式化输入函数 scanf() 调用格式
– scanf(?输入格式描述字符串,,输入项列表 );
– 例,scanf(?%d,%c?,&age,&c);
说 明
– 输入格式转换说明符与输出格式转换说明符相同
– 用户在终端输入的数据逐一存放到输入项列表中变量所在的地址空间;对于普通变量,变量名前需添加取址操作符
– 多个输入项的分隔:格式描述串中其他字符需在输入数据时一并输入;未分隔的两个输入项在输入数据时使用空格,Tab或回车键分隔
40清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础格式化输入示例
下述程序中的数据如何输入?
#include <stdio.h>
int main()
{
char c,s[10];
int i;
float x;
scanf(?%d,%c,%f,%s?,&i,&c,&x,&s);
printf(?i = %d,c = %c,x = %f,s = %s\n?,i,c,x,s);
return 0;
}
10,a,3.14,hello<回车 >
41清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础字符输入输出函数
getchar()
– 功能:从键盘读取单个字符
– 返回值:字符类型,可赋给字符类型变量
– 例,char c; c = getchar();
putchar(c)
– 功能:向终端(一般为屏幕)输出单个字符
– 参数 c为待输出的字符类型变量,函数无返回值
– 例,char c = ‘c’; putchar(c);
42清华大学计算中心 http://learn.tsinghua.edu.cn
计算机程序设计基础作 业
第 41页:第二题(填空题)
– 第 5,6,13,14小题
第 42页:第三题(编程题)
– 第 1,4小题