C++基础入门Day1
引言
1. 程序
- 用于指导计算机执行特定的任务或解决特定的问题
- 程序可以完成各种各样的任务,从简单的数学运算到复杂的数据分析、图形渲染、网络通信,乃至控制其他设备。
为什么需要程序?
- 小任务量下的项目无法发挥程序的优势,凭借人力可以很迅速的完成,如:将3,1,2按照由低到高的顺序排列。
- 当任务量较大时,人力往往完成速度较慢,且很难保证准确性,此时需要借助计算机的算力辅助,如:将11,92,14,56,76,29,55,39,40,65按照由低到高的顺序排列(既然10个数已经很“费力”了,那100,1000,…呢?)
#include <iostream>
using namespace std;
int main() {
// 定义数组
int numbers[] = {11, 92, 14, 56, 76, 29, 55, 39, 40, 65};
int n = sizeof(numbers) / sizeof(numbers[0]);
// 冒泡排序
for (int i = 0; i < n - 1; ++i) {
for (int j = 0; j < n - i - 1; ++j) {
if (numbers[j] > numbers[j + 1]) {
// 交换元素
int temp = numbers[j];
numbers[j] = numbers[j + 1];
numbers[j + 1] = temp;
}
}
}
// 打印排序后的结果
cout << "排序后的数字:";
for (int i = 0; i < n; ++i) {
cout << numbers[i] << " ";
}
return 0;
}
- 借助计算机帮助人类处理复杂任务是必要的,那么如何将人类的思想传达给计算机呢?——程序,如当前使用的Word,Excel,浏览器,游戏,微信……都是程序。
- 而程序是如何做成的?——编程技术,即借助编程语言在编辑器(VScode,Visual Studio,Dev C++)编写代码,调试,运行,最终得到我们想要的程序。
2. 编程语言
编程语言是一种人类和计算机之间进行通信工具,它为程序员提供了一种结构化的方式来描述计算机执行的任务。当编写程序时,程序员使用编程语言编写代码,然后通过编译器或解释器将其转换为计算机能够执行的机器代码。下面是编程语言操作计算机的基本原理:
-
高级语言与低级语言: 编程语言可以分为高级语言和低级语言。高级语言(如Python、Java)更接近自然语言,提供了更丰富的抽象和易用性,而低级语言(如汇编语言、机器语言)更接近计算机硬件,直接操作计算机资源。
-
编写源代码(学习重点): 程序员使用编程语言编写源代码,描述所需的算法、逻辑和数据处理。源代码是人类可读的文本形式。
-
编译或解释: 编程语言通常需要通过编译器或解释器将源代码转换为计算机能够执行的形式。编译器将整个源代码一次性转换为机器代码,而解释器逐行地解释执行源代码。
- 编译过程: 源代码 -> 编译器 -> 目标代码(或直接变成机器代码) -> 可执行文件
- 解释过程: 源代码 -> 解释器 -> 计算机执行
-
生成可执行文件: 在编译过程中,生成的目标代码可以打包成可执行文件。这个文件包含了计算机硬件可以直接执行的二进制指令。
-
计算机执行: 生成的可执行文件可以在计算机上运行。计算机的中央处理单元(CPU)执行这些指令,按照程序中描述的算法和逻辑进行计算和操作。
*当前主流编程语言
-
JavaScript: 用于前端开发的主流语言,也可用于服务器端(Node.js)。支持异步编程,广泛用于构建交互式的Web界面。
-
Python: 以简洁易读的语法著称,广泛应用于数据科学、机器学习、Web开发、自动化脚本等领域。
-
Java: 一种面向对象的编程语言,用于构建大型企业级应用、Android应用以及分布式系统。
-
C++(学习内容): 一种通用目的的编程语言,广泛用于系统开发、游戏开发、嵌入式系统等领域。
-
C#(学习内容): 由Microsoft开发,主要用于Windows生态系统中的应用程序开发,尤其是桌面和游戏开发(Unity引擎)。
3.学会C++能干什么
-
软件开发: C++常用于开发桌面应用程序、服务器端软件以及性能敏感的应用,比如数据库软件、商业产品等。
-
游戏开发(跳一跳): C++是游戏开发行业的主流语言之一,尤其是在大型游戏引擎(如Unreal Engine)和游戏开发中,由于其高性能特性,适合开发要求高性能渲染、物理模拟的游戏。
-
操作系统开发: 虽然操作系统核心通常用C语言编写,但C++也被用于开发操作系统的某些部件和应用程序。
-
机器学习和数据分析: 尽管Python在这一领域更受欢迎,但C++也被用于开发性能敏感的机器学习库和框架,如TensorFlow的一些底层实现就使用了C++。
-
网络和通信: C++用于开发高性能的服务器和网络应用程序,包括Web服务器、邮件服务器以及基于TCP/IP的通信应用。
课程大致安排:
- C++基础知识*0.6
- C++项目实战(跳一跳游戏开发)*0.3
- 答疑+扩展性内容*0.1
1.1 第一个C++程序
编写一个C++程序需要四个步骤
- 创建项目
- 创建文件
- 编写代码
- 运行程序
1.1.1 创建项目
VS2022
1.1.2 创建文件
main.cpp
1.1.3 编写代码
注意:编写时键盘必须调整成英文
- 基本框架
#include <iostream>
using namespace std;
int main() {
system("pause");
return 0;
}
- 第一个程序-HelloWorld:
cout << "hello world" << endl;"
- 双引号中所写的字符串是可以任意修改:
cout << "hello c++" << endl;"
- cout后跟随的内容可以打印在控制台上
- 双引号中所写的字符串是可以任意修改:
1.2 注释
- 在代码中添加一些说明和解释,方便自己和其他程序员阅读代码
- 给程序员自己看的,不是给计算机看的
- 语法格式
- 单行注释:
// 描述信息(一行)
- 多行注释:
/* 描述信息(多行) */
- 单行注释:
- main函数
- 错误示例:
int main1() {}
- 错误示例:
#include <iostream>
using namespace std;
// 1.单行注释
/*
2.多行注释
多行注释
多行注释
*/
/*
main是一个程序的入口
每个程序必须有main函数
有且仅有一个
*/
int main() {
// 向控制台输出hello world
cout << "hello world" << endl;
system("pause");
return 0;
}
1.3 变量
- 给一段指定的内存空间起名,方便操作这段内存
- 语法格式:
数据类型 变量名 = 初始值;
1.3.1 内存的概念
内存是计算机中用于存储数据和程序的临时存储器件。它在计算机工作过程存储正在运行的程序和数据,以便CPU能够快速地访问和处理这些信息。
1.3.2 内存的表示
- 每段内存都有一段属于自己的地址编号,用十六进制的数字来表示
- 数字10对应编号 0x1234
- 缺点:100个数字要记录100个地址编号,太麻烦
- 用特定的名称表示内存
- 数字10对应变量a,通过a就可以访问10(按照高中数学里的变量理解即可)
- 语法格式:
数据类型 变量名 = 初始值;
int a = 10;
#include <iostream>
using namespace std;
int main() {
// 创建变量a
int a = 10;
cout << "a=" << a << endl;
system("pause");
return 0;
}
1.3.3* 内存扩展
1. 内存容量的单位
- 位(Bit):是计算机内存和存储的最基本单位,代表一个二进制数字,0或1。
- 字节(Byte):常用的内存单位,1字节等于8位。字节是最小的可寻址内存单位。
- 千字节(KB,Kilobyte):1KB 约等于 1,000 字节(实际上在计算机科学中,经常按照 2 的幂来定义,即 1 K B = 2 10 = 1024 1KB = 2^{10} = 1024 1KB=210=1024 字节)。
- 兆字节(MB,Megabyte):1MB 约等于 1,000,000 字节或 1,024 KB。
- 吉字节(GB,Gigabyte):1GB 约等于 1,000,000,000 字节或 1,024 MB。
- 太字节(TB,Terabyte):1TB 约等于 1,000,000,000,000 字节或 1,024 GB。
2. 地址的十六进制数表示
- 内存地址:每个存储在内存中的字节都有一个唯一的地址,这些地址用于定位和访问内存中的数据。地址通常以十六进制数表示。具体来说,有以下几个原因:
-
简化表示: 十六进制数可以更简洁地表示二进制数。由于计算机的基础是二进制系统,而每四位二进制数(比特)刚好可以用一个十六进制数字来表示,这种对应关系简化了长二进制数串的表示。例如,二进制的
1101 1010 1111 0001
可以用十六进制的DAF1
来表示,大大减少了表示的长度。 -
易于转换: 二进制与十六进制之间的转换非常直接,不需要复杂的计算。
-
节省空间: 在文档、代码和界面中使用十六进制可以节省空间。例如,用十六进制表示内存地址时,相比二进制需要的空间少得多,这在编程、系统设计文档和教程中尤其有用。
3. 进制转换
数制转换是在不同的进制之间转换数值的过程,常见的进制包括二进制(基数为2)、十进制(基数为10)和十六进制(基数为16)。下面将介绍这三种数制之间的转换方法。
二进制与十进制之间的转换
-
二进制转十进制:将每个二进制位乘以其对应的2的幂次方值,然后将这些值相加得到十进制数。
例如,二进制
1011
转换为十进制:
1 × 2 3 + 0 × 2 2 + 1 × 2 1 + 1 × 2 0 = 8 + 0 + 2 + 1 = 11 1 \times 2^3 + 0 \times 2^2 + 1 \times 2^1 + 1 \times 2^0 = 8 + 0 + 2 + 1 = 11 1×23+0×22+1×21+1×20=8+0+2+1=11 -
十进制转二进制:将十进制数不断除以2,记录每次的余数,直到商为0。然后将余数逆序排列得到二进制数。
例如,十进制
13
转换为二进制:- 13 ÷ 2 = 6 13 \div 2 = 6 13÷2=6 余 1
- 6 ÷ 2 = 3 6 \div 2 = 3 6÷2=3 余 0
- 3 ÷ 2 = 1 3 \div 2 = 1 3÷2=1 余 1
- 1 ÷ 2 = 0 1 \div 2 = 0 1÷2=0 余 1
所以,13的二进制为
1101
。
二进制与十六进制之间的转换
-
二进制转十六进制:将二进制数每四位一组(从右向左)转换成对应的十六进制数。如果最左边的组不足四位,则在前面补零。
例如,二进制
11010111
转换为十六进制:- 分为两组:
1101
和0111
1101
对应十六进制的D
,0111
对应十六进制的7
所以,二进制的
11010111
等于十六进制的D7
。 - 分为两组:
-
十六进制转二进制:将每个十六进制位转换成对应的四位二进制数。
例如,十六进制
1A3
转换为二进制:1
对应二进制的0001
A
(即十进制的10)对应二进制的1010
3
对应二进制的0011
所以,十六进制的
1A3
等于二进制的000110100011
。
1.4 常量
- 用于记录程序中不可更改的数据
在C++中,定义常量的两种主要方式是使用#define
预处理器指令和const
关键字。这两种方式各有特点和用
1.4.1 定义常量的两种语法格式
1. #define宏常量
-
#define
是一种预处理器指令,用于在编译之前替换文本。它不分配存储空间,仅仅在预处理阶段将所有的标识符替换为定义的值。其语法如下:`#define identifier value -
identifier
是要定义的常量名,value
是与之关联的值。例如:#define PI 3.14159
-
这行代码定义了一个常量
PI
,其值为3.14159。在程序中,每次使用PI
时,预处理器都会将其替换为3.14159。 -
使用
#define
定义的常量具有全局作用域,且没有类型,它们仅仅是文本替换,因此不能保证类型安全。
2. const修饰的变量
-
const
关键字用于定义常量变量,即值不能被修改的变量。与#define
不同,使用const
定义的常量具有类型,编译器可以进行类型检查,从而提高程序的安全性。其语法如下:const type identifier = value;
-
type
是常量的数据类型,identifier
是常量的名称,value
是常量的值。例如:const double Pi = 3.14159;
-
这行代码定义了一个类型为
double
的常量Pi
,其值为3.14159。使用const
定义的常量遵循正常的作用域规则,这意味着它们可以是局部的或全局的,依赖于它们定义的位置。
3*.作用域简介
作用域指的是程序中定义的变量和函数可被访问的区域。根据变量或函数定义的位置,作用域决定了哪些部分的程序可以使用这些变量或函数,以及如何使用它们。作用域有助于限制变量生命周期和可见性,从而提高程序的可读性、可维护性和避免命名冲突。
-
局部作用域(Local Scope): 局部作用域通常指的是在函数或代码块(如
if
语句、循环等)内部定义的变量。这些变量只能在它们被定义的那个函数或代码块中被访问和修改,对外部是不可见的。 -
全局作用域(Global Scope): 在所有函数之外定义的变量拥有全局作用域,这意味着它们可以在程序的任何地方被访问和修改。全局变量的生命周期从它们被定义开始,直到程序结束。
#include <iostream>
using namespace std;
// 使用#define定义常量
#define MAX_SIZE 100
int main() {
// 使用const定义常量
const float PI = 3.14159f;
cout << "The maximum size is: " << MAX_SIZE << endl;
cout << "The value of Pi is: " << PI << endl;
system("pause");
return 0;
}
注意:常量一旦被定义以后便不可以修改,否则报错
const float PI = 3.14159f;
PI = 1;
1.5 关键字(标识符)
- C++中预先保留的单词
- 在命名变量和常量时,不能使用关键字,不需要记忆,有印象即可
基本关键字
关键字 | 描述 |
---|---|
int | 定义整数类型 |
float | 定义单精度浮点数类型 |
double | 定义双精度浮点数类型 |
char | 定义字符类型 |
void | 表示无返回值或空类型 |
bool | 定义布尔类型 |
控制流关键字
关键字 | 描述 |
---|---|
if | 条件语句,用于执行条件为真的代码块 |
else | 在if 语句条件为假时执行的代码块 |
switch | 多分支选择语句 |
case | 在switch 语句中标识不同的分支 |
default | switch 语句中的默认分支 |
while | 循环语句,当条件为真时执行代码块 |
do | 循环语句,先执行一次代码块,然后检查条件 |
for | 循环语句,用于迭代指定次数的代码块 |
break | 中断当前循环或switch 语句 |
continue | 终止当前循环的迭代并开始下一次迭代 |
return | 从函数中返回值 |
数据类型关键字
关键字 | 描述 |
---|---|
struct | 定义结构体,可以包含不同类型的成员 |
class | 定义类,用于面向对象编程 |
enum | 定义枚举类型 |
union | 定义联合体,所有成员共享相同的内存空间 |
typedef | 为数据类型定义新的名称 |
auto | 自动推断变量类型 |
decltype | 返回表达式的类型 |
存储类关键字
关键字 | 描述 |
---|---|
static | 使局部变量在多次函数调用之间保持其值 |
extern | 声明变量或函数是在其他文件或模块中定义的 |
const | 定义只读变量,值不能被修改 |
volatile | 声明变量可能在程序的执行中被意外修改 |
register | 提示编译器将变量存储在寄存器中 |
mutable | 在类中声明的成员可以被const 成员函数修改 |
类型修饰符关键字
关键字 | 描述 |
---|---|
const | 声明常量,值不能被修改 |
volatile | 声明变量可能在程序的执行中被意外修改 |
mutable | 在类中声明的成员可以被const 成员函数修改 |
类型转换关键字
关键字 | 描述 |
---|---|
static_cast | 执行静态类型转换 |
dynamic_cast | 执行动态类型转换,用于运行时检查 |
const_cast | 从常量类型转换掉const 或volatile |
reinterpret_cast | 执行底层类型的转换 |
- 错误示例
#include <iostream>
using namespace std;
int main() {
// 不要用关键字给变量起名
int double a = 10;
system("pause");
return 0;
}
1.6 标识符命名规则
在C++中,标识符是用来标识变量、函数、类、对象等程序实体的名称。标识符的命名规则是一套约定俗成的规定,以确保程序的可读性、可维护性和一致性。以下是C++中标识符的命名规则:
-
保留字:
- 不允许使用C++中的保留字(关键字)作为标识符。
- 例如,不要将关键字
int
、class
、if
等用作标识符。
-
字符集规则:
- 标识符由字母、数字和下划线组成。
- 标识符的第一个字符必须是字母或下划线。
-
大小写敏感:
- C++是大小写敏感的语言,因此
myVariable
和MyVariable
被视为两个不同的标识符。
- C++是大小写敏感的语言,因此
-
规范命名风格:
- 通常推荐使用有意义的名称,以提高代码的可读性。
- 采用驼峰命名法(Camel Case)或下划线命名法(Snake Case)等命名规范。
- 驼峰命名法:
myVariableName
,calculateTotalAmount()
- 下划线命名法:
my_variable_name
,calculate_total_amount()
- 驼峰命名法:
举例
-
保留字:
// 不要使用关键字作为标识符 int int = 10; // 错误,使用了关键字 int double class = 3.14; // 错误,使用了关键字 class
-
字符集规则:
// 合法的标识符 int myVariable; float my_float_variable; char _firstChar; // 非法的标识符 int 123number; // 错误,数字不能作为首字符 double total@mount; // 错误,含有特殊字符 @
-
大小写敏感:
// 大小写敏感 int myVariable; int MyVariable; // 这两个是不同的变量
-
规范命名风格:
-
驼峰命名法:
int numberOfStudents; float averageGrade; void calculateTotalAmount();
-
下划线命名法:
int number_of_students; float average_grade; void calculate_total_amount();
-