<C++>1 C++ 基础知识
本文最后更新于:2023年6月27日 上午
1 C++ 基础知识
根据是否可以操作计算机底层硬件,将程序设计语言分为:低级语言、中级语言、高级语言。
机器语言和汇编语言属于低级语言,因为它们能直接操作计算机的寄存器和内存。
高级语言是面向用户的语言。很多语言在形式上接近算术语言和自然语言,程序员编写方便。使用高级语言编写的程序易读且通用性强,但大部分不能直接接触硬件,也不能直接在计算机上执行。C++ 语言就属于高级语言的范畴。
C++ 既有高级语言的形式,也能在一定程度上以特定方式直接操作硬件。有些观点也将 C++ 划分到中级语言一类。
C 语言是 C++ 的前身。可以认为 C++ 语言是 C 语言的超集。标准的 C 程序也能在 C++ 开发环境下运行。
前置操作:配置 Visual Studio
示范一个简单的 C++ 代码
#include <iostream>
using namespace std;
int main() {
cout << "Melody is learning c++" << endl;
system("pause");
return 0;
}
1.1 注释
在代码中添加的说明和解释,用以增强代码可读性
-
单行注释:
... //单行注释
-
多行注释:
... /*多行注释*/
1.2 标识符
1.2.1 变量
命名一段指定的数据空间,以便后续调用
语法:数据类型 变量名 = 初始值
//数据类型 变量名 = 初始值;
int n = 0;
1.2.2 常量
常量用于记录程序中不可修改的数据
C++ 中对常量有两种定义方式:
- #define 宏常量:
#define 常量名 常量值
- const 修饰的变量:
const 数据类型 常量名 = 常量值
#include <iostream>
using namespace std;
//声明一个宏常量。宏常量通常放在文件上方
#define num 7
int main() {
//声明一个 const 修饰的变量
const int n = 100;
cout << n + num << endl;
system("pause");
return num;
}
1.2.3 关键字
C++ 中预先保留的单词(标识符)。这些单词不能被用于定义变量名或常量名。
具体有哪些?略……
1.2.4 标识符命名规则
- 标识符名称不能是关键字
- 标识符名称只能由 字母、数字、下划线 组成
- 第一个字符必须是 字母或下划线(即,不能以数字开头)
- 表示符中字母区分大小写
- 在相同作用域内,标识符不能重复进行定义。
1.3 数据类型
C++ 中创建变量或常量时,必须指定相应的数据类型
1.3.1 整形
整数类型的数据
C++ 中的整形有以下几种,其取值范围与所占空间不同
数据类型 | 占用空间 | 表示范围 |
---|---|---|
short | 2 字节 | -2^15^ ~ 2^15^ - 1 |
int | 4 字节 | -2^31^ ~ 2^31^ - 1 |
long | 4 字节(Windows、32 位 Linux)或 8 字节(64 位 Linux) | -2^31^ ~ 2^31^ - 1 |
long long | 8 字节 | -2^63^ ~ 2^63^ - 1 |
语法:
int n = 0;
long l = 0;
long long ll = 0;
1.3.2 实型(浮点型)
用于表示小数
有以下几种:
数据类型 | 占用空间 | 表示范围 |
---|---|---|
float | 4 字节 | 7 位有效数字 |
double | 8 字节 | 15 ~ 16 位有效数字 |
语法:
float f = 3.14f; //这里和 Java 相同,float 需要加上 f
double d = 3.14;
float f2 = 3e3; //科学计数法。3e3 == 3 * 10 ^ 3
double d2 = 3e-10; //科学计数法。3e-10 == 3 * 10 ^ -10
1.3.3 字符型
用于显示单个字符,占用 1 字节
存放时,存放的是字符对应的 ASCII 编码
几个重要的 ASCII 码:
- a:97
- A:65
- 0:48
经测试,C++ 中的 char 也可以作为数字进行运算
语法:
char c = 'a';
char c1 = 99; //这个场合,c1 是 'c'
char c2 = 'a' + 9; //这个场合,c2 是 'j'
int n = c2 - 16; //这个场合,n 是 90
#1.3.3.1 转义字符
用于表示一些不能显示出来的 ASCII 字符
转义字符 | 含义 |
---|---|
\a |
警报 |
\b |
退格,将当前位置前移一列 |
\f |
换页,将当前位置移到下页开头 |
\n |
换行,将当前位置移到下一行开头 |
\r |
回车,将当前位置移到本行开头 |
\t |
水平制表 |
\v |
垂直制表 |
\\ |
一个反斜线 \ |
\' |
一个单引号 ‘ |
\? |
一个问号 ? |
1.3.4 字符串型
用于表示一串字符
两种风格:
-
C 风格字符串:
char 变量名[] = "字符串值";
char str1[] = "字符串1"; //注意不能这样写:char[] str2 = "..";
-
C++ 风格字符串:
string 变量名 = "字符串值";
使用前需要包含 string 的头文件
#include <string> ... string str2 = "字符串2";
1.3.5 布尔类型
bool 代表真或假的值,占用 1 字节
bool 类型只有两个值:
- true —— 真(本质是1)
- false —— 假(本质是0)
布尔类型中,只要是非 0,就代表真
语法:
bool b = true;
cout << b << endl; //此处输出 1
1.3.6 sizeof 关键字
该关键字可以统计数据类型所占内存的大小
语法:sizeof(数据类型/常量)
#include <iostream>
using namespace std;
#define num 7
int main() {
const long long n = 100;
int n2 = 0;
cout << sizeof(num) << endl; //输出 4
cout << sizeof(n) << endl; //输出 8
cout << sizeof(n2) << endl; //输出 4
cout << sizeof(n2 + num + n) << endl; //输出 8
cout << sizeof(short) << endl; //输出 2
system("pause");
return num;
}
1.4 运算符
用于执行代码的运算
这里主要介绍以下四种:
- 算术运算符:处理四则运算
- 赋值运算符:用于将表达式的值赋给变量
- 比较运算符:用于表达式的比较,返回布尔值
- 逻辑运算符:根据表达式的值返回布尔值
1.4.1 算术运算符
处理四则运算
-
+
:正号、相加(+3、3 + 2) -
-
:负号、相减 -
*
:乘 -
/
:除 -
%
:取模(10 % 3)两个小数间不能进行取模运算
-
++
:递增(a++、++a)++a
即前置递增、a++
即后置递增。前置递增先递增,后运算表达式;后置递增先运算表达式,后递增。
-
--
:递减
1.4.2 赋值运算符
用于把表达式的值赋给变量
-
=
:赋值int a1, a2, a3; a1 = a2 = a3 = 1; //这样写也是可以的
-
+=
:加等于a += 2
即a = a + 2
-=
、*=
、/=
、%=
同理
1.4.3 比较运算符
用于表达式的比较
==
:相当于!=
:不等于<
:小于>
:大于>=
:大于等于<=
:小于等于
1.4.4 逻辑运算符
!
:非&&
:与(只要有一个为假即为假)||
:或(只要有一个为真即为真)
1.4.5 强制类型转换运算符
当不同类型的量进行混合算术运算时,系统会自动进行合理的类型转换。也能在程序中使用强制类型转换符进行转换。
-
static_cast<类型>(表达式)
:用于将一种数据类型转换成另一种数据类型double d = 3.2; double n = static_cast<int>(d * 2);
-
const_cast<类型>(表达式)
:用于去除指针和引用的常量性。const int* const n = new int(2); // 常量指针常量 int* i = const_cast<int*>(n); *i += 1; cout << *n << endl; // 3 cout << *i << endl; // 3
——见 [4.1 指针]
将常量指针转化为非常量指针,且仍指向原来的对象。
或者,将常量引用转化为非常量引用,且仍指向原来的对象。
特别地,该运算符不能去除变量的常量性:
const int n = 10; // 常量 int* a = const_cast<int*>(&n); *a += 5; cout << a << "\t" << *a << endl; // 000000BBFCEFF7D4 15 cout << &n << "\t" << n << endl; // 000000BBFCEFF7D4 10
出现了地址相同,但值不同的奇观!
1.5 数据的输入与输出
在 C++ 中,类库中提供了输入流类 istream 和输出流类 ostream。
cin 和 cout 分别是 istream 类对象和 ostream 类对象。用来实现键盘输入和屏幕输出。
从输入流中获取数据的操作称为提取操作。向输出流中添加数据的操作称为插入操作。
运算符 >>
和 <<
是移位操作符。但 C++ 类库的头文件中对其进行了重载,使其分别作为 流提取运算符 和 流插入运算符。
当程序中用到 cin 和 cout 时,需要在程序中包含头文件 <iostream>
#include<iostream>
#数据的输入:
可以使用流提取运算符从键盘输入数据并赋值:
int x;
int y;
cin >> x >> y;
cin 中的变量可以是任意基本类型的变量。连续从键盘读取数据时,以空格、制表符或换行为分隔符。
当读取数据时,cin 会忽略并清除第一个空格、制表符或换行符,继续读取下一个字符。这意味着不能将空格、制表符会换行符输入给字符变量。如有需要,应使用 getchar() 函数
使用 cin 输入时,如果输入的是字符类型,则系统会根据变量类型从输入流中提取相应长度的字节。如果输入的是数值类型,需要用空格、制表符或换行符将各个数值分开
字符串可以是字符数组 char[],也能是 string 对象。
#数据的输出:
cout 是一个标准输出对象。使用流插入运算符向屏幕设备输出信息:
cout << "☆" << "★";
cout 语句中的表达式可以是各种基本类型的变量、常量,及由变量和常量组合得到的正确表达式。
在输出时,字符串过长的场合,添加符号 \
就能将字符串分为多行
cout << "这是一个不那么长,\
但我们可以想象它很长的字符串。";
其实咱不妨就把上面的字符串分为两段输出
cout << "这是一个不那么长,"
<< "但我们可以想象它很长的字符串。";
1.6 头文件和命名空间
#头文件:
C++ 中使用头文件保存程序中用到的声明,如函数声明、常量定义等。
需要先用 #include
语句包含头文件,进而使用该头文件包含的内容
每条 #include
语句仅能包含一个头文件。要包含多个头文件时,要使用多条语句
#include<iostream> // 包含标准输入输出流
#include<string> // 包含 string 字符串类
#include<cmath> // 包含标准数学函数
#include"myh.h" // 包含了一个自定义的头文件 myh.h
#include"d:\temp\myh.h" // 包含了 d:\temp\ 目录下的一个自定义的头文件 myh.h
使用尖括号 < >
时,C++ 编译器首先在 C++ 系统设定的目录中寻找要包含的头文件。没有找到时,再去指令指定的目录去找。
使用双引号 “ ”
时,C++ 编译器在用户当前目录下或指令指定的目录下寻找头文件。
#命名空间:
#include<iostream>
using namespace std; // 使用命名空间 std
一个大型程序通常由不同模块组成。各个模块间的标识符可能重名。为避免命名冲突,C++ 引入了命名空间的概念。
定义一个命名空间的语法如下:
namespace 空间名 {
...
}
命名空间又称名字空间。使用关键字 namespace 把大量有逻辑联系的程序实体组合在一个标识符下。
C++ 标准程序库中所有标识符都定义在命名空间 std 中。当程序使用标准程序库的标识符时,如果没有使用 std 命名空间,则 cin、cout、string 乃至 endl 都不能识别。
引用其他命名空间标识符的语法如下:
命名空间名::标识符名;
也能使用 using 语句,简化上述写法。
using 命名空间名::标识符名; // 可以在本文件中使用指定标识符
using namespace 命名空间名; // 可以在本文件中使用该命名空间中的所有标识符