C++语法学习
C++语法学习
wuanC++语法学习
C++基本语法
C++语句块
C++不以行末作为结束符的标识,因此,可以在一行上放置多个语句
x = y;y = y+1;add(x, y);
等同于
x = y; y = y+1; add(x, y);
C++标识符
C++标识符是用来标识变量、函数、类、模块,或任何其他用户自定义项目的名称。一个标识符以字母A-Z或a-z或下划线_开始,后跟零个或多个字母、下划线和数字__(0-9).
C++标识符不允许出现标点字符,比如@、&和%。
C++是区分大小写的编程语言。 Eg.Manpower和manpower是两个不同的标识符。
下面列出几个有效的标识符:
mohd zara abc move_name a_123
myname50 _temp j a23b9 retVal
C++数据类型
1.变量存储信息时 变量保留的是他所存储值的内存的位置
2.基本的内置类型
| 类型 | 关键字 |
|---|---|
| 布尔型 | bool |
| 字符型 | char |
| 整型 | int |
| 浮点型 | float |
| 双浮点型 | double |
| 无类型 | void |
| 宽字符型 | wchar_t |
注:其实wchar_t是这样来的:
typedef short int wchar_t;
所以wchar_t实际的空间和short int一样
3.修饰符
| 修饰符 | 描述 | 示例 |
|---|---|---|
signed |
表示有符号类型(默认) | signed int x = -10; |
unsigned |
表示无符号类型 | unsigned int y = 10; |
short |
表示短整型 | short int z = 100; |
long |
表示长整型 | long int a = 100000; |
const |
表示常量,值不可修改 | const int b = 5; |
volatile |
表示变量可能被意外修改,禁止编译器优化 | volatile int c = 10; |
mutable |
表示类成员可以在 const 对象中修改 |
mutable int counter; |
所以说const也不是一定不能修改的 用mutable即可
注意:不同系统会有差异,一字节为8位。
注意:默认情况下,int、short、long都是带符号的,即signed
注意:long int 8个字节,int 都是4个字节,(早期的C编译器定义了long int占用4个字节,int占用2个字节,新版的C/C++标准兼容了早期的这一设定)
注意:endl 这个是将在每一行后面添加一个换行符
例子:
#include<iostream> #include <limits>
using namespace std;
int main() { cout << "type: \t\t" << "************size**************"<< endl; cout << "bool: \t\t" << "所占字节数:" << sizeof(bool); cout << "\t最大值:" << (numeric_limits<bool>::max)(); cout << "\t\t最小值:" << (numeric_limits<bool>::min)() << endl
4.派生数据类型
| 数据类型 | 描述 | 示例 |
|---|---|---|
数组 |
相同类型元素的集合 | int arr[5] = {1, 2, 3, 4, 5}; |
指针 |
存储变量内存地址的类型 | int* ptr = &x; |
引用 |
变量的别名 | int& ref = x; |
函数 |
函数类型,表示函数的签名 | int func(int a, int b); |
结构体 |
用户定义的数据类型,可以包含多个不同类型的成员 | struct Point { int x; int y; }; |
类 |
用户定义的数据类型,支持封装、继承和多态 | class MyClass { ... }; |
联合体 |
多个成员共享同一块内存 | union Data { int i; float f; }; |
枚举 |
用户定义的整数常量集合 | enum Color { RED, GREEN, BLUE }; |
5.typedef声明
可以用typedef为一个已有的变量取一个新名字
定义的语法:typedef type newname;
例子:typedef int feet;(这个语句会告诉编译器 feet是int的另一个名称
因此:feet distance 创建的整型变量distance是合法的
6.枚举类型
”枚举“是指将变量中的值一一列举出来
形式:enum 枚举名{
标识符[=整型常数],
标识符[=整型常数],
…
标识符[=整型常数]
} 枚举变量
如果枚举没有初始化, 即省掉”=整型常数”时, 则从第一个标识符开始。
例子:
enum color { red, green, blue } c;c = blue;
默认情况下,第一个值为0,第二个为1,以此类推
也可以给名称赋予一个特殊的值,只需要添加一个初始值即可
enum color { red, green=5, blue };
这个例子red依然是0 ,green是5,blue是6
C++变量作用域
1.初始局部变量和全局变量
当局部变量被定义时,系统不会对其初始化,您必须自行对其初始化。定义全局变量时,系统会自动初始化为下列值:
| 数据类型 | 初始化默认值 |
|---|---|
| int | 0 |
| char | ‘\0’ |
| float | 0 |
| double | 0 |
| pointer | NULL |
正确地初始化变量是一个良好的编程习惯,否则有时候程序可能会产生意想不到的结果。
块作用域:
定义:在代码块内部声明的变量
(其实也就是大括号里面带大括号)
#include <iostream>
int main() {
int a = 10;
{
int a = 20; // 块作用域变量
std::cout << "块变量: " << a << std::endl;
}
std::cout << "外部变量: " << a << std::endl;
return 0;}
C++常量
1.整数常量
前缀:
十六进制:0x 八进制:0 十进制:不带前缀默认
后缀:
U 和L的组合
U:无符号整数
L:长整数
后缀可以大写 两者顺序随意
2.浮点常量
组成:整数部分、小数部分、小数点、指数部分
例子:
3.14159 // 合法的
314159E-5L // 合法的 这个代表10的-5次方 L是长双精度浮点数
510E // 非法的:不完整的指数
210f // 非法的:没有小数或指数
.e55 // 非法的:缺少整数或分数
3.布尔常量(bool)
一个true 一个false
注意:不能把true看成1 false看成0 这两个都是C++的关键字
4.字符常量
字符常量是括在单引号里面的(‘ ’)
转义字符码:
| 转义序列 | 含义 |
|---|---|
| \ | \ 字符 |
| ' | ‘ 字符 |
| " | “ 字符 |
| ? | ? 字符 |
| \a | 警报铃声 |
| \b | 退格键 |
| \f | 换页符 |
| \n | 换行符 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
| \ooo | 一到三位的八进制数 |
| \xhh . . . | 一个或多个数字的十六进制数 |
5.字符串常量
括在**“ ”**里面
一个字符串包含类似一字符常量的字符:普通的字符、转移序列和通用的字符。
也可以用****做分隔符,把一个很长的字符串常量进行分行;
6.定义常量
两种方式:
- 使用 #define 预处理器。
- 使用 const 关键字。
C++运算符
1.算术运算
+-/ % ++ –
2.关系运算符
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 检查两个操作数的值是否相等,如果相等则条件为真。 | (A == B) 不为真。 |
| != | 检查两个操作数的值是否相等,如果不相等则条件为真。 | (A != B) 为真。 |
| > | 检查左操作数的值是否大于右操作数的值,如果是则条件为真。 | (A > B) 不为真。 |
| < | 检查左操作数的值是否小于右操作数的值,如果是则条件为真。 | (A < B) 为真。 |
| >= | 检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。 | (A >= B) 不为真。 |
| <= | 检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。 | (A <= B) 为真。 |
3.逻辑运算符
下表显示了 C++ 支持的关系逻辑运算符。
假设变量 A 的值为 1,变量 B 的值为 0,则:
| 运算符 | 描述 | 实例 |
|---|---|---|
| && | 称为逻辑与运算符。如果两个操作数都 true,则条件为 true。 | (A && B) 为 false。 |
| || | 称为逻辑或运算符。如果两个操作数中有任意一个 true,则条件为 true。 | (A || B) 为 true。 |
| ! | 称为逻辑非运算符。用来逆转操作数的逻辑状态,如果条件为 true 则逻辑非运算符将使其为 false。 | !(A && B) 为 true。 |
4.位运算符(难一点) (理解)
下表显示了 C++ 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:
| 运算符 | 描述 | 实例 |
|---|---|---|
| & | 按位与操作,按二进制位进行”与”运算。运算规则:0&0=0; 0&1=0; 1&0=0; 1&1=1; |
(A & B) 将得到 12,即为 0000 1100 |
| | | 按位或运算符,按二进制位进行”或”运算。运算规则:`0 | 0=0; 0 |
| ^ | 异或运算符,按二进制位进行”异或”运算。运算规则:0^0=0; 0^1=1; 1^0=1; 1^1=0; |
(A ^ B) 将得到 49,即为 0011 0001 |
| ~ | 取反运算符,按二进制位进行”取反”运算。运算规则:~1=-2; ~0=-1; |
(~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。 |
| << | 二进制左移运算符。将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 | A << 2 将得到 240,即为 1111 0000 |
| >> | 二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 | A >> 2 将得到 15,即为 0000 1111 |
5.赋值运算符
下表列出了 C++ 支持的赋值运算符:
| 运算符 | 描述 | 实例 |
|---|---|---|
| = | 简单的赋值运算符**,把右边操作数的值赋给左边操作数** | 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 |
6.杂项运算符
下表列出了 C++ 支持的其他一些重要的运算符。
| 运算符 | 描述 |
|---|---|
| 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++for循环
1.正常版本
for ( init; condition; increment )
{
statement(s);
}
2.
&表示对x整数的引用 (每次循环迭代的时候,x都引用my_array中的元素,因此 对x的操作会直接反映在my_array上。
后面的auto自动变化my_array中的数据
上面for述句的第一部分定义被用来做范围迭代的变量,就像被声明在一般for循环的变量一样,其作用域仅只于循环的范围。而在”:”之后的第二区块,代表将被迭代的范围。
C++循环语句
1.break
2.continue
3.goto
C++ 中 goto 语句的语法:
goto label; |
在这里,label 是识别被标记语句的标识符,可以是任何除 C++ 关键字以外的纯文本。标记语句可以是任何语句,放置在标识符和冒号(:)后边。
C++判断
1.switch语句
- 当被测试的变量等于 case 中的常量时,case 后跟的语句将被执行,直到遇到 break 语句为止。
- 当遇到 break 语句时,switch 终止,控制流将跳转到 switch 语句后的下一行。
- 不是每一个 case 都需要包含 break。如果 case 语句不包含 break,控制流将会 继续 后续的 case,直到遇到 break 为止。
- 一个 switch 语句可以有一个可选的 default case,出现在 switch 的结尾。default case 可用于在上面所有 case 都不为真时执行一个任务。default case 中的 break 语句不是必需的。
**注意事项:**z
break语句: 每个case语句末尾的break语句是必要的,用于跳出switch语句。如果缺少break,程序将继续执行下一个case,这叫做”贯穿”。default语句:default语句是可选的,但通常在所有case都不匹配时使用,处理所有未列出的情况。- 表达式类型:
switch表达式通常是整数类型或枚举类型,浮点数和字符串类型是不可行的。
C++函数
1.形式参数
形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。
当调用函数时,有三种向函数传递参数的方式:
| 调用类型 | 描述 |
|---|---|
| 传值调用 | 该方法把参数的实际值赋值给函数的形式参数。在这种情况下,修改函数内的形式参数对实际参数没有影响。 |
| 指针调用 | 该方法把参数的地址赋值给形式参数。在函数内,该地址用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 |
| 引用调用 | 该方法把参数的引用赋值给形式参数。在函数内,该引用用于访问调用中要用到的实际参数。这意味着,修改形式参数会影响实际参数。 |
默认情况下,C++ 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的参数
2.参数的默认值
注意这个sum(a) 因为b=20在引用函数中默认了
C++数组
1.多维数组
2.指向数组的指针
这个地方刚开始其实我不太了解现在差不多了。
数组名是指向数组中第一个元素的常量指针
使用数组名作为常量指针是合法的。因此,*(一个数组名字+2)是一种访问数组数据的合法方式。
一旦您把第一个元素的地址存储在 p 中,您就可以使用 p、(p+1)、*(p+2) 等来访问数组元素。












![[object Object]](https://img.090227.xyz/file/ae62475a131f3734a201c.png)