语法总结
前言
意识到Python和C++在一些数据处理方面有显著的不同,因此做一些学习记录。
上一期通过一些例子考虑了C++和Python的不同,这一期快速学习一下C++的基本语法。部分内容由GPT补充。
学习教程来源:https://www.runoob.com/cplusplus/cpp-tutorial.html
学习前的知识铺垫:对于计算机程序和计算机程序设计语言有基本的了解
C++简介
- C++可以被理解为带类的C。C++ 是 C 的一个超集,事实上,任何合法的 C 程序都是合法的 C++ 程序。
- C++ 是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。
标准库
- 核心语言。变量,数据类型,常量等等。
- 标准库。函数用于操作文件,字符串。
- 标准模板库STL
C++的在数据模拟方面的使用
科学计算和数值分析:C++ 可以用于开发科学计算和数值分析应用程序,如数值模拟和高性能计算等领域。由于这些应用程序需要高效的计算能力和对硬件的直接控制,C++ 语言是一个很好的选择。
- 科学计算 通常涉及到复杂的数学模型和数学问题求解,如微分方程、线性代数、优化问题等。
- 数值分析 是研究数学问题的数值解法,如数值积分、数值微分、方程求根等。
- C++ 被广泛用于开发需要进行大量计算的应用程序,如模拟物理现象的软件、天文数据分析、机器学习算法的实现等
C++环境设置
C++的语言环境需要两款可用软件:文本编辑器和C++编译器。通过编辑器创建的文件称为源文件,包含程序源代码。扩展名为.cpp,.cp,.c。编译器把人类可读的源文件中的源,转为机器可懂的机器语言。
C++基本语法
- 基本语法
- 对象
- 类
- 方法
- 即时变量
C++程序结构
- 头文件:包含程序中必须或者有用的信息
- 命名空间: namesapace, python中没这个概念
- 主函数
- 返回值
C++的编译执行
- 在文本编辑器中添加想要运行的代码。
- 保存文件为.cpp结尾的形式
- 打开命令提示符,进入保存文件所在的目录
- g++编译代码,没错误命令提示符跳到下一行,生成.out可执行文件
- 输入.out来运行程序
- 看到结果
C++的分号&语句块
1,;分号为结束语
2.{} 语句块为大括号括起来的按逻辑连接的语句
3.C++可以在一行放置多个语句
C++标识符
一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)。
例子:mohd zara abc move_name a_123
myname50 _temp j a23b9 retVal
C++ 中的空格
1.一部分是为了分割语句中的各个部分
2.一部分是为了增加可读性
C++注释
- // 单行注释
- /**/ 多行注释
数据类型
- 基本的内置类型
一共有七种基本的C++数据类型。
类型 | 关键字 |
---|---|
字符型 | char |
布尔型 | bool |
整型 | int |
浮点型 | float |
双浮点型 | double |
无类型 | void |
宽字符型 | wchar_t |
基本类型可以由一个或者多个类型修饰符进行修饰。修饰符:
- signed
- unsigned
- short
- long
数据所占用的字节数不同。类型转换能够将一个数据类型的值转换为另一种数据类型的值。
typedef声明
能够为一个已有的类取一个新名字。
C++变量类型
变量其实只不过是程序可操作的存储区的名称。
C++中的变量定义
格式:
int i, j, k;
char c, ch;
float f, salary;
double d;
type variable_name = value;
C++变量作用域
名称 | 特点 |
---|---|
局部变量 | 函数或一个代码块内部声明的变量。函数内,局部变量的值会覆盖全局变量的值 |
形式参数 | 在函数参数的定义中声明的变量 |
全局变量 | 在所有函数外部声明的变量 |
C++常量/修饰符类型
和Python差不太多,自己翻翻C++常量/修饰符就好,总结得很细致。
定义常量
两种定义方式。
- 使用#define预处理器。
#define identifier value
- 使用const关键字
const type variable = value;
C++储存类
名称 | 描述 |
---|---|
auto | 注:从 C++ 17 开始,auto 关键字不再是 C++ 存储类说明符,且 register 关键字被弃用。声明变量时根据初始化表达式自动推断该变量的类型、声明函数时函数返回值的占位符。 |
register | 用于定义存储在寄存器中而不是 RAM 中的局部变量。这意味着变量的最大尺寸等于寄存器的大小(通常是一个词) |
static | 指示编译器在程序的生命周期内保持局部变量的存在,而不需要在每次它进入和离开作用域时进行创建和销毁。 |
extern | 存储类用于提供一个全局变量的引用,全局变量对所有的程序文件都是可见的。 |
mutable | 仅适用于类的对象,允许对象的成员替代常量 |
thread_local | 使用 thread_local 说明符声明的变量仅可在它在其上创建的线程上访问。量在创建线程时创建,并在销毁线程时销毁。 每个线程都有其自己的变量副本。 |
C++运算符
名称 | 描述 |
---|---|
算术运算符 | 就是做算术运算,加减乘除这样 |
关系运算符 | 检查操作数之间的关系 |
逻辑运算符 | 与或非 |
位运算符 | 逐位进行操作,010101之间的变换 |
杂项运算符 | 其他的运算符 |
注意,运算符有优先级,可对表查看。 |
C++循环
和Python差不多,while,for,do…while,嵌套,等等。
循环的控制,break,continue,goto,等等,也和Python差不多。
C++判断
和Python相似,if, if…else, 嵌套if,switch,嵌套switch
条件运算符可以用来替代if…else语句。
Exp1 ? Exp2 : Exp3;
C++函数
return_type function_name( parameter list )
{
body of the function
}
返回类型,函数名称,参数,和函数主体。这部分也和Python大差不差。
函数的声明,C++中函数的声明和调用时分开的。
return_type function_name( parameter list );
Lambda 函数与表达式
Lambda函数即匿名函数,创建一个没有名字的函数。形式如下:
[capture](parameters)->return-type{body}
前面的方括号的作用:
[] // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&] // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=] // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x] // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。
C++数字
在要用到数字时,会使用原始的数据类型,如int、short、long、float 和 double。
生成随机数,需要的函数为rand()和srand(),使用rand()前要先使用srand()。
C++数组
声明数组的规范:
type arrayName [ arraySize ];
C++字符串
两种形式。
- C风格字符串
字符串实际上是使用 null 字符 \0 终止的一维字符数组。
- C++引入的string类型
C++指针
指针的作用是简化C++编程任务的执行,还有一些比如动态内存分配没有指针无法执行。
每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
指针的定义格式:
type *var-name;
指针声明:
int *ip; /* 一个整型的指针 */
double *dp; /* 一个 double 型的指针 */
float *fp; /* 一个浮点型的指针 */
char *ch; /* 一个字符型的指针 */
例子:
#include <iostream>
using namespace std;
int main ()
{
int var = 20; // 实际变量的声明
int *ip; // 指针变量的声明
ip = &var; // 在指针变量中存储 var 的地址
cout << "Value of var variable: ";
cout << var << endl;
// 输出在指针变量中存储的地址
cout << "Address stored in ip variable: ";
cout << ip << endl;
// 访问指针中地址的值
cout << "Value of *ip variable: ";
cout << *ip << endl;
return 0;
}
C++引用
把引用当成是变量附属在内存位置中的第二个标签。
例子:
int& r = i;
double& s = d;
#include <iostream>
using namespace std;
int main ()
{
// 声明简单的变量
int i;
double d;
// 声明引用变量
int& r = i;
double& s = d;
i = 5;
cout << "Value of i : " << i << endl;
cout << "Value of i reference : " << r << endl;
d = 11.7;
cout << "Value of d : " << d << endl;
cout << "Value of d reference : " << s << endl;
return 0;
}
C++ 的基本输入输出
- 输入操作:从设备(键盘,磁盘驱动器,网络连接)流向内存。
- 输出操作:从内存流向设备(显示屏,打印机,磁盘驱动器,网络连接)
C++数据结构
C/C++ 数组允许定义可存储相同类型数据项的变量,结构是 C++ 中另一种用户自定义的可用的数据类型,允许存储不同类型的数据项。
struct type_name {
member_type1 member_name1;
member_type2 member_name2;
member_type3 member_name3;
.
.
} object_names;
type_name | 结构体类型的名称 |
---|---|
member_type1 member_name1 | 标准变量的定义 |
访问结构的成员使用成员访问运算符(.)
一个清晰的例子:
#include <iostream>
#include <cstring>
using namespace std;
// 声明一个结构体类型 Books
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Runoob");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "Runoob");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 输出 Book1 信息
cout << "第一本书标题 : " << Book1.title <<endl;
cout << "第一本书作者 : " << Book1.author <<endl;
cout << "第一本书类目 : " << Book1.subject <<endl;
cout << "第一本书 ID : " << Book1.book_id <<endl;
// 输出 Book2 信息
cout << "第二本书标题 : " << Book2.title <<endl;
cout << "第二本书作者 : " << Book2.author <<endl;
cout << "第二本书类目 : " << Book2.subject <<endl;
cout << "第二本书 ID : " << Book2.book_id <<endl;
return 0;
}
使用指针:
结构:
struct Books *struct_pointer;
清晰代码:
#include <iostream>
#include <cstring>
using namespace std;
void printBook( struct Books *book );
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
Books Book1; // 定义结构体类型 Books 的变量 Book1
Books Book2; // 定义结构体类型 Books 的变量 Book2
// Book1 详述
strcpy( Book1.title, "C++ 教程");
strcpy( Book1.author, "Runoob");
strcpy( Book1.subject, "编程语言");
Book1.book_id = 12345;
// Book2 详述
strcpy( Book2.title, "CSS 教程");
strcpy( Book2.author, "Runoob");
strcpy( Book2.subject, "前端技术");
Book2.book_id = 12346;
// 通过传 Book1 的地址来输出 Book1 信息
printBook( &Book1 );
// 通过传 Book2 的地址来输出 Book2 信息
printBook( &Book2 );
return 0;
}
// 该函数以结构指针作为参数
void printBook( struct Books *book )
{
cout << "书标题 : " << book->title <<endl;
cout << "书作者 : " << book->author <<endl;
cout << "书类目 : " << book->subject <<endl;
cout << "书 ID : " << book->book_id <<endl;
}