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