C/C++

C

基础知识

1.机器数和真值

机器数:最高位存放符号位的二进制数,例如+3(0000 0011),-3(1000 0011)。
真值:带符号机器数的真实数值,例如(1000 0011)的二进制数是131,但该机器数的真实数值,即真值,是-3。

2.原码、反码和补码

负数的反码:除符号位都取反;负数的补码:除符号位都取反再+1
补码不仅可以解决0+和0-的编码问题;而且可以再多表示一个最低数(如:-128)。
注意:进位1不在计算机字长里

具体来说:

image

参考资料:https://mp.weixin.qq.com/s?__biz=MzI0OTQwNDQxMw==&mid=2247483760&idx=1&sn=27cbdd41da43b5b71c9f7a3ae807fae6&chksm=e9934fe2dee4c6f4869f6d46004c2f3a76c3b5aefc1d1acc8acd9504c64e9a8143f21fe2c968&scene=27

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类型数,其值范围\(-2^7\)~\((2^7-1)\)
12 unsigned 声明无符号类型变量 这里需要了解:(1)一个8位的unsigned char类型数,其值范围\(0\)~\((2^8-1)\)
(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;
posted @ 2023-06-24 21:38  我好想睡觉啊  阅读(12)  评论(0编辑  收藏  举报