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流的使用技巧