From da343a42968ccb380488884dcc8bfce7ed0f3013 Mon Sep 17 00:00:00 2001 From: 7Wate Date: Thu, 28 Apr 2022 11:42:32 +0800 Subject: [PATCH] =?UTF-8?q?C++=EF=BC=9A=E5=9F=BA=E6=9C=AC=E8=AF=AD?= =?UTF-8?q?=E6=B3=95=EF=BC=88=E9=87=8D=E6=9E=84=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/开发/C++/基本语法.md | 345 +++++++++++++++++++++++++++++++++++++- 1 file changed, 343 insertions(+), 2 deletions(-) diff --git a/docs/开发/C++/基本语法.md b/docs/开发/C++/基本语法.md index 65c33589..a06ff6ae 100644 --- a/docs/开发/C++/基本语法.md +++ b/docs/开发/C++/基本语法.md @@ -2,5 +2,346 @@ id: 基本语法 title: 基本语法 sidebar_position: 2 -data: 2022年2月17日 ---- \ No newline at end of file +data: 2022年2月18日 +--- + +C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。 + +- **对象 -** 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。 +- **类 -** 类可以定义为描述对象行为/状态的模板/蓝图。 +- **方法 -** 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。 +- **即时变量 -** 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。 + +## 数据类型 + +### 内置类型 + +| 类型 | 关键字 | +| -------- | ------- | +| 整型 | int | +| 浮点型 | float | +| 双浮点型 | double | +| 无类型 | void | +| 宽字符型 | wchar_t | +| 布尔型 | bool | +| 字符型 | char | + +### 枚举类型 + +枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。 + +```c++ +// 创建枚举,需要使用关键字 enum +enum enum-name { list of names } var-list; + +// 颜色枚举,变量 c 的类型为 color +enum color { red, green, blue } c;c = blue; + +// 默认情况下,第一个名称的值为 0,第二个名称的值为 1,第三个名称的值为 2,以此类推。 +// 但是也可以给名称赋予一个特殊的值,只需要添加一个初始值即可。 +// 在这里,blue 的值为 6,因为默认情况下,每个名称都会比它前面一个名称大 1。 +enum color { red, green=5, blue }; +``` + +### 常量类型 + +常量是固定值,在程序执行期间不会改变。这些固定的值,又叫做**字面量**。 + +常量可以是任何的基本数据类型,可分为整型数字、浮点数字、字符、字符串和布尔值。 + +常量就像是常规的变量,只不过常量的值在定义后不能进行修改。 + +#### 定义 + +在 C++ 中,有两种简单的定义常量的方式: + +- 使用 **#define** 预处理器。 +- 使用 **const** 关键字。 + +#### 实例 + +``` +// #define 预处理器定义常量 +#define identifier value + +// const 前缀声明指定类型的常量 +const type variable = value; +``` + +### 修饰符 + +C++ 允许在 **char、int 和 double** 数据类型前放置修饰符。修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。 + +- signed +- unsigned +- short +- long + +修饰符 **signed、unsigned、long 和 short** 可应用于整型,**signed** 和 **unsigned** 可应用于字符型,**long** 可应用于双精度型。 + +修饰符 **signed** 和 **unsigned** 也可以作为 **long** 或 **short** 修饰符的前缀。例如:**unsigned long int**。 + +### 限定符 + +类型限定符提供了变量的额外信息。 + +| 限定符 | 含义 | +| -------- | ------------------------------------------------------------ | +| const | **const** 类型的对象在程序执行期间不能被修改改变。 | +| volatile | 修饰符 **volatile** 告诉编译器,变量的值可能以程序未明确指定的方式被改变。 | +| restrict | 由 **restrict** 修饰的指针是唯一一种访问它所指向的对象的方式。只有 C99 增加了新的类型限定符 restrict。 | + +### typedef + +可以使用 **typedef** 为一个已有的类型取一个新的名字。 + +```c++ +typedef type newname; + +// 例如,下面的语句会告诉编译器,feet 是 int 的另一个名称: +typedef int feet; + +// 现在,下面的声明是完全合法的,它创建了一个整型变量 distance: +feet distance; +``` + +### 类型占用字节 + +C++ 不同于 Java,变量的大小会根据编译器和所使用的电脑而有所不同。 + +| 类型 | 位 | 范围 | +| ------------------ | ------------- | ------------------------------------------------------- | +| char | 1 个字节 | -128 到 127 或者 0 到 255 | +| unsigned char | 1 个字节 | 0 到 255 | +| signed char | 1 个字节 | -128 到 127 | +| int | 4 个字节 | -2147483648 到 2147483647 | +| unsigned int | 4 个字节 | 0 到 4294967295 | +| signed int | 4 个字节 | -2147483648 到 2147483647 | +| short int | 2 个字节 | -32768 到 32767 | +| unsigned short int | 2 个字节 | 0 到 65,535 | +| signed short int | 2 个字节 | -32768 到 32767 | +| long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | +| signed long int | 8 个字节 | -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 | +| unsigned long int | 8 个字节 | 0 to 18,446,744,073,709,551,615 | +| float | 4 个字节 | +/- 3.4e +/- 38 (~7 个数字) | +| double | 8 个字节 | +/- 1.7e +/- 308 (~15 个数字) | +| long double | 8 个字节 | +/- 1.7e +/- 308 (~15 个数字) | +| wchar_t | 2 或 4 个字节 | 1 个宽字符 | + +### 实例 + +```c++ +// 输出电脑上各种数据类型的大小 +#include +using namespace std; + +int main(){ + short int i; // 有符号短整数 + short unsigned int j; // 无符号短整数 + + cout << "Size of char : " << sizeof(char) << endl; + cout << "Size of int : " << sizeof(int) << endl; + cout << "Size of short int : " << sizeof(short int) << endl; + cout << "Size of long int : " << sizeof(long int) << endl; + cout << "Size of float : " << sizeof(float) << endl; + cout << "Size of double : " << sizeof(double) << endl; + cout << "Size of wchar_t : " << sizeof(wchar_t) << endl; return 0; +} +``` + +## 运算符 + +运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C++ 内置了丰富的运算符,并提供了以下类型的运算符: + +- 算术运算符 +- 关系运算符 +- 逻辑运算符 +- 位运算符 +- 赋值运算符 +- 杂项运算符 + +### 算术运算符 + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ---------------- | +| + | 把两个操作数相加 | A + B 将得到 30 | +| - | 从第一个操作数中减去第二个操作数 | A - B 将得到 -10 | +| * | 把两个操作数相乘 | A * B 将得到 200 | +| / | 分子除以分母 | B / A 将得到 2 | +| % | 取模运算符,整除后的余数 | B % A 将得到 0 | +| ++ | [自增运算符](https://edu.aliyun.com/cplusplus/cpp-increment-decrement-operators.html),整数值增加 1 | A++ 将得到 11 | +| -- | [自减运算符](https://edu.aliyun.com/cplusplus/cpp-increment-decrement-operators.html),整数值减少 1 | A-- 将得到 9 | + +### 关系运算符 + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ----------------- | +| == | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不为真。 | +| != | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 | +| > | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 不为真。 | +| < | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 | +| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 不为真。 | +| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 | + +### 逻辑运算符 + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ----------------- | +| && | 称为逻辑与运算符。如果两个操作数都非零,则条件为真。 | (A && B) 为假。 | +| \|\| | 称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。 | (A \|\| B) 为真。 | +| ! | 称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。 | !(A && B) 为真。 | + +### 位运算符 + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ------------------------------------------------------------ | +| & | 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 | (A & B) 将得到 12,即为 0000 1100 | +| \| | 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 | (A \| B) 将得到 61,即为 0011 1101 | +| ^ | 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 | (A ^ B) 将得到 49,即为 0011 0001 | +| ~ | 二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。 | (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 | +| << | 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 | A << 2 将得到 240,即为 1111 0000 | +| >> | 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 | A >> 2 将得到 15,即为 0000 1111 | + +### 赋值运算符 + +| 运算符 | 描述 | 实例 | +| ------ | ------------------------------------------------------------ | ------------------------------- | +| = | 简单的赋值运算符,把右边操作数的值赋给左边操作数 | C = A + B 将把 A + B 的值赋给 C | +| += | 加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数 | C += A 相当于 C = C + A | +| -= | 减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数 | C -= A 相当于 C = C - A | +| *= | 乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数 | C *= A 相当于 C = C * A | +| /= | 除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数 | C /= A 相当于 C = C / A | +| %= | 求模且赋值运算符,求两个操作数的模赋值给左边操作数 | C %= A 相当于 C = C % A | +| <<= | 左移且赋值运算符 | C <<= 2 等同于 C = C << 2 | +| >>= | 右移且赋值运算符 | C >>= 2 等同于 C = C >> 2 | +| &= | 按位与且赋值运算符 | C &= 2 等同于 C = C & 2 | +| ^= | 按位异或且赋值运算符 | C ^= 2 等同于 C = C ^ 2 | +| \|= | 按位或且赋值运算符 | C \|= 2 等同于 C = C \| 2 | + +### 杂项运算符 + +| 运算符 | 描述 | +| -------------------- | ------------------------------------------------------------ | +| sizeof | sizeof 运算符返回变量的大小。例如,sizeof(a) 将返回 4,其中 a 是整数。 | +| Condition ? X : Y | 条件运算符。如果 Condition 为真 ? 则值为 X : 否则值为 Y。 | +| , | 逗号运算符会顺序执行一系列运算。整个逗号表达式的值是以逗号分隔的列表中的最后一个表达式的值。 | +| .(点)和 ->(箭头) | 成员运算符用于引用类、结构和共用体的成员。 | +| Cast | 强制转换运算符把一种数据类型转换为另一种数据类型。例如,int(2.2000) 将返回 2。 | +| & | 指针运算符 & 返回变量的地址。例如 &a; 将给出变量的实际地址。 | +| * | 指针运算符\*指向一个变量。例如,*var; 将指向变量 var。 | + +### 运算符优先级 + +| 类别 | 运算符 | 结合性 | +| ---------- | --------------------------------- | -------- | +| 后缀 | () [] -> . ++ - - | 从左到右 | +| 一元 | + - ! ~ ++ - - (type)* & sizeof | 从右到左 | +| 乘除 | * / % | 从左到右 | +| 加减 | + - | 从左到右 | +| 移位 | << >> | 从左到右 | +| 关系 | < <= > >= | 从左到右 | +| 相等 | == != | 从左到右 | +| 位与 AND | & | 从左到右 | +| 位异或 XOR | ^ | 从左到右 | +| 位或 OR | \| | 从左到右 | +| 逻辑与 AND | && | 从左到右 | +| 逻辑或 OR | \|\| | 从左到右 | +| 条件 | ?: | 从右到左 | +| 赋值 | = += -= *= /= %=>>= <<= &= ^= \|= | 从右到左 | +| 逗号 | , | 从左到右 | + +## 语法 + +### 分号 + +C++ 并不强制要求代码缩进,仅以半角分号表示语句结束。 + +```cpp +// 三个不同的语句 +x = y; +y = y+1; +add(x, y); + +// 放置多行语句 +x = y;y = y+1;add(x, y); +``` + +### 空格 + +在 C++ 中,空格用于描述空白符、制表符、换行符和注释。空格分隔语句的各个部分,让编译器能识别语句中的某个元素(比如 int)在哪里结束,下一个元素在哪里开始。 + +```cpp +/* + * int 和 age 之间必须至少有一个空格字符(通常是一个空白符) + * 这样编译器才能够区分它们。 + */ + +int age; + + +/* + * fruit 和 =,或者 = 和 apples 之间的空格字符不是必需的 + * 但是为了增强可读性,您可以根据需要适当增加一些空格 + */ + +fruit = apples + oranges; // 获取水果的总数 +``` + +### 标识符 + +C++ 标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。 + +**一个标识符以字母 A-Z 或 a-z 或下划线 _ 开始,后跟零个或多个字母、下划线和数字(0-9)**。 + +C++ 标识符内不允许出现标点字符,比如 @、$ 和 %。C++ 是**区分大小写**的编程语言。因此,在 C++ 中,**Manpower** 和 **manpower** 是两个不同的标识符。 + +```cpp +// 标识符示例 +mohd zara abc move_name a_123myname50 _temp j a23b9 retVal +``` + +### 语句块 + +一组使用大括号括起来的按逻辑连接的语句。 + +```cpp +// 语句块 +{ + cout << "Hello World"; + // 输出 Hello World + return 0; +} +``` + +## 注释 + +C++ 支持单行注释和多行注释。注释中的所有字符会被 C++ 编译器忽略。 + +```cpp +// 单行注释 + +/* + * 多行注释 + */ +``` + +## 关键字 + +| | | | | +| ------------ | --------- | ---------------- | -------- | +| asm | else | new | this | +| auto | enum | operator | throw | +| bool | explicit | private | true | +| break | export | protected | try | +| case | extern | public | typedef | +| catch | false | register | typeid | +| char | float | reinterpret_cast | typename | +| class | for | return | union | +| const | friend | short | unsigned | +| const_cast | goto | signed | using | +| continue | if | sizeof | virtual | +| default | inline | static | void | +| delete | int | static_cast | volatile | +| do | long | struct | wchar_t | +| double | mutable | switch | while | +| dynamic_cast | namespace | template | |