C++大学基础教程
第2章 基本数据类型与表达式
北京邮电大学电信工程学院
计算机技术中心
程序中最基本的元素是 数据类型 ,
根据数据类型可以为 变量 或 常量 分
配内存空间,将变量、常量和 运算
符 结合在一起组成 表达式 ,进行复
杂的运算和处理。
第2章 基本数据类型与表达式
2.1 词法记号和标识符
2.2 基本数据类型
2.3 变量和常量
2.4 运算符和表达式
2.5 基本输入输出
2.1 词法记号和标识符
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-5-
2.1 词法记号和标识符
1、 C++字符集
英文字母 : A~Z, a~z
数字字符 : 0~9
特殊字符 :
+ - * / % ^ = < > !
# & | _ ~ \ ‘ “ ; .
, ( ) [ ] { } 空格
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-6-
2.1 词法记号和标识符
1、什么是关键字?
预先定义好的标识符,C++编译器对
其进行特殊处理。
2、如何识别关键字?
使用VC++ 6.0的编辑环境时,缺省
是 蓝色 的字符即为关键字。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-7-
2.1 词法记号和标识符
3、标识符
标识符是程序员声明的单词,它命名程 序 正 文
中的一些实体,如函数名、变量名、类名、对象名
等。C++标识符的构成规则如下:
1、不能是C++的关键字;
2、第一个字符必须是大写、小写字母或下划线;
3、不包含空格和 “+、-、; ”等特殊字符;
4、为方便输入,长度一般不超过31个字符。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-8-
2.1 词法记号和标识符
例如:
合法的标识符:
apple、 _Student、 _123、 No1、 max_num
不合法的标识符:
51job、 max num、 -abc
注意:
C++的表示符是大小写敏感的,即
abc≠ABC。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-9-
2.1 词法记号和标识符
4、分隔符
分隔符用于分隔程序中的正文,在C ++中
使用下列字符作为分隔符:
( ) { } ,: ;
这些分隔符不表示实际的操作,仅用于构
造程序。比如 “; ”, 用 来作为一句完整语句的
结束。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-10-
2.1 词法记号和标识符
5、空白
在C ++语句中经常出现空白(制表 符、空
格、空行)等,通常都忽略不计。
2.1 词法记号和标识符
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-12-
2.2、基本数据类型
什么是数据类型?
数据是程序处理的对象,数据根据其本身
的特点进行分类,从而形成不同的数据类型。
例如:数学中有自然数、整数、实数
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-13-
2.2、基本数据类型
基本数据类型
整型: int
字符型: char 、 wchar_t
实型: float、 double
逻辑型: bool
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-14-
2.2、基本数据类型
自定义数据类型
数组: type[]
指针: type*
引用: type&
空类型: void
结构: struct
联合: union
枚举: enum
类: class
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-15-
2.2、基本数据类型
修饰符
在 C++中描述为了更加准确的描述数据类
型,提供了 4个关键字用来修饰基本的数据类
型:
1、长型 long
2、短型 short
3、有符号 signed
4、无符号 unsigned
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-16-
1、 short:
仅用来修饰 int,称为短整型,占 2字节内存,也可
直接简写为 short;
2、 long:
仅修饰 int和 double,因为在不同的编译环境中使用
long修饰的数据所占内存不同,这里列出的是在
VC++6.0的环境下的。
3、 unsigned:
用来修饰 char、 short和 int,表 示该数据类型为无符
号数。
4、 signed:
用来修饰 char、 short和 int,表 示该数据类型为有符
号数,为缺省设置。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-17-
2.2、基本数据类型
数据类型和内存空间
不同的数据类型,加上不同的修饰符就具
有了不同的特点,在内存中占用的空间也不
同,因而其所能表示的数值范围也不尽相同。
内存单元的单位是字节,因此用来表示数
据类型的长度的单位也是字节。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-18-
2.2、基本数据类型
注意
整型 int的长度等于机器的字长:
16位机: int=2字节;
32位机: int=4字节。
但是 short和 long表示的数据长度是固定
的,任何支持 标准 C++的编译器都是如此,因
而如果需要编写可 移植性好的程序,应将整型
声明为 short或 long。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-19-
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 变量和常量
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-22-
2.3 变量和常量
概述
程序所处理的数据不仅分为不同的数据类
型,而且每种类型的数据还分为变量和常量。程
序在运行中就是通过这些变量和常量来操作数据
的。
什么是变量?
在C++中,变量是存储信息的地方。变量的
实质是内存中的一个地址空间,在这个地址空间
中可以进行数据的存储和读取。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-23-
2.3 变量
变量定义的格式:
数据类型 变量名1,变量名2, …变量名n;
例如:定义各种类型的变量
int num;
float f;
char ch;
short s;
double area, length;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-24-
2.3 变量
说明
在创建或定义变量时,需要指明该变量的
数据类型 和 名称 。
数 据 类型:决定变量的存储方式和可以进
行的操作;
变量名称:用来区分不同的变量。
变量一旦被定义,则系统自动为其分配应
占的内存。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-25-
2.3 变量
变量名称的定义遵循标识符定义的规则,实际
上变量名称就是其中一 种标 识符 。常 用 的 命 名 约
定有三种:
1、 Unix环境常用的命名法
my_age、 num_of_student
2、驼峰式命名法
myAge、 numOfStudent
3、匈牙利标记法
iMyCar、 bIsRight
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-26-
2.3 变量
赋值
使 用 赋值运算符 “=”可以将一个值赋给变
量。
例如:
unsigned short age;
age = 18;
或者
unsigned short age = 18;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-27-
2.3 变量
我们可以一次定义多个相同数据类 型的 变
量,也可以一次为多个变量初始化:
char ch1=’a’, ch2=’b’ ;
int height=10, width=6, area ;
特性:
变量可以被多次赋值,但每次赋值后,
原值都会被新值覆盖。
例2.2:赋值运算符的使用
#include <iostream>
using namespace std;
void main(){
int myAge = 18;
cout<<“myAge=”<< myAge<<endl;
myAge = 20;
cout<<“myAge=”<< myAge<<endl;
}
运行结果:
myAge=18
myAge=20
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-29-
2.3 变量
typedef
为已有的数据类型定义一个同义词,或者
叫做别名。
例如:
typedef unsigned int UINT;
关键字 数据类型 别名赋值
注意:
使用typedef定义同义词时并不分配内存空
间。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-30-
2.3 常量
严格来说,常量又分成符号常量和常数。
符号常量 :
代表一个固定不变值的名字;
常数 :
程序中使用的具体的数据。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-31-
2.3 常量
符号常量
C++中提供了一个关键字 const,用来区分
常量和变量。并且由于常量代表一个固定的
值,并且该值在程序运行过程中不能够被改
变,所以要求 常量在定义的时候必须进行初始
化 。
例如:
const int i=10 ;
关键字 数据类型 常 量名=初始值;
2.3 常量
define关键字
在C语言中使用预编译指令#define也能够
定义常量。
例如:
#define PI 3.1415927
关键字 常 量名 值
该语句属于预编译指令,不属于C++语句,因而行尾
不 需要使用分号。并且由于C ++是向下兼容的,因而C语
言 的 程 序 能 够 在C ++的编译器下顺利运行。但是在C ++编
程中,建议使用const替代#define定义常量。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-33-
2.3 常量
整型常数
十进制数:100
8进制数:0144
16进制数:0x64
用 U或 u表示无符号整型,如 65535U 。
用 L或 l表示长整型。
默认的是int型。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-34-
2.3 常量
实型常数
1 小数形式
例如: 0.123、 23.12
2 指数形式
例如: 123e5或 123E5 =123*10
5
注意: e前面必须有数字,e后面必须是整数
实常数默认为 double型
可用后缀 F( f)表示实数常数为 float型。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-35-
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’;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-39-
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
注意:变量在输出时,根据其本身的数据类型进行输出。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-41-
2.3 常量
字符串常量
由一对双引号括起来的字符序列,
例如: “how do you do?”
“hello world!”
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-42-
2.3 常量
字符和字符串的区别
1、字符常量和字符串常量是不同的,字符串常
量以 ‘/0’结尾。
例如:字符串 Hello在内存中的形式:
2、 “a”不等于 ‘a’,”a”占2个字节, ‘a’1个字节
H e l l o \0
a \0 a
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-43-
2.3 常量
字符串变量
char a[20]=“Hello world\n”;
char b[5]=“a”;
char c=‘a’;
思考
字符串 “/x07Operating\tsystem” 有几个
字符?显示结果如何?
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-44-
2.3 常量
逻辑常数
逻辑型常数只有两个: false(假)和 true
(真)。在显示器上显示为0和1。
2.4 运算符和表达式
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-46-
2.4 运算符和表达式
1、表达式
2、语句和块
3、运算符
赋值运算符、算术运算符、关系运算符、
逻辑运算符、位运算符、条件运算符、逗号运
算符
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-47-
2.4 运算符和表达式
表达式
变 量、常量是存放数据的地方,那么在C ++
语言中这些数据是如何处理和计算的呢?
在C ++语言中将变量、常量和运算 符有机
结合在一起组成的就是 表达式 ,利用表达式
C++可以进行复杂的运算和处理。
2.4 运算符和表达式
例如:
3.2 //简单表达式,值为 3.2
2+3 //常量表达式,值为 5
a //简单表达式,值为变量 a的值
x=(a+b)*c; //较为复杂的表达式
表达式是可以嵌套的,比如 y=x=a+b,该
表达式先将 a和 b进行相加,然后将结果赋值给
x,再将 x=a+b的值赋给 y。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-49-
2.4 运算符和表达式
表达式
定义:
表达式是 操作符 、 操作数 和 标点符号 组成
的序列。
操作符: + - * / 等
操作数:变量、常量、数组等
标点符号:空格、回车等
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-50-
2.4 运算符和表达式
语句和块
C++中所有的操作运算都通过表达式来实现。由 表
达式和结尾的 “;”组成一个C ++语句;多条C ++语句通过
大括号{}括起来,组成一个块语句,例如:
{
int temp = x;
x = y;
y = temp;
}
一般来说属于同一个逻辑关系的多条语句组成 块
语句。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-51-
2.4 运算符和表达式
运算符
运算符具有 优先级 和 结合性 。
优先级:
级别高的先运算,级别低的后运算。例如: *
/ 高于 + -
结合性:
自左向右结合还是自右向左结合。例如:1+2+3,
+自左向右结合。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-53-
2.4 运算符和表达式
运算符
根据运算符对操作数的要求不同,分成:
一元运算符:
仅需要一个操作数的运算符,例如 ++等
二元运算符:
需要两个操作数的运算符,例如: +、 -、 *、 /等,
形如 “ 操作数1 运算符 操作数2 ”
三元运算符:
需要三个操作数的运算符,只有条件运算符 “?:”。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-54-
2.4 运算符和表达式
赋值运算符
1、赋值运算符就是 “=”
例如:float f=3.15
2、 左值 :可以合法的放在 “=”左边的操作数
右值 :可以合法的放在 “=”右边的操作数
常量都是右值,所以不能够放在 “=”的左
边被赋值;
变量既是左值又是右值,可以放在任何位
置。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-55-
2.4 运算符和表达式
算术运算符
C++提供的算术运算符包括 “+, -, *, /,
%, ++, --”
1、二元运算符:
+(加 ), -(减 ), *, /, %
2、一元运算符:
+(正号 ), -(负号 ), ++, --
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-56-
2.4 运算符和表达式
算术运算符
注意:
1、 “/” 根据操作数不同,运算规律也不同:
整型数为整除运算:例如 5/2=2;
浮点数为通常意义的除法:即
5.0/2.0=2.5。
2、 “%”取余数运算符,只能对整型数进行操
作,不允许对浮点数进行操作。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-57-
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;
cout<<”i=”<<i<<endl;
}
1
1
2
3
3
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-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
例如:
#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)
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-61-
2.4 运算符和表达式
算术运算符
这些运算符的优先级由高到低依次为:
1、 +(正号 ), -(负号 ), ++, --
2、 *, /, %
3、 +、 -
4、 =、 +=、 -=、 *=、 /=、 %=
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-62-
2.4 运算符和表达式
注意
在进行算术运算时,很可能出现溢出,溢出是指在
给一 个变 量赋 值时超出了其数据类型表示的范围。溢出
不会引起编译错误的,但运行结果会出现偏差。
例如:
short int i=40000;
cout<<i<<endl;
输出结果:-25536
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-63-
2.4 运算符和表达式
关系运算符
关系运算符有 ==、 !=、 >=、 >、 <=、 <六
种;这些运算符的优先级由高到低依次为:
1、 >=、 >、 <=、 <
2、 ==、 !=
由关系运算符将两个表达式连接起来,就
是关系表达式;关系表达式的结果类型为
bool,值只能为 true或 false,屏幕显示为1或0。
例如
int a=1, b=2, c=3;
cout<<a==b<<endl;
cout<<a!=b<<endl;
cout<<a>=b<<endl;
cout<<a<b<<endl;
d=a>b==c>a+5;
cout<<d<<endl;
结果 false,输出为 0
结果 true,输出为 1
结果 false,输出为 0
结果 true,输出为 1
结果 true,输出为 1
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-65-
2.4 运算符和表达式
逻辑运算符
逻 辑运算符有 &&、 ||、 ! 三种;这些运算符
的优先级由高到低依次为
1、 !
2、 &&
3、 ||
除了逻辑非,逻辑运算的级别低于关系运
算。
逻辑表达式的结果类型也为 bool,值只能为
true或 false,屏幕显示为1或0。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-66-
2.4 运算符和表达式
注意
如果多个表达式用 && 或 || 连接,为了提高判断效
率, 只要 能够确定表达式的结果了,运行就不再继
续。
例如:
int a=1,b=2;
if (a>b && b++)
cout<<”b的值没有被改变。 ”<<endl;
cout<<b<<endl;
运行结果:2
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-67-
2.4 运算符和表达式
位运算符
一般高级语言: byte
C语言: bit
C++语言中提供了六个位运算符,可以对
整数进行位操作,分别是按位与( &),按位
或( |),按位异或( ^),按位取反( ~),左
移位( <<),右移位( >>)。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-68-
2.4 运算符和表达式
按位与(&)
按位与操作的作用是将两个操作数对应的每一 位 分
别进行 逻辑与 操作。
例如:计算 3 & 5
3: 0 0 0 0 0 0 1 1
5: 0 0 0 0 0 1 0 1
3 &5: 0 0 0 0 0 0 0 1
例如:
将 char a;的最低位置 0:
取 int a;的低字节:
a=a & 0376;
char c= a & 0377;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-69-
2.4 运算符和表达式
按位或(|)
按位或操作的作用是将两个操作数对应的每一 位 分
别进行逻辑或操作。
例如:计算 3 | 5
3: 0 0 0 0 0 0 1 1
5: 0 0 0 0 0 1 0 1
3 |5: 0 0 0 0 0 1 1 1
例如:
将 int a;的低字节置 1: a = a | 0xff;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-70-
2.4 运算符和表达式
按位异或(^)
按位异或操作的作用是将两个操作数对应的 每 一 位
分别进行异或操作。
具体运算规则:
1^1=0, 0^0=0, 1^0=0^1=1
例如:计算 3^5
3: 0 0 0 0 0 0 1 1
5: 0 0 0 0 0 1 0 1
3 ^5: 0 0 0 0 0 1 1 0
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-71-
2.4 运算符和表达式
按位异或(^)
例如:
如果使 8位二进制数 01111010的后四位翻转?
可以将该二进制数与00001111进行异或操作:
0 1 1 1 1 0 1 0
( ^) 0 0 0 0 1 1 1 1
0 1 1 1 0 1 0 1
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-72-
2.4 运算符和表达式
按位取反( ~)
按 位 取反是一个一元运算符,它的作用是将
两个操作数对应的每一位分别进行取反操作。
具体运算规则: ~1=0, ~0=1。
例如:计算 ~5
5: 0 0 0 0 0 1 0 1
~5: 1 1 1 1 1 0 1 0
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-73-
2.4 运算符和表达式
左移<<:
按照指定的位数将一个二进制数值向左移
动。左移后,低位补0,移出的高位舍弃。
右移>>:
按照指定的位数将一个二进制数值向右移
动,右移后,移出的低位舍弃。
如果是 无符号数则高位补0 ,如果是有符
号数则高位补符号位或0,在V C++6.0环 境 下 高
位补符号位。
例子
char a= -8;
a =a>>2;
cout<<”a=”<<(int)a<<endl;
例子
char a=2;
a =a<<1;
cout<<”a=”<<(int)a<<endl;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-76-
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
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-77-
2.4 运算符和表达式
位运算符
这些位运算符的优先级由高到低依次为:
1、 ~
2、 <<, >>
3、 &
4、 ^
5、 |
6、 &=, |=, ^=, <<=和 >>=
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-78-
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;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-79-
2.4 运算符和表达式
逗号运算符
逗号表达式的语法格式为:
表达式 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
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-81-
2.4 运算符和表达式
数据类型转换
当表达式中出现多种数据类型的混 合运 算
时,往往需要进行 类型转换。表达式中的类型
转换分成两种:
1、隐式类型转换
2、强制类型转换。
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-82-
2.4 运算符和表达式
1、隐式类型转换
各种二元运算符在进行运算时都要求两个
操作数的数据类型 一致。如果类型不一致,则
系统自动对数据进行转换(隐式类型转换)。
转换的基本原则 :
将精度较低、范围较小的类型转换成精度
较高、范围较大的类型。
char → short → int → long → float → double
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-83-
2.4 运算符和表达式
1、隐式类型转换
对于同一种精度的无符号数和有符号数,
在进行算术运算中 ,有符号数向着无符号数方
向进行隐式类型转换:
signed → unsigned。
例如:
int a=100;
unsigned int i=99;
cout<<i - a<<endl
思考一下,如果将
unsigned int i=99;改为
unsigned short i=99;结
果如何?
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-84-
2.4 运算符和表达式
1、隐式类型转换
逻辑运算符要求参与运算的操作数 为 bool类型,如
果是其他类型,则系统自动将其转换成 bool类型,转
换规则: 0为 false,非 0为 true。
赋值运算符要求 “=”左右两边的操作数数据类型相
同,如果类型不一致,则自动将右边的操 作数 类型 向
着左边的操作数类型转换。
例如:
int i=3.15;
cout<<i<<endl;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-85-
2.4 运算符和表达式
2、强制类型转换
强制类型转换通 过是 类型 说明 符和 括号 来实 现的
显式转换,其语法格式为:
(数据类型名)表达式
或 数据类型名(表达式)
例如:
int i=97;
cout<<(char)i<<endl;
float f=3.75;
cout<<(int)f<<endl;
2.5 I/O流控制
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-87-
2.5 I/O流控制
在 iostream库中包含有一个标准输入流对
象 cin和一个标准输出流对象 cout,分别用来实
现从键盘读取数据,以及将数据在屏幕输出。
1、 cin
2、 cout
3、I/O流的格式控制
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-88-
2.5 I/O流控制
1、标准输入流cin
cin负责从键盘读取数据,使用提取操作符 “>>”就
可以将键盘键入的数据读入到变量中。语法格式为:
cin>>变量 1>>变量 2…>>变量 n;
例如:
int a,b;
char ch;
cin>>a>>b>>ch;
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-89-
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;
}
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-91-
2.5 I/O流控制
3、 IO流的格式控制
库文件 iomanip
常用控制符:
setfill(c) 设置填充字符
setw(n) 设置域宽为n
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-92-
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';
}
*
**
***
****
*****
******
*******
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-95-
2.5 I/O流控制
注意1
除了 setw()控制符外,其他控制符一旦设
置,则对其后的所有输入输出产生影响。而
setw()控制符只对其后输出的第一个数据有
效,对其他数据没有影响,所以如下代码:
cout<<setw(8) <<’a’ <<’b’<<endl;
输出结果:
_ _ _ _ _ _ _ab
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-96-
2.5 I/O流控制
注意2
setw()的默认为 setw(0),意思是按实际输
出。如果输出的数值占用的宽度超过 setw(int n)
设置的宽度,则按实际宽度输出。
例如:
float f=0.12345;
cout<<setw(3)<<f<<endl;
0.12345
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-97-
2.5 I/O流控制
3、 I/O流的格式控制
C++默认输出浮点数的有 效位 为 6位 , 那 么 要 想 控
制输出的 数据的长度 ,该如何呢?
比如: float f=3.1234567;如何 让显示结果为
3.12?
C++提供了 setprecision(int n)可以控制显示浮点
数的有效位。
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
float f=17/7.0;
cout<<f<<endl;
cout<<setprecision(0)<<f<<endl;
cout<<setprecision(1)<<f<<endl;
cout<<setprecision(2)<<f<<endl;
cout<<setprecision(3)<<f<<endl;
cout<<setprecision(6)<<f<<endl;
cout<<setprecision(8)<<f<<endl;
}
2.42857
2.42847
2
2.4
2.43
2.42857
2.4285715
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-99-
2.5 I/O流控制
3、 I/O流的格式控制
如何控制小数的位数?
setiosflags(ios::fixed)控 制符是用定点方式
表示浮点数,将 setprecision(int n) 和
setiosflags(ios::fixed) 结合,可以使用
setprecision(int n)控制小数点右边小数的个数。
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
float f=17/7.0;
cout<<setiosflags(ios::fixed);
cout<<setprecision(0)<<f<<endl;
cout<<setprecision(2)<<f<<endl;
cout<<setprecision(3)<<f<<endl;
cout<<setprecision(4)<<f<<endl;
}
2
2.43
2.429
2.4286
2005-4-27
北京邮电大学电信工程学院计算机技术中心
-101-
2.5 I/O流控制
3、 I/O流的格式控制
如何控制指数表示的小数个数?
setiosflags(ios::scientific)控制符使用指数方
式显示浮点数,将 setprecision(int n)和
setiosflags(ios::scientific)结合,可以使用
setprecision(int n)控制指数表示法的小数位数。
#include <iostream>
#include <iomanip>
using namespace std;
void main()
{
float f=17/7.0;
cout<<setiosflags(ios::scientific);
cout<<setprecision(2)<<f<<endl;
cout<<setprecision(3)<<f<<endl;
cout<<setprecision(4)<<f<<endl;
}
2.43e +000
2.429e +000
2.4286e +000
总结
1、基本数据类型有哪些?
2、如何定义和使用变量和常量?变量和常量
的异同?
3、运算符的优先级?
4、数据类型如和转化?
5、I/O流的使用技巧