C/C++
C
基础知识
1.机器数和真值
机器数:最高位存放符号位的二进制数,例如+3(0000 0011),-3(1000 0011)。
真值:带符号机器数的真实数值,例如(1000 0011)的二进制数是131,但该机器数的真实数值,即真值,是-3。
2.原码、反码和补码
负数的反码:除符号位都取反;负数的补码:除符号位都取反再+1。
补码不仅可以解决0+和0-的编码问题;而且可以再多表示一个最低数(如:-128)。
注意:进位1不在计算机字长里
具体来说:
3.定义和声明
定义:编译器创建一个对象(变量或函数),为其分配内存并命名。
声明:(1)告诉编译器,该名字已经存在于内存中;(2)告诉编译器,该名字已被预定。
一、关键字
C中共有32个关键字
序号 | 关键字 | 含义 | 备注 |
---|---|---|---|
1 | auto | 声明自动变量 | 编译器会默认对象为auto类型。 |
2 | register | 声明寄存器变量 | 该关键字会请求编译器尽可能地将变量存在CPU的内部寄存器中。这里需要了解: |
(1)register会尽可能地,而不是全部 | |||
(2)寄存器的概念,即距离CPU最近的,存储速度很快的存储空间。 | |||
3 | static | 声明静态变量 | 该关键字可用于修饰变量或修饰函数。这里需要了解: |
(1)变量前加static使得变量成为静态变量,储存在内存的静态区域,即函数内的静态变量在函数运行结束时不会被销毁; | |||
(2)函数前加static使得函数成为静态函数(内部函数),但这里的static并不是指存储方式,而是指对函数的作用域仅局限于本文件??? | |||
6种基本数据类型 | |||
4 | short | 声明短整型变量 | 2字节 |
5 | int | 声明整型变量 | 4字节 |
6 | long | 声明长整型变量 | 4字节 |
7 | char | 声明字符型变量 | 1字节 |
8 | float | 声明浮点型变量 | 4字节 |
9 | double | 声明双精度变量 | 8字节 |
10 | sizeof | 计算对象所占内存空间大小 | 这里需要了解: |
(1) sizeof并非函数,如sizeof(i)✅,sizeof i✅。但建议加括号; | |||
(2)sizeof(int)✅,sizeof int❌,因为int前后只能加unsigned、const等关键字,不能加sizeof; | |||
(3) sizeof中不能加有作用的表达式。如sizeof(i++)❌。 | |||
(4)sizeof(int) * p的含义。 | |||
11 | signed | 声明有符号类型变量 | 这里需要了解:(1)一个8位的signed char类型数,其值范围~ |
12 | unsigned | 声明无符号类型变量 | 这里需要了解:(1)一个8位的unsigned char类型数,其值范围~ ; |
(2)'-'不能出现在unsigned表达式中 | |||
(3)有无符号的char类型只能用于数值的存储和使用,单纯的char类型只能用于字符值的存储和使用。 | |||
13 | if | 条件语句 | |
14 | else | 条件语句分支 | 这里需要了解: |
(1)与bool比较时,if(Flag)✅或if(!Flag)✅ | |||
(2)if(fun() == True)❌,因为True可以说任何非0的值,不能直接用表达式与True比较 | |||
(3)与零比较时,建议if(Val >= -EPSINON && Val <=EPSINON)✅ | |||
(4)与指针比较时,建议if(NULL==p)✅或if(NULL!=p)✅ | |||
(5)if;❌if NULL;✅ | |||
15 | switch | 开关语句 | |
16 | case | 开关语句分支 | 这里需要了解: |
(1)必须加break和default | |||
(2)不能用return | |||
(3)switch中不能是布尔表达式,case后只能是整型或字符型的常量或常量表达式 | |||
17 | do | 循环语句的循环体 | |
18 | while | 循环语句的循环条件 | |
19 | for | 循环语句 | 这里需要了解: |
(1)break和continue的区别 | |||
(2)循环的条件表达式必须需要判断是否越界 | |||
(3)尽量半开半闭写法 | |||
20 | goto | 无条件跳转语句 | 可能通过变量的初始化、计算等语句,破坏结构化设计风格 |
21 | void | 声明函数无返回值或无参数,声明空类型指针 | (1)默认为int类型,如果无返回建议void(2)void指针建议小心使用 |
22 | return | 子程序返回语句 | (1)return;-> 返回1 (2)不可返回指向栈内存的指针,因为该内存在函数运行结束时被销毁 |
23 | const | 声明只读变量 | 这里需要了解: |
(1)case后面是否能const修饰的变量??? | |||
(2) define不是关键字 | |||
(3) const与define的区别 | |||
24 | volatile | 声明变量可在程序运行时被改变 | const volatile int i = 10??? |
25 | extern | 声明变量是在其他文件中声明 | |
26 | struct | 声明结构体变量 | 这里需要了解: |
(1)空结构体的空间大小可能为1可能为0 | |||
(2)柔性数组 | |||
27 | union | 声明联合数据类型 | 这里需要了解: |
(1)union的空间大小 | |||
(2)大小端模式 | |||
(3)如何确定系统的存储模式 | |||
28 | enum | 声明枚举类型 | (1)只能int(2)与#define的区别 |
29 | typedef | 用于给数据类型取别名 | 这里需要了解: |
(1)typedef与const | |||
(2)typedef与define | |||
(3)#define a int[10]与typedef in a[10] | |||
30 | break | 跳出当前循环 | |
31 | continue | 跳出本次循环 | |
32 | default | 开关语句中的其他分支 |
二、符号
/斜杠 \反斜杠
1.注释问题
(1)编译器会用空格代替注释,如:int/*...*/i;
等价于int i;
(2)""中的//为双斜杠,而不是注释,如:char* s="abcdefgh //hijklmn"
(3)""是反斜杠,意思为换行、接续符或转义字符的开始标志,
如://Is it a \ vaild commnet?
(4)/.../不能嵌套
(5)/* 之间没有空格就是代表注释开始,如:y = x/*p;
等价于y = x
,最好写成y = x/(*p);或y=x/ *p;
2.引号
双引号为字符串常量,单引号为字符常量。
注意:字符常量在内存中以ASCII码方式存储,是可以与整数常量或变量运算的。如'A'+1
3.++ --
贪心法:每一个符号应该包含尽可能多的字符。
a+++b等价于(a++) + b
4.优先级
注意:
(1)*p.f
等价于*(p.f)
(2)int *ap[]
等价于int *(ap[])
(3)int *fp()
等价于int *(fp())
(4)(val & mask!=0)
等价于val &(mask!=0)
(5)c=getchar() !=EOF
等价于c=(getchar()!=EOF)
(6)mab<<4+lsb
等价于msb<<(4+lsb)
(7)i=1,2
等价于(i=1),2
三、预处理
define 宏
四、指针与数组
int* p = NULL;
int * p;
p = NULL;
五、内存管理
野指针
内存泄漏
内存对齐
C++
关键字
const
#define
static
volatile
sizeof
#pragma pack
extern
struct
class
union
this
assert
inline
explicit
friend
using
::
enum
decltype
initializer_list
面向对象
封装
继承
多态
运算符
模板类
模板类string
//定义
String str1 = "Hello World";//直接赋值
String str2 = new String("Hello World");//通过构造方法创建对象
//操作
System.out.println(str1.equals(str2));//比较字符串是否相等
str1 += str2;//str2拼接到str1尾部
模板类vector
它是一种动态数组,在运行阶段设置vector对象的长度。它会自动new和delete。该容器前端封闭。
//定义
vector<typename> vt(n_elem);//n_elem可以说整型常量或变量
vector(vt.begin(), vt.end());//vt拷贝
//操作
vt.push_back(a);//尾部插入元素
vt.pop_back(a);//尾部删除元素
vt.begin();//第一个元素
vt.end();//最后一个元素的后一位
vt.assign(v1.begin(), v1.end()); //将[beg, end)区间中的数据拷贝赋值给vt。
模板类array
它是一种静态数组。
array<typename, n_elem> arr;//n_elem不能是变量
函数
虚析构函数
虚函数
函数探幽
内连函数
引用变量
内存
配套使用new和delete
new:C中可以使用malloc分配内存,而在C++中可以使用new分配内存。
new会根据类型来确定需要多少字节的内存(没有名字),然后找到这样的内存,并返回地址。
delete:类似于free
动态数组
//分配
int * psome = new int [10];
//释放,应该释放整个数组,而不是指针指向的元素
delete [] psome;
本文作者:我好想睡觉啊
本文链接:https://www.cnblogs.com/z-qhhh/p/17501742.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步