1
0
wiki/docs/开发/C++/基本语法.md

346 lines
17 KiB
Markdown
Raw Normal View History

2022-02-18 15:56:58 +08:00
---
id: 基本语法
title: 基本语法
sidebar_position: 2
2022-04-28 11:42:32 +08:00
data: 2022年2月18日
---
C++ 程序可以定义为对象的集合,这些对象通过调用彼此的方法进行交互。现在让我们简要地看一下什么是类、对象,方法、即时变量。
- **对象 -** 对象具有状态和行为。例如:一只狗的状态 - 颜色、名称、品种,行为 - 摇动、叫唤、吃。对象是类的实例。
- **类 -** 类可以定义为描述对象行为/状态的模板/蓝图。
- **方法 -** 从基本上说,一个方法表示一种行为。一个类可以包含多个方法。可以在方法中写入逻辑、操作数据以及执行所有的动作。
- **即时变量 -** 每个对象都有其独特的即时变量。对象的状态是由这些即时变量的值创建的。
## 数据类型
### 内置类型
| 类型 | 关键字 |
| -------- | ------- |
| 整型 | int |
| 浮点型 | float |
| 双浮点型 | double |
| 无类型 | void |
| 宽字符型 | wchar_t |
| 布尔型 | bool |
| 字符型 | char |
### 枚举类型
枚举类型(enumeration)是C++中的一种派生数据类型,它是由用户定义的若干枚举常量的集合。
2022-04-29 11:28:04 +08:00
```cpp
2022-04-28 11:42:32 +08:00
// 创建枚举,需要使用关键字 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** 关键字。
#### 实例
2022-04-29 11:28:04 +08:00
```cpp
2022-04-28 11:42:32 +08:00
// #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。 |
2022-05-30 12:27:50 +08:00
### typedef
2022-04-28 11:42:32 +08:00
可以使用 **typedef** 为一个已有的类型取一个新的名字。
2022-04-29 11:28:04 +08:00
```cpp
2022-04-28 11:42:32 +08:00
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 个宽字符 |
2022-04-29 11:28:04 +08:00
```cpp
2022-04-28 11:42:32 +08:00
// 输出电脑上各种数据类型的大小
#include <iostream>
using namespace std;
int main(){
short int i; // 有符号短整数
2022-05-30 12:27:50 +08:00
short unsigned int j; // 无符号短整数
2022-04-28 11:42:32 +08:00
2022-05-30 12:27:50 +08:00
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;
2022-04-28 11:42:32 +08:00
}
```
## 运算符
运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。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变成11变成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 | |