C++语言基础
本章学习目标:
* 了解C++语言支持的数据类型;
* 熟悉C++的内置基本类型:字符、布尔、整数、浮点;
* 掌握变量和常量的定义、声明和初始化语法;
* 理解作用域的概念;
* 熟练掌握常用的运算符:书写规则、含义和用途;
* 理解运算符的优先级、结合性、副作用和表达式的值等概念;
* 熟练掌握各种基本语句及其用法;
* 熟练掌握分支结构:if语句和switch语句;
* 熟练掌握循环结构:while语句、for语句、范围for、do-while语句;
* 学会编写有基本数据处理和控制流的C++程序。
简单来说,程序就是为了得到所需结果而对一组数据进行加工处理的过程。因此,程序设计语言必须提供相应的元素或机制来描述程序要处理的数据和对这些数据的处理过程,于是就有了各种描述数据结构的数据类型、描述对数据进行处理的运算、描述复杂处理过程的语句和控制结构。编写程序就是熟悉这些元素并且恰当而准确地运用它们。本章介绍C++语言的内置基本数据类型、运算符和表达式、控制语句。
我们以一个简单的问题开始本章的学习:编写一个程序,要求用户输入表示圆半径的数值,程序计算这个圆形的面积并输出结果。
解决这个问题需要一些什么呢?
首先,简要描述出程序的处理流程:
步骤1:读取用户输入的半径并存储;
步骤2:用圆面积计算公式πR2计算面积;
步骤3:输出面积。
完成这些步骤的程序中需要包括下列元素:
. * 表示半径和面积的数据:一个变量保存输入的半径值,根据半径值的特点,这个数据是能表示小数的浮点类型;另一个变量保存计算得到的面积值,显然这个面积值也是浮点类型。
* 表示π:和上面两个数值不同,π的值是固定的,即常量,也是浮点类型。
* 表示面积计算公式:面积计算公式用包含算术运算符的表达式书写;结果通过赋值运算存放到面积变量中。
* 输入和输出:利用I/O流库中的cin和cout。
最终,编写的程序如3.1所示。
程序3.1 输入圆的半径,计算并输出其面积。
//---------------------------------------------------------
#include
using namespace std;
int main(){
const double PI = 3.14159; //常量π的定义
cout double radius, area = 0; //定义变量radius和area
cin >> radius; //输入半径
area = PI * radius * radius ; //计算面积
cout return 0;
}
//----------------------------------------------------------
3.1 基本内置类型
程序中的各种加工和处理都是针对某些数据进行的,这些数据由数据类型描述。数据类型是程序的基础,决定了程序中数据的意义和能对数据执行的操作。
C++语言支持广泛的数据类型。它定义了内置的基本类型和复合类型,同时为程序员提供了自定义数据类型的机制。C++标准库基于此定义了一些常用的类型,以便程序员使用。C++中数据类型的大致分类如图3.1所示。
图3.1 C++数据类型的大致分类
C++定义了一组基本数据类型,包括算术类型和空类型(void)。算术类型包括字符类型、布尔类型、整数类型和浮点类型。空类型不对应具体的值,用于指针和函数返回类型。
3.1.1 算术类型
算术类型分为整值类型(包括布尔类型和字符类型)和浮点类型两类。数据类型规定了数据的存储结构(宽度和布局)、可以进行的运算和取值范围。算术类型的宽度,即占据的内存位数在不同机器上有所差别。C++标准规定了算术类型内存位数的最小值,如表3.1所示,编译器在实现时可以赋予更大的值。
表3.1 C++算术类型
类 型
含 义
最 小 位 数
布尔类型
bool
逻辑值
未定义
字符类型
char
ASCII字符
8位
wchar_t
宽字符
16位
char16_t
Unicode字符
16位
char32_t
Unicode字符
32位
整数类型
short
短整型
16位
int
整型
32位
long
长整型
32位
long long
长整型(C++11)
64位
浮点类型
float
单精度浮点数
6位有效数字
double
双精度浮点数
6位有效数字
long double
扩展精度浮点数
10位有效数字
提示:计算机内存由有序的字节(byte)序列组成,用于存储程序中的数据。大多数机器的一个字节占8位(bit)。各种类型的数据都被编码为字节序列,数据如何编码和解码根据编码模式确定,由系统自动完成。在指定机器上进行整数运算的自然单位是字(word),一般来说,字的空间足够存放地址。每个字由若干个字节组成,例如,32位机器的每个字通常占据4个字节,64位机器的每个字占8个字节。
内存中的每个字节都有一个唯一的地址,用这个地址确定字节的位置,以便存储和获取数据。内存中的每个字节有两项相关信息:一是字节的地址,二是该字节中存放的内容。内存字节的内容永远非空,一旦放入新信息,该字节的原有内容就会消失。
布尔类型表示逻辑值,用bool关键字定义。bool类型只有两个值:true(真)或false(假)。
基本的字符类型char,通常用来表示单个字符或小整数,宽度和一个机器字节一样,足以存放机器基本字符集中任意字符对应的数字值。标准库头文件中的符号常量CHAR_BIT定义了char的位数。
其他字符类型用于扩展字符集。wchar_t类型用于确保可以存放机器扩展字符集中的任意一个字符;char16_t用于存储UTF-16编码的Unicode数据;char32_t用于存储UTF-32编码的Unicode数据。wchar_t类型是C++98标准为了支持Unicode编码引入的,但未定义其宽度,在不同机器上有不同实现:8位、16位、32位,导致了移植性差的问题。C++11标准引入了后两种新的字符类型来存储不同编码长度的Unicode数据。
short、int、long、long long表示不同宽度的整数类型。C++标准规定:short的宽度最少16位;int至少和short一样大;long最少32位宽度且至少和int一样大;long long最少64位且至少和long一样大。
浮点类型可以表示单精度、双精度和扩展精度值。浮点数的内部表示不同于整型,采用类似于数值和缩放因子两部分表示的方式。C++编译器大都实现了比标准规定更高的精度。通常float以32位表示,double以64位表示,long double以96或128位表示。float和double一般分别有7和16个有效数位;long double常用于有特殊浮点需求的硬件,精度随具体实现而不同。
各种类型数据在内存空间中实际占据的大小依赖于具体实现,即由编译器及其平台决定。C++的sizeof运算符可以计算得出类型或变量在内存中占据的字节数,如程序3.2所示。
程序3.2 内置基本数据类型的内存字节数。
//------------------------------------------------------------------
#include
using namespace std;
int main(){
//整值类型
cout cout cout cout cout cout cout cout cout //浮点类型
cout cout cout return 0;
}
//------------------------------------------------------------------
程序的运行结果(Windows 10平台,GCC4.9.2编译器):
bool: 1
char: 1
wchar_t: 2
char16_t: 2
char32_t: 4
short: 2
int: 4
long: 4
long long: 8
float: 4
double: 8
long double: 12
……