第 2章 基本数据类型、运算符与表达式
2.1 数据类型概述
2.2 常量和变量
2.3 基本类型
2.4 运算符和表达式
2.5 类型转换
2.1 数据类型概述
确定数据类型的作用有两个,
其一, 在生成数据时, 它指出应为数据分配多大的存
储空间;
其二, 它规定了数据所能进行的操作 。
数据类型是程序中最基本的元素, 确定了数据类型,
才能确定变量的空间大小和对其进行的操作, 比如,
int a; //定义一个变量 a为整型数据
这样编译器就会为 a分配 4个字节 ( 32位 ) 的内存空间 。
数据被定义了类型后, 它们可以受到类型保护, 确保不对
其进行非法操作 。
C ++在处理数据之前,要求数据具有明确的数据类型,
C ++的数据类型如图 2.1所示
C++语言程序设计 第二章 数据类型、运算符与表达式
C++




基本类型
构造类型
布尔型 bool
字符类型 char
空类型 void
整 型
实 型 单精度型 float
双精度型 double
扩展双精度型 (long double)
数组
指针
结构体 struct
共用体 union
枚举 enum
类 class
短整型 short
长整型 long
整型 int
无符号型 unsigned
数据类型决定,
1,数据占内存字节数
2,数据取值范围
3,其上可进行的操作
C++语言程序设计 第二章 基本数据类型、运算符与表达式
在 C++语言中,数据
结构是以数据类型的形
式出现的; 在程序中对
用到的所有数据必须指
定其数据类型。
C++中的数据类型分为两大类,
◆ 一类是基本数据类型,如整型、浮点类型、字
符型和布尔型;
◆ 另一类是构造类型,如数组、结构体、指针和
类等。
前者是 C++内建的数据类型,它是后者构造类
型(也称为用户自定义数据类型)的基础。
C++语言程序设计 第二章 基本数据类型、运算符与表达式
2.1 数据类型概述
分类,
定义,
如,#define PRICE 30
用标识符代表常量
定义格式,#define 符号常量 常量 例 符号常量举例
#define PRICE 30
main()
{
int num,total;
num=10;
total=num*PRICE;
cout<<"total=“<<total;
}
运行结果,total=300
C++语言程序设计 第二章 基本数据类型、运算符与表达式
2.2.1 常量
一般用大写字母
是宏定义预处理命令,
不是 C++语句
值常量,
程序运行过程中保持不变的数值, 比如,π, g等 。
符号常量,
整型常量
实型常量
字符常量
字符串常量
2.2 常量与变量
使用, #define”命令的缺点是无法指定常量的数据类型,
在使用上可能会出现一些问题, 因此建议在 C++ 程序中只使用
const常量而不使用宏常量, 即 const常量完全取代宏常量 。
C++ 语言除了 #define外还可以用 const来定义常量 ( 也称
为 const常量 ) 。
1,使用 const声明符号常量
格式,const 数据类型 符号常量名称 =初始值;
例如以下语句用来声明一个符号常量 PRICE,其初始
值为 850。
const int PRICE=850;
const 是关键字, 如果在程序中有许多地方用到
PRICE这个常量, 则会用 850代替 PRICE,编译程序不会让任何语
句改变 PRICE的值 。
C++语言程序设计 第二章 数据类型、运算符与表达式
数据类型 变量 1 [,变量 2,…,变量 n];
决定分配字节数
和数的表示范围 合法标识符
2.2.2 变量
C++语言程序设计 第二章 数据类型、运算符与表达式
1.定义,用来存放数据且其值可以改变的量 。
变量的两个要素,
( 1) 变量名 。 每个变量都必须有一个名字 ── 变量名,
变量命名遵循标识符命名规则 。
( 2) 变量值 。 在程序运行过程中, 变量值存储在内存
中 。 在程序中, 通过变量名来引用变量的值 。
变量定义的一般格式,
例,
int a,b,c;
float data;
编译程序根据变量定义为其
分配指定字节的内存单元 …...
地址
int a=1,b=-3,c;
a
b
c
2字节
2字节
2字节
地址
地址
…...
内存
1
-3
??
随机数
① 变量初始化,定义时赋初值
例,
int a=2,b,c=4;
float data=3.67;
char ch=?A?;
int x=1,y=1,z=1;
int x=y=z=1;
② 变量的使用,先定义,后使用
③ 变量定义位置,一般 放在函数开头
2,使用规则
C++语言程序设计 第二章 数据类型、运算符与表达式
例 1
int student;
stadent=19; //Undefined symbol ‘stadent’ in function main
例 2
float a,b,c;
c=a%b; //Illegal use of floating point in function main
main()
{ int a,b=2;
float data;
a=1;
data=(a+b)*1.2;
cout<<“data=”<<data;
}
变量定义
可执行语句
main()
{ int a,b=2;
a=1;
float data;
data=(a+b)*1.2;
cout<<“d ta=”<<data);
}
三种形式,
十进制整数:由数字 0~9和正负号表示,如 123,-456,0
八进制整数:由数字 0开头,后跟数字 0~7表示,如 0123,011
十六进制整数:由 0x开头,后跟 0~9,a~f,A~F表示,如 0x123
0123 = ( )10
0x123 = ( )10
0x ff = ( )10
83
291
255
问题,
0123 = ( )10
0x123 = ( )10
0xff = ( )10
2.3.1 整型
C++语言程序设计 第二章 数据类型、运算符与表达式
2.3 基本类型
1.整形常量的表示
? 根据其值所在范围确定其数据类型
? 在 整常量后加字母 l或 L,认为它是 long int 型常量 类型
? 匹配规则为:一个整型常量,可以赋给能容纳下其值
的整型变量。
例如, 其值在 -2 15 --( 2 15 -1 ) 的整型常量, 可以赋给
int型变量和 long int型变量;其值在 -2 31 --( 2 31 -1 ) 的整
型常量, 就只能赋给 long int型变量 。
C++语言程序设计 第二章 数据类型、运算符与表达式
2.整形常量的类型
C++语言程序设计 第二章 数据类型、运算符与表达式
? 基本整型 (类型关键字为 int)。
? 短整型 (类型关键字为 short [int])。
? 长整型 (类型关键字为 long [int])。
? 无符号整型 。无符号型又分为三种,
3.整形变量的分类,
? 无符号基本整型 ( unsigned [int]),
? 无符号短整型 ( unsigned short)
? 无符号长整型 ( unsigned long),
根据占用内存字节数的不同, 整型变量分为4类,
C++语言程序设计 第二章 数据类型、运算符与表达式
上述各类型整型变量占用的内存字节数,随系统而异。
在 Turbo C中,一般用2字节表示一个 int型变量,且 long型
(4字节) ≥ int型(2字节) ≥ short型(2字节)。
可用 sizeof(类型标识符)测量 变量的字节数。
4.占用内存字节数与值域
类型 符号 关键字 数的表示范围 所占位数
int 16 -2147483648~2147483647
short 16 -32768~32767
16 unsigned int 0~4294967295
long 32 -2147483648~2147483647
unsigned short 16 0~65535
32 0~4294967295 unsigned long




