--- 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 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 | |