C++:基本语法(重构)
This commit is contained in:
parent
79376d4507
commit
da343a4296
@ -2,5 +2,346 @@
|
||||
id: 基本语法
|
||||
title: 基本语法
|
||||
sidebar_position: 2
|
||||
data: 2022年2月17日
|
||||
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 <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变成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 | |
|
||||
|
Loading…
Reference in New Issue
Block a user