Download presentation
Presentation is loading. Please wait.
1
C++大学基础教程 第2章 基本数据类型与表达式 北京科技大学 信息基础科学系
2
程序中最基本的元素是数据类型,根据数据类型可以为变量或常量分配内存空间,将变量、常量和运算符结合在一起组成表达式,进行复杂的运算和处理。
3
第2章 基本数据类型与表达式 2.1 词法记号和标识符 2.2 基本数据类型 2.3 变量和常量 2.4 运算符和表达式
2.5 基本输入输出
4
2.1 词法记号和标识符
5
2.1 词法记号和标识符 1、C++字符集 英文字母:A~Z,a~z 数字字符:0~9 特殊字符:
* / % ^ = < > ! # & | _ ~ \ ‘ “ ; . , ( ) [ ] { } 空格
6
2.1 词法记号和标识符 2、关键字 预先定义好的标识符,C++编译器对 其进行特殊处理。
使用VC++ 6.0的编辑环境时,缺省是蓝色的字符即为关键字。
7
2.1 词法记号和标识符 3、标识符 标识符是程序员声明的单词,它命名程序正文中的一些实体,如函数名、变量名、类名、对象名等。C++标识符的构成规则如下: 1、不能是C++的关键字; 2、第一个字符必须是大写、小写字母或下划线; 3、其他字符可以由大、小写字母、下划线或数字组成, 不能包含空格和“+、-、;”等特殊字符; 4、为方便输入,长度一般不超过31个字符。
8
2.1 词法记号和标识符 例如: 合法的标识符: apple、_Student、_123、No1、max_num 不合法的标识符:
51job、max num、-abc 注意: C++的标识符是大小写敏感的,即abc≠ABC。
9
2.1 词法记号和标识符 4、分隔符 分隔符用于分隔程序中的正文,在C++中使用下列字符作为分隔符: ( ) { } , : ;
( ) { } , : ; 这些分隔符不表示实际的操作,仅用于构造程序。比如“;”,用来作为一句完整语句的结束。
10
2.1 词法记号和标识符 5、空白 在C++语句中经常出现空白(制表符、空格、空行)等,通常都忽略不计。 如:x=a+b 或写成: x= a
11
2.2 基本数据类型
12
2.2、基本数据类型 什么是数据类型? 数据是程序处理的对象,数据根据其本身的特点进行分类,从而形成不同的数据类型。
例如:数学中有自然数、整数、实数
13
2.2、基本数据类型 C++将数据类型分成两类:基本数据类型 自定义数据类型 基本数据类型 整型:int
字符型:char 、wchar_t(双字符型) 实型:float、double 逻辑型:bool
14
2.2、基本数据类型 自定义数据类型 数组: type[] 指针: type* 引用: type& 空类型:void 结构: struct
联合: union 枚举: enum 类: class
15
注意:完整数据类型的含义 数据类型 长度(字节) 取值范围 char 1 -128~127 unsigned char 0 ~255
short int 2 -32768~32767 unsigned Short int 0~65535 int 4 -231~231-1 unsigned int 0~232-1 long unsigned long float -3.4*1038~3.4*1038 double 8 -1.7*10308~1.7*10308 long double bool 0或1 注意:完整数据类型的含义
16
2.2、基本数据类型 修饰符 在C++中为了更加准确的描述数据类型,提供了4个关键字用来修饰基本的数据类型: 1、长型 long
2、短型 short 3、有符号 signed 4、无符号 unsigned
17
1、short: 仅用来修饰int,称为短整型,占2字节内存,也可直接简写为short; 2、long: 仅修饰int和double,因为在不同的编译环境中使用long修饰的数据所占内存不同,这里列出的是在VC++6.0的环境下的。 3、unsigned: 用来修饰char、short和int,表示该数据类型为无符号数。 4、signed: 用来修饰char、short和int,表示该数据类型为有符号数,为缺省设置。
18
2.2、基本数据类型 数据类型和内存空间 不同的数据类型,加上不同的修饰符就具有了不同的特点,在内存中占用的空间也不同,因而其所能表示的数值范围也不尽相同。 内存单元的单位是字节,因此用来表示数据类型的长度的单位也是字节。
19
2.2、基本数据类型 注意 整型int的长度等于机器的字长: 16位机:int=2字节; 32位机:int=4字节。
但是short和long表示的数据长度是固定的,任何支持标准C++的编译器都是如此,因而如果需要编写可移植性好的程序,应将整型声明为short或long。
20
2.2、基本数据类型 例题 编写一个程序,输出基本数据类型char, int, float, double,bool的长度。 提示:
使用sizeof(数据类型) 能够获取不同数据类型的长度。
21
//输出基本数据类型的长度 #include <iostream> using namespace std; void main() { cout<<“char :”<<sizeof(char)<<“字节\n"; cout<<"int :"<<sizeof(int)<<"字节\n"; cout<<"float :"<<sizeof(float)<<"字节\n"; cout<<"double:"<<sizeof(double)<<"字节\n"; cout<<"bool :"<<sizeof(bool)<<"字节\n"; }
22
2.3 变量和常量
23
2.3 变量和常量 概述 程序所处理的数据不仅分为不同的数据类型,而且每种类型的数据还分为变量和常量。程序在运行中就是通过这些变量和常量来操作数据的。 什么是变量? 在C++中,变量是存储信息的地方。变量的实质是内存中的一个地址空间,在这个地址空间中可以进行数据的存储和读取。
24
2.3 变量 变量定义的格式: 数据类型 变量名1,变量名2,…变量名n; 例如:定义各种类型的变量 int num; float f;
char ch; short s; double area, length;
25
2.3 变量 说明 变量一旦被定义,则系统自动为其分配应占的内存。 在创建或定义变量时,需要指明该变量的数据类型和名称。
数据类型:决定变量的存储方式和可以进行的操作; 变量名称:用来区分不同的变量。 变量一旦被定义,则系统自动为其分配应占的内存。
26
2.3 变量 变量名称的定义遵循标识符定义的规则,实际上变量名称就是其中一种标识符。常用的命名约定有三种: 1、Unix环境常用的命名法
my_age、num_of_student 2、驼峰式命名法 myAge、numOfStudent 3、匈牙利标记法 iMyCar、ipMyCar
27
2.3 变量 赋值 使用赋值运算符“=”可以将一个值赋给变量。 例如: unsigned short age; age = 18; 或者
28
2.3 变量 我们可以一次定义多个相同数据类型的变量,也可以一次为多个变量初始化: char ch1=’a’, ch2=’b’ ;
int height=10, width=6, area ; 特性: 变量可以被多次赋值,但每次赋值后,原值都会被新值覆盖。
29
例2.2:赋值运算符的使用 using namespace std; void main() { int myAge = 18;
#include <iostream> using namespace std; void main() { int myAge = 18; cout<<“myAge=”<< myAge<<endl; myAge = 20; } 运行结果: myAge=18 myAge=20
30
2.3 常量 严格来说,常量又分成符号常量和常数。 符号常量: 代表一个固定不变值的名字; 常数: 程序中使用的具体的数据。
31
2.3 常量 符号常量 C++中提供了一个关键字const,用来区分常量和变量。并且由于常量代表一个固定的值,并且该值在程序运行过程中不能够被改变,所以要求常量在定义的时候必须进行初始化。 例如: const int i=10 ; 关键字 数据类型 常量名=初始值;
32
2.3 常量 define关键字 在C语言中使用预编译指令#define也能够定义常量。 例如: #define PI 3.1415927
关键字 常量名 值 该语句属于预编译指令,不属于C++语句,因而行尾不需要使用分号。并且由于C++是向下兼容的,因而C语言的程序能够在C++的编译器下顺利运行。但是在C++编程中,建议使用const替代#define定义常量。
33
2.3 常量 整型常数 十进制数:100 8进制数:0144 16进制数:0x64 用 U或 u表示无符号整型,如65535U 。
用 L或 l表示长整型。 默认的是int型。
34
2.3 常量 实型常数 1 小数形式 例如:0.123、23.12 2 指数形式 例如:123e5或123E5 =123*105
实常数默认为double型,而不是float。 可用后缀 F(f)表示实数常数为float型。
35
2.3 常量 字符常数 1、用单引号括起来的一个可显示字符, 例如:‘a’、 ‘?’。 2、转义字符 以\开头的字符序列,代表特殊的意义。
例如:\n、\t、\”
37
\a 0x07 bell(响铃) \n 0x0A 换行 \r 0x0D 回车 \t 0x09 制表符 \v 0x0B 垂直跳格 \b 0x08 Backspace \\ 0x5C ‘\’ \" 0x22 双引号 \‘ 0x27 单引号 \ddd 位8进数 \xhh 位16进数
38
例2.3:打印特殊字符 #include <iostream> using namespace std; void main()
{ cout<<“输出字母:”<< ‘a’<<’\a’<<endl; cout<<“输出字母:”<< ‘n’<<’\n’; } 运行结果: 输出字母:a (蜂鸣器响一声) 输出字母:n (换行)
39
2.3 常量 反斜杠还可以和八进制数或十六进制结合起来表示相应的ASCII码。表示形式如下: \ddd :1~3位八进制数
\xhh :1~2位十六进制数 我们知道在十六进制的ASCII码表中,字母’a’~’z’的ASCII值是61H~7AH,因此我们也可以使用如下两句代码替代例2.3中的输出,达到同样的结果。 cout<<“输出字母:”<< ‘\x61’<<’\x07’<<endl; cout<<“输出字母:”<< ‘\x6E’<<’\x0A’;
40
2.3 常量 字符变量 char ch1=‘a’,ch2=97, ch3=‘\064’ 原因:
在内存中,字符数据以ASCII码存储,即以整数表示,所以,C++中字符数据和整数可以相互赋值。
41
例2.4:字符数据和整型数据的转换 #include <iostream> using namespace std;
void main() { int n=’a’; char ch = 97; cout<<”输出内容:”<<n<<endl; cout<<”输出内容:”<<ch<<endl; } 运行结果: 输出内容:97 输出内容:a 注意:变量在输出时,根据其本身的数据类型进行输出。
42
2.3 常量 字符串常量 由一对双引号括起来的字符序列, 例如:“how do you do?” “hello world!”
43
2.3 常量 逻辑常数 逻辑型常数只有两个:false(假)和true(真)。在显示器上显示为0和1。
44
2.4 运算符和表达式
45
2.4 运算符和表达式 1、表达式 2、语句和块 3、运算符
赋值运算符、算术运算符、关系运算符、逻辑运算符、位运算符、条件运算符、逗号运算符
46
2.4 运算符和表达式 表达式 变量、常量是存放数据的地方,那么在C++语言中这些数据是如何处理和计算的呢?
在C++语言中将变量、常量和运算符有机结合在一起组成的就是表达式,利用表达式C++可以进行复杂的运算和处理。
47
2.4 运算符和表达式 例如: 3.2 //简单表达式,值为3.2 2+3 //常量表达式,值为5 a //简单表达式,值为变量a的值
//简单表达式,值为3.2 //常量表达式,值为5 a //简单表达式,值为变量a的值 x=(a+b)*c; //较为复杂的表达式 表达式是可以嵌套的,比如y=x=a+b,该表达式先将a和b进行相加,然后将结果赋值给x,再将x=a+b的值赋给y。
48
2.4 运算符和表达式 表达式 定义: 表达式是操作符、操作数和标点符号组成的序列。 操作符:+ - * / 等 操作数:变量、常量、数组等
标点符号:空格、回车等
49
2.4 运算符和表达式 语句和块 int temp = x; x = y; y = temp; }
C++中所有的操作运算都通过表达式来实现。由表达式和结尾的“;”组成一个C++语句;多条C++语句通过大括号{}括起来,组成一个块语句,例如: { int temp = x; x = y; y = temp; } 一般来说属于同一个逻辑关系的多条语句组成块语句。
50
2.4 运算符和表达式 运算符 运算符具有优先级和结合性。 优先级: 结合性: 级别高的先运算,级别低的后运算。例如: * / 高于 + -
级别高的先运算,级别低的后运算。例如: * / 高于 + - 结合性: 自左向右结合还是自右向左结合。例如:1+2+3,+自左向右结合。
52
2.4 运算符和表达式 运算符 根据运算符对操作数的要求不同,分成: 一元运算符: 仅需要一个操作数的运算符,例如++等 二元运算符:
需要两个操作数的运算符,例如:+、-、*、/等,形如“ 操作数1 运算符 操作数2 ” 三元运算符: 需要三个操作数的运算符,只有条件运算符“?:”。
53
2.4 运算符和表达式 学习运算符需要特别关注的问题 该运算符的优先级 该运算符的结合性 该运算符的表达式的取值 该运算符的特别事项
54
2.4 运算符和表达式 赋值运算符 1、赋值运算符就是“=” 例如:float f=3.15 2、左值:可以合法的放在“=”左边的操作数
右值:可以合法的放在“=”右边的操作数 常量都是右值,所以不能够放在“=”的左边被赋值; 变量既是左值又是右值,可以放在任何位置。
55
2.4 运算符和表达式 算术运算符 C++提供的算术运算符包括“+,-,*,/,%,++,--” 1、二元运算符:
+(加),-(减),*,/,% 2、一元运算符: +(正号),-(负号),++,--
56
2.4 运算符和表达式 算术运算符 注意: 1、“/” 根据操作数不同,运算规律也不同: 整型数为整除运算:例如5/2=2;
浮点数为通常意义的除法:即5.0/2.0=2.5。 2、“%”取余数运算符,只能对整型数进行操作,不允许对浮点数进行操作。
57
2.4 运算符和表达式 算术运算符 C++中提供了两个特殊的运算符:++,--表示将操作数减1。
++、--运算符根据操作数的位置不同,又称为前置(++i)和后置(i++) 1、前置(++i): 先自身加1,然后再将加1的值作为(++i)表达式的值; 2、后置(i++): 将i作为(i++)表达式的值,然后自身再加1。
58
例2.6:自增运算符的使用 #include <iostream> using namespace std;
void main() { int i =1; cout<<”i=”<<i<<endl; cout<<”i++:”<<i++<<endl; cout<<”i=”<<i<<endl; cout<<” ++i:”<<++i<<endl; } 1 1 2 3 3
59
2.4 运算符和表达式 算术运算符 在C++中可以将算术运算符和赋值运算符结合在一起进行运算,因此C++还提供5种复合的赋值运算符+=,-=,*=,/= 和%=。 例如: x+=y 相当于 x = x+y x-=y 相当于 x = x-y x*=y 相当于 x = x*y x/=y 相当于 x = x/y x%=y 相当于 x = x%y
60
例如: #include <iostream> using namespace std void main() {
int x=2,y=3; x*=y+8; cout<<x<<endl; } //显示22 原因:x*=y+8 等价于 x=x*(y+8)
61
2.4 运算符和表达式 算术运算符 这些运算符的优先级由高到低依次为: 1、+(正号),-(负号),++,-- 2、*,/,% 3、+、-
4、=、+=、-=、*=、/=、%=
62
2.4 运算符和表达式 注意 cout<<i<<endl; 输出结果:-25536
在进行算术运算时,很可能出现溢出,溢出是指在给一个变量赋值时超出了其数据类型表示的范围。溢出不会引起编译错误的,但运行结果会出现偏差。 例如: short int i=40000; cout<<i<<endl; 输出结果:-25536
63
2.4 运算符和表达式 关系运算符 1、>=、>、<=、< 2、==、!=
关系运算符有==、!=、>=、>、<=、<六种;这些运算符的优先级由高到低依次为: 1、>=、>、<=、< 2、==、!= 由关系运算符将两个表达式连接起来,就是关系表达式;关系表达式的结果类型为bool,值只能为true或false,屏幕显示为1或0。
64
例如 int a=1, b=2, c=3; cout<<a==b<<endl;
d=a>b==c>a+5; cout<<d<<endl; 结果false,输出为0 结果true,输出为1 结果false,输出为0 结果true,输出为1 结果true,输出为1
65
2.4 运算符和表达式 逻辑运算符 逻辑运算符有&&、||、! 三种;这些运算符的优先级由高到低依次为 1、! 2、&& 3、||
除了逻辑非,逻辑运算的级别低于关系运算。 逻辑表达式的结果类型也为bool,值只能为true或false,屏幕显示为1或0。
66
2.4 运算符和表达式 注意 如果多个表达式用&& 或 || 连接,为了提高判断效率,只要能够确定表达式的结果了,运行就不再继续。
例如: int a=1,b=2; if (a>b && b++) cout<<”b的值没有被改变。”<<endl; cout<<b<<endl; 运行结果:2
67
2.4 运算符和表达式 条件运算符 条件运算符语法格式为: 表达式1?(表达式2):(表达式3);
运算的结果是:如果表达式1的值为真,则返回表达式2的值,否则返回表达式3的值。 例1: x = a<b ? a : b; 例2: int x=0, y=1; cout<<(x>y?x:y)<<endl;
68
2.4 运算符和表达式 逗号运算符 表达式1,表达式2,……,表达式n;
逗号表达式的语法格式为: 表达式1,表达式2,……,表达式n; C++顺序计算表达式1,表达式2,……,表达式n的值,并将最后一次计算的结果作为逗号表达式的结果。 例如: int a,b,c; a=1,b=2,c=a+b;
69
例子 int a,b,c,d; d=(a=1,b=2,c=a+b,a+b+c); cout<<d<<endl; 6
70
2.4 运算符和表达式 数据类型转换 当表达式中出现多种数据类型的混合运算时,往往需要进行类型转换。表达式中的类型转换分成两种:
1、隐式类型转换 2、强制类型转换。
71
2.4 运算符和表达式 1、隐式类型转换 转换的基本原则: 将精度较低、范围较小的类型转换成精度较高、范围较大的类型。
各种二元运算符在进行运算时都要求两个操作数的数据类型一致。如果类型不一致,则系统自动对数据进行转换(隐式类型转换)。 转换的基本原则: 将精度较低、范围较小的类型转换成精度较高、范围较大的类型。 char → short → int → long → float → double
72
2.4 运算符和表达式 1、隐式类型转换 signed → unsigned。 例如: int a=100;
(1)对于同一种精度的无符号数和有符号数,在进行算术运算中,有符号数向着无符号数方向进行隐式类型转换: signed → unsigned。 例如: int a=100; unsigned int i=99; cout<<i - a<<endl 思考一下,如果将unsigned int i=99;改为unsigned short i=99;结果如何? 无符号数: 带符号数: -1
73
2.4 运算符和表达式 1、隐式类型转换 (2)逻辑运算符要求参与运算的操作数为bool类型,如果是其他类型,则系统自动将其转换成bool类型,转换规则:0为false,非0为true。 (3)赋值运算符要求“=”左右两边的操作数数据类型相同,如果类型不一致,则自动将右边的操作数类型向着左边的操作数类型转换。 例如: int i=3.15; cout<<i<<endl;
74
2.4 运算符和表达式 2、强制类型转换 强制类型转换是通过类型说明符和括号来实现的显式转换,其语法格式为: (数据类型名)表达式
或 数据类型名(表达式) 例如: int i=97; cout<<(char)i<<endl; float f=3.75; cout<<(int)f<<endl;
75
2.5 I/O流控制
76
2.5 I/O流控制 在iostream库中包含有一个标准输入流对象cin和一个标准输出流对象cout,分别用来实现从键盘读取数据,以及将数据在屏幕输出。 1、cin 2、cout 3、I/O流的格式控制
77
2.5 I/O流控制 1、标准输入流cin cin负责从键盘读取数据,使用提取操作符“>>”就可以将键盘键入的数据读入到变量中。语法格式为: cin>>变量1>>变量2…>>变量n; 例如: int a,b; char ch; cin>>a>>b>>ch;
78
2.5 I/O流控制 2、标准输出流cout cout负责将变量或常量中的数据输出到屏幕,使用插入操作符“<<”就可以将变量或常量的数据显示在屏幕上。 例如: cout<<”Hello world!\n”; cout能够自动识别“<<”后面的数据类型并进行显示,并且可以从左到右一次显示多个变量。
79
例子 #include <iostream> using namespace std; void main() {
int a,b; char ch; cout<<”请按顺序输入2整数和1字符:\n”; cin>>a>>b>>ch; cout<<”a=”<<a<<” b=”<<b<<” ch=”<<ch<<endl; }
80
2.5 I/O流控制 3、IO流的格式控制 库文件 iomanip 常用控制符: setfill(c) 设置填充字符
setw(n) 设置域宽为n
81
2.5 I/O流控制 设置输出宽度和填充字符 setw(n)
设置域宽,即设置“<<”符号后面的数据占用的屏幕宽度。只对其后输出的第一个字符有效 setfill(c) 设置填充字符,即“<<”符号后面的数据长度小于域宽时,使用什么字符进行填充。
82
setw(n) 和setfill(c) 例1:
cout<<setw(8)<<’a’<<setw(8)<<’b’<<endl; 输出结果: 例2: cout<<setfill(‘*’)<<setw(5)<<’a’<<endl; _ _ _ _ _ _ _a_ _ _ _ _ _ _b ****a
83
* ** *** **** ***** ****** ******* #include <iostream>
#include <iomanip> using namespace std; void main(){ cout<<setfill('*') <<setw(2)<<'\n' <<setw(3)<<'\n' <<setw(4)<<'\n' <<setw(5)<<'\n' <<setw(6)<<'\n' <<setw(7)<<'\n' <<setw(8)<<'\n'; } * ** *** **** ***** ****** *******
84
总结 1、基本数据类型:int,char,bool,float,double 在内存中占用的字节数及表示数的范围 2、变量和常量的定义和使用
3、运算符的优先级、结合性和运算规则? 4、数据类型如何转换? 5、标准输入输出流:cin和cout的使用
Similar presentations