1.main() 函数
程序入口,一般的可执行编程中必须存在且唯一的函数。在DLL(动态链接库)编程中可以不包含,但是调用DLL的程序一样需要 main() 函数。
2.名称空间 namespace
using namespace std; // 这局代码配合 # include <iostream> 使用,相当于全局可用 名称空间 std 。
除此若存在自定义的名称空间,建议使用 std::cin 这类方式,避免不同命名空间的冲突。
3.整形:short、int、long、long long
short至少16位;int至少和short一样长;long至少32位且至少和int一样长;long long至少64位且至少和long一样长。
4.字节定义
字节通常指8位的内存单元;
C++中的字节至少能实现容纳基本字符集的相邻位组成。即在基于ASCII和EBCDIC字符集的实现中,字节为8位;在基于Unicode字符集的实现中,字节可能为16位甚至32位。
5. cout 输出格式
cout<<hex; //后续输出以16进制表示 cout<<dec; //后续输出以10进制表示 cout<<oct; //后续输出以8进制表示 (更改后一直有效)
cout<<setfill('*')<<setw(n)<<(目标); //以 n 为最小域宽输出目标,空白字符用“*”填充,输出长度大于n时,无效。
setf(ios:fixed); cout<<setprecision(2);//按两位小数输出数字(一直有效) (不设置的话一般 cout 会省略浮点数最后的 0 导致结果显示位数不对)
cout<<setiosflags(ios::scientific); // 以指数方式显示小数
6.浮点型:float、double、long double
float至少32位;double至少48位且不少于float;long double至少不少于double。一般分别为32、64、(80、96、128)。
浮点型的指数范围至少为 -37~37。 (2.34E+n) 表示为将 小数点向右移动 n 位;(2.34E-n) 表示为将 小数点向左移动 n 位。
浮点常量:后缀 f/F 表示float;后缀 l/L 表示long double;无后缀或指数形式表示 double。
浮点数不足示例: float a=2.34e22; float b= a +1.0f; cout << b-a; 按实际数据加减,其最终结果应为 1.0f ,在某些系统上结果为 0。由于系统的float表示为前6位或者前7位,实际修改的是第23位,结果不会收到 + 操作的影响。
7.类型转换
自动类型转换: 计算时会根据代码的具体实现进行自动转换(一般为类型提升),但是不合理的代码常会因此造成结果不和预知。
强制类型转换:(typename) value / typename (value)
从范围大的数据类型转换为类型小的数据类型: 超出取值范围
浮点型转换为整形: 小数部分丢失
8.数组索引越界
会导致预期之外的错误,因此代码中必须充分考虑访问数组是否越界。
9.字符串常量和字符常量的区别
'S' == 83 ; "S" == ('S' 和'\0' 组成的字符串数组) 字符串数组以 '\0' 结尾(空字符)。
字符串拼接时会自动忽略前面字符串的末尾 '\0' 空字符。
10.按行输入字符串
cin.getline(name,size) 前size-1个字符存储到name数组中(最后一个用于存放空字符),不足用空字符补充。
会自动丢弃换行符及超出指定大小的字符串。
空行问题:cin.getline(name,size) 遇到单个换行符占据一行会将目标数组设置为空数组
cin.get(name,size) 前size-1个字符存储到name数组中(最后一个用于存放空字符),不足用空字符补充。
会将换行符保留在及超出指定大小的字符串输入序列中,用于后续读取。
连续读取单行,第二次及后续读取时访问到第一次遗留下来的换行符,默认获取到空字符串。 应使用cin.get(name,size).get() 用于去除输入序列中的换行符
前size个字符存储到name数组中,若改行的内容大于size个字符,剩余的字符不丢弃留到下一次输入使用。
空行问题:cin.get(name,size) 读取空行后,会设置失效位,后续的输入被阻断,使用cin.clear(); 来恢复正常输入。
11.结构体
定义:
struct inflatable{
char name[10];
int age;
};
声明:struct inflatable boy; inflatable boy; C++中将结构体声明定义为一种新的类型,允许省略关键字 struct 定义结构体变量。
列表初始化;inflatable boy {"Bob",19}; inflatable boy={"Bob",19}; 可缺省(=)号 也可缺省内容(全部字节置 零 ) inflatable boy {};
12.共用体
定义:
union one4all{
int int_val;
long long_val;
double double_val;
}
声明&使用 one4all pail; pail.int_val=15; pail.long_val=1155; pail.double_val=2.34; 每次只能存储一个值(即多选一),长度为其最大成员的长度。
union中各成员共享一段内存空间,一个union的长度等于各成员中最长的长度。
union Data{
struct { int x; int y} s;
int x,y;
}d;
d 的长度等于struct s的长度,为八字节(假设是32位),如图所示:
d.x,d.y以及d.s.x都是前四个字节,所以他们的值永远相等,
d.x=1; ///d.x=d.y=d.s.x=1;
d.y=2; ///d.x=d.y=d.s.x=2;
d.s.x=d.x*d.x; ///d.x=d.y=d.s.x=2*2=4;
d.s.y=d.y*d.y; ///d.x=d.y=d.s.x=4+4=8;
13.枚举
定义:
enum spectrum {red,orange,yellow,green,blue,violet,indigo,ultraviolet}; 声明了枚举变量 将 red ~ ultraviolet 定义为符号常量,代表数字 0~7 数值可以显示的指定数据用以覆盖。
14.指针
int *p1,p2; // 创建了一个 int 指针变量 p1,和一个 int 变量 p2。
int *target[5]:指针数组,每个元素都是一个指向int*的指针;
int (*target)[5]:数组指针,相当于二维数组
注意:创建了指针变量后,在给指针变量赋值时 如:*p1=200; 需要将指针指向确定无风险的位置,避免指向代码区或者维持系统正常运行的区域。
new运算符 : new 和 delete 搭配使用申请/释放 单个指针变量内存。使用 new[] 和 delete[] 搭配使用 申请/释放 动态数组的内存 。
指针和数组基本等价:指针算术和C++内部处理数组的方式--以变量类型所占内存大小作为基本操作单元;数组名--数组第一个变量的地址。
delete 释放已经释放内存后的内存会导致不可预期的错误。 delete可以对空指针使用,不可以释放非new申请的内存。