C++简单程序设计
计算机的最基本功能是数据处理
l C++支持的基本数据类型:
n 整数、实数、字符、布尔数据
l C++支持的基本运算
n 算术运算、关系运算、逻辑运算、位运算、逗号运算、条件运算
程序要能够输入数据、输出数据
l C++中的数据输入/输出可以调用预定义的功能模块实现
程序的执行流程
l 顺序的,因此程序要能够对执行流程进行选择(选择、开关语句);
l 反复用同一算法依次处理大批量数据(循环语句)。
枚举类型
l 通过列出所有可取值来定义一种新类型。
C++的特点和程序实例
C++的产生和发展
l 从C语言发展演变而来,最初被称为"带类的C";
l 1983年正式取名为C++;
l 1998年11月被国际标准化组织(ISO)批准为国际标准;
l 2003年10月15日发布第2版C++标准ISO/IEC 14882:2003;
l 2011年8月12日ISO公布了第三版C++标准C++11,包含核心语言的新机能、扩展C++标准程序库。
l 2014年8月18日ISO公布了C++14,其正式名称为"International Standard ISO/IEC 14882:2014(E) Programming Language C++"。
l C++14作为C++11的一个小扩展,主要提供漏洞修复和小的改进。
C++的特点
l 兼容C,支持面向过程的程序设计;
l 支持面向对象的方法;
l 支持泛型程序设计方法。
命名空间
避免命名冲突
std是C++标准库的命名空间( namespace)名
using namespace std表示打开std命名空间
例2-1
//2_1.cpp
#include <iostream>
using namespace std;
int main() {
cout << "Hello!" << endl;
cout << "Welcome to c++!" << endl;
return 0;
}
运行结果:
Hello!
Welcome to c++!
C++字符集和词法记号
字符集
l 大小写的英文字母:A~Z,a~z
l 数字字符:0~9
l 特殊字符:
! # % ^ & * _ + = - ~ < > / \ ‘ “ ; . , : ? ( ) [ ] { } |
词法记号
l 关键字 C++预定义的单词
l 标识符 程序员声明的单词,它命名程序正文中的一些实体
l 文字 在程序中直接使用符号表示的数据
l 分隔符 () {} , : ;
用于分隔各个词法记号或程序正文
l 运算符(操作符) 用于实现各种运算的符号
l 空白符 空格、制表符(TAB键产生的字符)、垂直制表符、换行符、回车符和注释的总称
标识符的构成规则
l 以大写字母、小写字母或下划线(_)开始。
l 可以由以大写字母、小写字母、下划线(_)或数字0~9组成。
l 大写字母和小写字母代表不同的标识符。
l 不能是C++关键字或操作符。
基本数据类型、常量、变量
C++能够处理的基本数据类型
l 整数类型;
l 浮点数类型;
l 字符类型;
l 布尔类型。
程序中的数据
l 常量
n 在源程序中直接写明的数据;
n 其值在整个程序运行期间不可改变。
l 变量
n 在程序运行过程中允许改变的数据。
整数类型
l 基本的整数类型:int
l 按符号分
n 符号的(signed)
n 无符号的(unsigned)
l 按照数据范围分
n 短整数(short)
n 长整数(long)
n 长长整数( long long )
l ISO C++标准并没有明确规定每种数据类型的字节数和取值范围,它只是规定它们之间的字节数大小顺序满足:
(signed/unsigned)signed char ≤ (unsigned) short int ≤ (unsigned) int ≤ (unsigned) long int ≤ long long int
字符类型(char)
l 容纳单个字符的编码;
l 实质上存储的也是整数。
浮点数类型
l 单精度(float)
l 双精度(double)
l 扩展精度(long double)
字符串类型(详见第6章)
l 有字符串常量
l 基本类型中没有字符串变量
l 采用字符数组存储字符串(C风格的字符串)
l 标准C++类库中的String类(C++风格的字符串)
布尔类型(bool)
l 只有两个值:true(真) 、false(假)
l 常用来表示关系比较、相等比较或逻辑运算的结果
各基本类型的取值范围
常量
l 在程序运行的整个过程中其值始终不可改变的量;
l 直接使用符号(文字)表示的值;
l 例如:12,3.5,'A'都是常量。
整数常量
l 以文字形式出现的整数;
l 十进制
n 若干个0~9的数字,但数字部分不能以0开头,正数前边的正号可以省略。
l 八进制
n 前导0+若干个0~7的数字。
l 十六进制
n 前导0x+若干个0~9的数字及A~F的字母(大小写均可)。
l 后缀
n 后缀L(或l)表示类型至少是long,后缀LL(或ll)表示类型是long long,后缀U(或u)表示unsigned类型。
浮点数常量
l 以文字形式出现的实数;
l 一般形式:
n 例如,12.5,-12.5等。
l 指数形式:
n 例如,0.345E+2,-34.4E-3;
n 整数部分和小数部分可以省略其一。
l 浮点常量默认为double型,如果后缀F(或f)可以使其成为float型,例如:12.3f。
字符常量
l 单引号括起来的一个字符,如:'a'、'D'、'?'、'$';
l C++转义字符列表(用于在程序中表示不可显示字符)
C风格字符串常量
l 一对双引号括起来的字符序列;
l 在内存中按串中字符的排列次序顺序存放,每个字符占一个字节;
l 在末尾添加 ‘\0’ 作为结尾标记。
例:
通过添加前缀可以改变字符常量或者字符串常量的类型,前缀及其含义如下表所示:
变量:在程序的运行过程中,其值可变的量
l 变量定义
n 数据类型 变量名1, 变量名2, ..., 变量名n;
l 初始化
n C++语言中提供了多种初始化方式;
n 例如:
int a = 0;
int a(0);
int a = {0};
int a{0};
其中使用大括号的初始化方式称为列表初始化,列表初始化时不允许信息的丢失。例如用double值初始化int变量,就会造成数据丢失。
符号常量
l 常量定义语句的形式为:
n const 数据类型说明符 常量名=常量值;
或:
n 数据类型说明符 const 常量名=常量值;
l 例如,可以定义一个代表圆周率的符号常量:
n const float PI = 3.1415926;
l 符号常量在定义时一定要初始化,在程序中间不能改变其值。
算术运算与赋值运算
算术运算
l 基本算术运算符
n + - * /(若整数相除,结果取整)
n %(取余,操作数为整数)
l 优先级与结合性
n 先乘除,后加减,同级自左至右
l ++, --(自增、自减)
n 例:i++; --j;
赋值运算
l 将值赋给变量
l 赋值运算符“=”
l 赋值表达式:
n 用赋值运算符连接的表达式
n 例:
n=5
n = n + 5
n 表达式的值
赋值运算符左边对象被赋值后的值
n 表达式的类型
赋值运算符左边对象的类型
l 复合的赋值运算符
n +=,-=,*=,/=,%=,<<=,>>=,&=,^=,|=
n 例
a += 3 等价于 a = a + 3
x *= y + 8 等价于 x = x * (y + 8)
逗号运算、关系运算、逻辑运算和条件运算
逗号运算和逗号表达式
l 格式
表达式1,表达式2
l 求解顺序及结果
n 先求解表达式1,再求解表达式2
n 最终结果为表达式2的值
l 例
a = 3 * 5 , a * 4 最终结果为60
关系运算与关系表达式
l 关系运算是比较简单的一种逻辑运算,优先次序为:
l 关系表达式是一种最简单的逻辑表达式
n 其结果类型为 bool,值只能为 true 或 false。
例如:a > b,c <= a + b,x + y == 3
逻辑运算与逻辑表达式
l 逻辑运算符
!(非) &&(与) ||(或)
优先次序: 高 → 低
l 逻辑运算结果类型:bool,值只能为 true 或 false
l 逻辑表达式
例如:(a > b) && (x > y)
l “&&”的运算规则
n 两侧表达式都为真,结果为真;
n 有一侧表达式为假,结果为假。
l “&&” 的“短路特性”
表达式1 && 表达式2
n 先求解表达式1
n 若表达式1的值为false,则最终结果为false,不再求解表达式2
若表达式1的结果为true,则求解表达式2,以表达式2的结果作为最终结果
l “||”的运算规则
n 两侧表达式都为假,结果为假;
n 有一侧表达式为真,结果为真。
l “||” 的“短路特性”
表达式1 || 表达式2
n 先求解表达式1
n 若表达式1的值为true,则最终结果为true,不再求解表达式2
若表达式1的结果为false,则求解表达式2,以表达式2的结果作为最终结果
条件运算符与条件表达式
l 一般形式
n 表达式1?表达式2:表达式3
表达式1 必须是 bool 类型
l 执行顺序
n 先求解表达式1,
n 若表达式1的值为true,则求解表达式2,表达式2的值为最终结果
若表达式1的值为false,则求解表达式3,表达式3的值为最终结果
l 条件运算符优先级高于赋值运算符,低于逻辑运算符
n 例
表达式1是bool类型,表达式2、3的类型可以不同,条件表达式的最终类型为 2 和 3 中较高的类型。
Sizeof运算、位运算
sizeof运算
l 语法形式
sizeof (类型名)
或 sizeof 表达式
l 结果值:
“类型名”所指定的类型,或“表达式”的结果类型所占的字节数。
l 例:
sizeof(short)
sizeof x
位运算——按位与(&)
l 运算规则
将两个运算量的每一个位进行逻辑与操作
l 举例:计算 3 & 5
l 用途:
n 将某一位置0,其他位不变。
例如:将char型变量a的最低位置0: a = a & 0xfe; ;(0xfe:1111 1110)
n 取指定位。
例如:有char c; int a; 取出a的低字节,置于c中:c=a & 0xff; (0xff:1111 1111)
位运算——按位或(|)
l 运算规则
n 将两个运算量的每一个位进行逻辑或操作
l 举例:计算 3 | 5
l 用途:
n 将某些位置1,其他位不变。
例如:将 int 型变量 a 的低字节置 1 :
a = a | 0xff;
位运算——按位异或(^)
l 运算规则
n 两个操作数进行异或:
若对应位相同,则结果该位为 0,
若对应位不同,则结果该位为 1,
l 举例:计算 071^052
l 用途举例:使特定位翻转(与0异或保持原值,与1异或取反)
例如:要使 01111010 低四位翻转:
位运算——取反(~)
l 运算规则
n 单目运算符,对一个二进制数按位取反。
l 例:
025:0000000000010101
~025:1111111111101010
位运算——移位(<<、>>)
n 左移运算(<<)
左移后,低位补0,高位舍弃。
n 右移运算(>>)
右移后:
低位:舍弃
高位:
无符号数:补0
有符号数:补“符号位”
运算优先级、类型转换
运算符优先级
优先级 |
运算符 |
结合性 |
1 |
[ ] ( ) . –> 后置 ++ 后置 –– |
左→右 |
2 |
前置 ++ 前置 –– sizeof & * +(正号) –(负号) ~ ! |
右→左 |
3 |
(强制转换类型) |
右→左 |
4 |
.* ->* |
左→右 |
5 |
* / % |
左→右 |
6 |
+ – |
左→右 |
7 |
<< >> |
左→右 |
8 |
< > <= >= |
左→右 |
9 |
== != |
左→右 |
10 |
& |
左→右 |
11 |
^ |
左→右 |
12 |
| |
左→右 |
13 |
&& |
左→右 |
14 |
|| |
左→右 |
15 |
? : |
右→左 |
16 |
= *= /= %= += –= <<= >>=&= ^= |= |
右→左 |
17 |
, |
左→右 |
混合运算时数据类型的转换
l 一些二元运算符(算术运算符、关系运算符、逻辑运算符、位运算符和赋值运算符)要求两个操作数的类型一致。
l 在算术运算和关系运算中如果参与运算的操作数类型不一致,编译系统会自动对数据进行转换(即隐含转换),基本原则是将低类型数据转换为高类型数据。
条件 |
转换 |
|
有一个操作数是long double型。 |
将另一个操作数转换为long double型。 |
|
前述条件不满足,并且有一个操作数是double型。 |
将另一个操作数转换为double型。 |
|
前述条件不满足,并且有一个操作数是float型。 |
将另一个操作数转换为float型。 |
|
前述条件不满足(两个操作数都不是浮点数)。 |
有一个操作数是unsigned long long型。 |
将另一个操作数转换为unsigned long long型。 |
有一个操作数是long long型,另一个操作数是unsigned long型 |
两个操作数都转换为unsigned long long型。 |
|
前述条件不满足,并且有一个操作数是unsigned long型。 |
将另一个操作数转换为unsigned long型。 |
|
前述条件不满足,并且有一个操作数是long型,另一个操作数是unsigned int型。 |
将两个操作数都转换为unsigned long型。 |
|
前述条件不满足,并且有一个操作数是long型。 |
将另一个操作数转换为long型。 |
|
前述条件不满足,并且有一个操作数是unsigned int型。 |
将另一个操作数转换为unsigned int型。 |
|
前述条件都不满足 |
将两个操作数都转换为int型。 |
l 将一个非布尔类型的算术值赋给布尔类型时,算术值为0则结果为false,否则结果为true。
l 将一个布尔值赋给非布尔类型时,布尔值为false则结果为0,布尔值为true则结果为1
l 将一个浮点数赋给整数类型时,结果值将只保留浮点数中的整数部分,小数部分将丢失。
l 将一个整数值赋给浮点类型时,小数部分记为0。如果整数所占的空间超过了浮点类型的容量,精度可能有损失。
混合运算时数据类型的转换——显式转换
l 显式类型转换的作用是将表达式的结果类型转换为类型说明符所指定的类型。
l 语法形式
n 类型说明符(表达式)
n (类型说明符)表达式
n 类型转换操作符<类型说明符>(表达式)
n 类型转换操作符可以是:
const_cast、dynamic_cast、reinterpret_cast、static_cast
l 例:int(z), (int)z, static_cast<int>(z)
三种完全等价