TC
用 sizeof( 数据类型 ) 可以确定某数据类型的字节长度 。 例如,
如果想知道你的机器上整数类型的大小, 可以编译并运行如下程
序,
#include<iostream.h>
void main()
{cout<<"number of bytes in int is,
"<<sizeof(int)<<endl;
cout<<"number of bytes in long int is,
"<<sizeof(long)<<endl;
cout<<"number of bytes in short int is,
"<<sizeof(short)<<endl;}
C++语言程序设计 第二章 数据类型、运算符与表达式
可用 sizeof(类型标识符)测量 变量的字节数
实型常量也称为实数或浮点数。
表示形式,
(1)小数表示法,(必须有小数点)
如,0.123,.123,123.0,0.0,123,
(2)科学表示法,( e或 E之前必须有数字;指数必须
为整数)
如, 12.3e3,123E2,1.23e2,e-5,1.2E-3.5
C++语言程序设计 第二章 数据类型、运算符与表达式
2.3.2实型
规范化的指
数形式
1.实型常量表示法
C语言的实型变量,分为三种,
( 1) 单精度型 。类型关键字为 float,一般占4字节(32位)、提供
7位有效数字。 要表示 float型,则必须在实数后加上 f或 F
( 2) 双精度型 。类型关键字为 double,一般占8个字节、提供 15~16
位有效数字。 在 C++中,一个实型常数如果没有任何说明,表示 double型
。 ( 3) 扩展双精度 。 类型关键字为 long double,一般占
16个字节,提供 19位有效数字。 表示 long double 型,则必须在实数后加
l或 L。
C++语言程序设计 第二章 数据类型、运算符与表达式
例 float a;
double b;
a=111111.111; /* a=111111.1*/
b=111111.111; /* b=111111.111*/
TC
2.实型变量的分类,
用 单引号 括起来的单个 普通字符 或 转义字符,
字符常量的 值,该字符的 ASCII码 值
如 ‘ A?——65,‘ a?——97,
‘ 0?——48,?\n?——10
如,‘ a’ ‘A’ ‘?’ ‘\n’ ‘\101’
反斜线后面跟一个字符或一个代码值表示
C++语言程序设计 第二章 数据类型、运算符与表达式
2.3.3 字符型
a.定义,
b.转义字符,
1.字符型常量
C++语言程序设计 第二章 数据类型、运算符与表达式
转义字符
ASCII码值
含义
\0
0x00
NULL
\a
0x07
响铃
\b
0x08
退格 ( backspace)
\t
0x09
水平制表 ( Tab)
\f
0x0c
换页, 只对打印有效
\n
0x0a
回车换行
\v
0x0b
竖向跳格
\r
0x0d
回车 ( 不换行 )
\\
0x5c
反斜杠字符
\'
0x27
单引号字符
\"
0x22
双引号字符
\ddd
0ddd
1~3位八进制数所代表的字符
\xhh
0xhh
1~2位十六进制数所代表的字符
表 2.2 转义字符
C++语言程序设计 第二章 数据类型、运算符与表达式
? 字符变量的类型关键字为 char,占用 1字节内存单元。
? 字符变量用来存储字符常量。
? 将一个字符常量存储到一个字符变量中,实际上是将该字符的
ASCII码值(无符号整数)存储到内存单元中。
a,变量值的存储
97 ch1 ch2 98
01100010 01100001
例如,
char ch1,ch2; /*定义两个字符变量,ch1,ch2*/
ch1=’a’; ch2=’b’; /*给字符变量赋值 */
内存,
2.字符型变量
b.字符变量特性
C++语言程序设计 第二章 数据类型、运算符与表达式
( 1)一个字符型数据,既可以 字符形式 输出,也可以
整数形式 输出。
字符数据在内存中存储的是字符的 ASCII码 ── 一个无
符号整数,其形式与整数的存储形式一样,所以C ++语言
允许字符型数据与整型数据之间通用。
( 2)允许对字符数据进行算术运算,此时就是对它们的
ASCII码值进行算术运算。
思考题, 直接用字符形式输出一个大于 256的数值, 会得到
什么结果?
C++语言程序设计 第二章 数据类型、运算符与表达式
? 字符串常量是用一对双引号括起来的若干字符序列。
? 字符串中字符的个数称为字符串长度。
? 长度为 0的字符串(即一个字符都没有的字符串)称为空串。
a,概念
例如,,How do you do.”,,Good morning.”等,都是
字符串常量,其长度分别为 14和 13(空格也是一个字符)。
如果反斜杠和双引号作为字符串中的有效字符,则必须
使用转义字符,例如,
( 1) C:\msdos\v6.22 → "C,\\msdos\\v6.22"
( 2) I say,"Goodbye!" → "I say,\"Goodbye!\""
3.字符串常量
C++语言程序设计 第二章 数据类型、运算符与表达式
b.字符串的存储
C语言规定:在存储字符串常量时,由系统在字符串的
末尾自动加一个‘ \0?作为字符串的结束标志。
注意,在源程序中书写字符串常量时,不必加结束字符
‘ \0?,否则画蛇添足。
如果有一个字符串为, CHINA”,则它在内存中的实际
存储如下所示,
最后一个字符 '\0'是系统自动加上的,它占用6字节而非
5字节内存空间。
C H I N A \0
思考题,’A’和” A”是不是一回事?
C++语言程序设计 第二章 数据类型、运算符与表达式
c.字符串小结
综上所述, 字符常量 'A' 与字符串常量 "A"是两回事,
( 1) 字符串是用一个一维字符数组来存放的, 而字符常
量可用一个字符型变量存放 。
( 2) 字符型常量用单引号括起, 而字符串常量用双引号
括起 。
( 3) 一个字符常量被存放在内存中只占一个字节, 而字
符串常量要占多个字节 。 要记住, 在 C++中, 凡是字符串都有
一个结束符, 该结束符用 '\0'表示 。
( 4) 字符常量与字符串常量的操作功能也不相同 。
'A' "A"
C++语言程序设计 第二章 数据类型、运算符与表达式
布尔,bool”是表示逻辑变量的专有名词,所代表的意义就只有
“真 true”和“假 false”两种。布尔数据是用来控制程序的执行方式
的,或者说是用来处理程序中判断或比较结果的。
例如,
bool flag=true; // 声明一个布尔变量
double d=5.32;
if (flag==false) d=3.24;
符号 ==用来检查两个量是否相等。上述最后一条语句的含义
是,如果 flag等于是 false,将变量 d赋值为 3.24。
由定义,true转为整型值时为 1,false为 0。相应的,非零值
可以隐式地转为 true,而 0为 false。 bool类型的变量至少占据和 char
一样的空间。
2.3.4 布尔类型
C++语言程序设计 第二章 数据类型、运算符与表达式
没有类型的类型,用 void表示。句法上,它是一种基本类型,
但是只能被用作复杂类型的一部分。它被用来表示函数不返回值或
者作为未知类型的对象指针的基类型。
2.3.5 void类型
C++



算术运算符:( + - * / % ++ --)
关系运算符:( < <= == > >= !=)
逻辑运算符:((! && ||)
位运算符,( << >> ~ | ^ &)
赋值运算符:( = 及其扩展)
条件运算符:(?:)
逗号运算符:(,)
指针运算符:( * &)
求字节数,( sizeof)
强制类型转换:(类型)
分量运算符:(, ->)
下标运算符:( [])
其它,( ( ) -)
C++语言程序设计 第二章 数据类型、运算符与表达式
2.4 运算符和表达式
学习运算符应注意,
?运算符功能
?与运算量关系
?要求运算量个数
?要求运算量类型
?运算符优先级别
?结合方向
?结果的类型
2.4.1 概述
?基本算术运算符,加( +)、减( -)、乘( *)、
除( /)和取余( %)。
? 结合方向:从左向右
?优先级,- ---->* / % -----> + -
?说明,
?,-” 可为 单目 运算符时,右结合性
?两整数相除,结果为整数
? %要求两侧均为整型数据
2
-2.5
1
-1
1
0
(?)
2.4.2 算术运算符和 算术 表达式
C++语言程序设计 第二章 数据类型、运算符与表达式
例 5/2 =
-5/2.0 =
例 5%2 =
-5%2 =
1%10 =
5%1 =
5.5%2
?作用:使变量值加 1或减 1
?种类,
? 前置 ++i,--i (先执行 i+1或 i-1,再使用 i值)
? 后置 i++,i-- (先使用 i值,再执行 i+1或 i-1)
例, j=3; k=++j;
j=3; k=j++;
j=3; cout<<++j;
j=3; cout<<j++;
a=3;b=5;c=(++a)*b;
a=3;b=5;c=(a++)*b;
//k=4,j=4
//k=3,j=4
//4
//3
//c=20,a=4
//c=15,a=4
2.4.3 自增、自减运算符 ++,--
C++语言程序设计 第二章 数据类型、运算符与表达式
a+=3
x*=y+8
x%=3
?简单赋值运算符
?符号,=
?格式,变量标识符 =表达式
?作用:将一个数据(常量或表达式)赋给一个变量
?复合赋值运算符
?种类,+= -= *= /= %=, =, = &= ^= |=
?含义,exp1 op= exp2 exp1 = exp1 op exp2
a=a+3
x=x*(y+8)
x=x%3
例 a = 3;
d = func();
c = d+2;
C++语言程序设计 第二章 数据类型、运算符与表达式
类型转换
2.4.4 赋值运算符和赋值表达式
?说明,
? 结合方向,自右向左
? 左侧必须是变量,不能是常量或表达式
? 赋值转换规则,使赋值号右边表达式值自动转换成其
左边变量的类型
? 赋值表达式的值与变量值相等,且可嵌套
例 3=x-2*y;
a+b=3;
例 int i;
i=2.56; //结果 i=2;
例, a=b=c=5
a=(b=5)
a=5+(c=6)
a=(b=4)+(c=6)
a=(b=10)/(c=2)
//表达式值为 5,a,b,c值为 5
// b=5;a=5
//表达式值 11,c=6,a=11
//表达式值 10,a=10,b=4,c=6
//表达式值 5,a=5,b=10,c=2
C++语言程序设计 第二章 数据类型、运算符与表达式
1.关系运算符
关系运算符又称比较运算符,因为关系运算实际上是比较大小
的运算。 C++提供了 6种关系运算符,如表 2.5所示。
2.关系表达式
用关系运算符连接的式子称为关系表达式。一般格式为,
表达式 1 关系运算符 表达式 2
关系表达式的值代表着某种关系的真假。比如,如果 x的值
是 10,那么,x>5的值是, 真,,而 x<1的值是, 假, 。
说明,(1) 关系表达式的值是逻辑型的,即 bool 型。在 C++
中常常将逻辑真用 1表示,逻辑假用 0表示。
C++语言程序设计 第二章 数据类型、运算符与表达式
2.4.5 关系运算符和关系表达式
但判断时, 所有非 0的值, 不管是什么数据类型, 如数值 3,字
符常量 'f'等, 都为逻辑真值 。 当一个关系表达式的值是真时,
它的实际值是 1;当一个关系表达式的值是假时, 它的实际值
是 0。 表示逻辑真假的 1和 0可以参与运算 。 如下列表达式的值
为 5。
4+( 8>3)
(2) 关系运算符两侧的表达式可以是算术表达式, 关系表
达式, 逻辑表达式或赋值表达式 。
(3) 关系运算符的优先级低于算术运算符, 而高于赋值运
算符 。
注意:关系运算符, 等于 ( ==), 与, 赋值运算符 ( =),
的意义完全不同,, 等于, 是比较两个数值是否相等,
C++语言程序设计 第二章 数据类型、运算符与表达式
而, 赋值运算符, 则是强制将某个数值指定给变量,
该变量必须无条件接受该数值 ( 当然, 数据类型不符
或者发生其它错误时例外 ) 。
如果原本应该, ==”的语句, 误用成, =”,则编
译器不会将它视为错误, 因为两者都是 C++合法的运
算符, 这种情况只有靠编程者自己谨慎对待 。
C++语言程序设计 第二章 数据类型、运算符与表达式
Page 33

C++语言程序设计 第二章 数据类型、运算符与表达式
1,逻辑运算符
C++提供了 3种逻辑运算符, 如表 2.6所示 。
2,逻辑表达式
用逻辑运算符连接起来的式子称为逻辑表达式,
用于表示复杂的运算条件 。
由系统给出的逻辑运算结果不是 0就是 1,不可能是其
他数值 。 而在逻辑表达式中作为参加逻辑运算的运算
对象可以是 0(, 假, ) 或任何非 0的数值 ( 按, 真,
对待 ) 。
有一点需要指出, 在逻辑表达式求值的过程中,
并不是所有的逻辑运算都被执行 。 例如,
2.4.6逻辑运算符和逻辑表达式
C++语言程序设计 第二章 数据类型、运算符与表达式

运算

说明
结合性
优先级
||
逻辑或, 双目运算符 ( 注意, 两
个 |之间没有空格 )
左结合
&&
逻辑与, 双目运算符 ( 注意, 两
个 &之间没有空格 )
左结合
!
逻辑非, 单目运算符
左结合

表 2.6逻辑运算符
1,条件运算符
条件运算符是 C++提供的唯一一个三目运算符。
用条件运算符连接起来的式子称为条件表达式。条件
表达式的格式是,
表达式 1? 表达式 2:表达式 3
条件表达式的运算规则如下:如果表达式 1的值
为真, 那么整个条件表达式的值就是表达式 2的值, 否
则整个条件表达式的值是表达式 3的值 。
例如, 有如下条件表达式,
4>6?3:9 //整个表达式的值为 9
C++语言程序设计 第二章 数据类型、运算符与表达式
2.4.7 条件运算符和条件表达式
【 例 2.3】 程序要求用户输入一个字符, 如果这个字符是
小写字母, 将这个字符转换成大写字母, 否则字符不变 。
#include<iostream.h>
void main( )
{
char ch;
cin>>ch;
ch=ch>='a'&&ch<='z'?ch-'a'+'A':ch;
cout<<ch<<endl;
}
C++语言程序设计 第二章 数据类型、运算符与表达式
? 形式,表达式 1,表达式 2,…… 表达式 n
? 结合性,从左向右
? 优先级, 逗号运算符是所有运算符中级别最低的
? 逗号表达式 的值:等于表达式 n的值
? 用途,常用于循环 for语句中
例 1 a=3*5,a*4
a=3*5,a*4,a+5
例 2 x=(a=3,6*3)
x=a=3,6*a
例 3 a=1;b=2;c=3;
cout<<a<<b<<c;
coout<<(a,b,c)<<b<<c;
//a=15,表达式值 60
//a=15,表达式值 20
//赋值表达式,表达式值 18,x=18
//逗号表达式,表达式值 18,x=3
//1,2,3
//3,2,3
C++语言程序设计 第二章 数据类型、运算符与表达式
例 4 #include <stdio.h>
main()
{ int x,y=7;
float z=4;
x=(y=y+6,y/z);
cout<<"x=“<<x;
}
运行结果,
x=3
2.4.8 逗号运算符和逗号表达式
?什么情况下发生
?运算转换 ------不同类型数据混合运算时
?赋值转换 ------把一个值赋给与其类型不同的变量时
?输出转换 ------输出时转换成指定的输出格式
?函数调用转换 ------实参与形参类型不一致时转换
?运算转换规则,
不同类型数据运算时先 自动 转换成同一类型
C++语言程序设计 第二章 数据类型、运算符与表达式
2.5 不同类型数据间的转换
2.5.1 隐式转换
double float
long
unsigned
int char,short 低

说明,
必定的转换
运算对象类型不同时转换
例 char ch;
int i;
float f;
double d;
ch/i + f*d - (f+i)
int
int
double
double
double
double
double
double
10+‘a’ +i*f - d/l
例 int i;
float f;
double d;
long l;
int
int
double
double
double
double
double
double
C++语言程序设计 第二章 数据类型、运算符与表达式
隐式转换举例 注意,箭头方向只表示
数据类型由低向高转换, 不
要理解为 int型先转换成
unsigned型, 再转换成 long
型, 最后转换成 double型 。
?一般形式:(类型名)(表达
式)
例 (int)(x+y)
(int)x+y
(double)(3/2)
(int)3.6
?说明:强制转换得到所需类型
的中间变量,原变量类型不变
例 main()
{ float x;
int i;
x=3.6;
i=(int)x;
cout<< x<< i ;
}
结果,x=3.600000,i=3
精度损失问题
C++语言程序设计 第二章 数据类型、运算符与表达式
2.5.2 显式转换(强制转换)
较高类型向较低类
型转换时可能发生
C++语言程序设计 第二章 数据类型、运算符与表达式
?1.判断下面哪些是不合法的标识符?请指出错误。
A_var 2_test char # total _book.c
?2.举例说明字符常量和字符串常量有何区别?
?3.求下列表达式的值
( 1) int e=1,f=4,g=2;
float m=10.5,n=4.0,k;
k=(e+f)/g+sqrt((double)n)*1.2/g+m
( 2) float x=2.5,y=4.7;
int a=7;
x+a%3*(int(x+y)%2/4
?
习题
C++语言程序设计 第二章 数据类型、运算符与表达式
第 1题,
2_test 不合法 标识符必须是字母或下划线开头
char 不合法 标识符不能是关键字
#total 不合法 标识符必须是字母或下划线开头
_book.c 不合法 标识符必须是字母下划线或数字组成的字符串
第 2题,
字符常量是用单引号括起来的一个字符,在内存中只占一个字
节;字符串常量是用一对双引号括起来的字符序列,其中的字符连
续存储,并在最后加上字符 ’ \0’作为字符串结束的标志。
第 3题,
1,K=13.7
2,表达式的值为 2
习题答案