1
0
wiki/dev/C++/基本语法.md

346 lines
17 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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