C++语法学习

C++语法学习

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

image-20250202133229340

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

image-20250205141259313

image-20250205141131079

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.image-20250206164305706

&表示对x整数的引用 (每次循环迭代的时候,x都引用my_array中的元素,因此 对x的操作会直接反映在my_array上。

image-20250206164435528

后面的auto自动变化my_array中的数据

image-20250206164607400

上面for述句的第一部分定义被用来做范围迭代的变量,就像被声明在一般for循环的变量一样,其作用域仅只于循环的范围。而在”:”之后的第二区块,代表将被迭代的范围

C++循环语句

1.break

2.continue

3.goto

C++ 中 goto 语句的语法:

goto label;
..
.
label: statement;

在这里,label 是识别被标记语句的标识符,可以是任何除 C++ 关键字以外的纯文本。标记语句可以是任何语句,放置在标识符和冒号(:)后边。

image-20250208215048550

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.参数的默认值

image-20250207160022854

注意这个sum(a) 因为b=20在引用函数中默认了

C++数组

1.多维数组

2.指向数组的指针

这个地方刚开始其实我不太了解现在差不多了。

数组名指向数组中第一个元素的常量指针

使用数组名作为常量指针是合法的。因此,*(一个数组名字+2)是一种访问数组数据的合法方式。

一旦您把第一个元素的地址存储在 p 中,您就可以使用 p、(p+1)、*(p+2) 等来访问数组元素。

3.传递数组给函数