程序预处理 
目录
8 位(b) == 1 字节(B)
头文件 
包含头文件 
c
// 使用<>编译时只在系统库里找
#include <stdio.h>
// 使用""时先在当前文件夹中找,找不到再去系统文件中找(会花很多时间,尤其是文件夹比较大的时候)
// 自己写的文件用#include"文件名"来包含
#include "文件名"可以把函数写在其他文件中调用,也可以在文件中提前定义函数(这样 main 就能写在最前面了)
头文件互相包含解决方法 
c
//法1:
#ifndef __SOMEFILE_H__
#define __SOMEFILE_H__//声明语句
//头文件内容
#endif
//法2:
#pragma once//只能包含一次头文件快捷获取 
c
// 万能头
# include<bits/stdc++.h>
// 输入输出流
// 输入输出控制符 => iomanip
# include<iostream>
// C输入输出流
// vc++6.0中可添加stdio.h来使用printf();和scanf();
# include<stdio.h>
// STL sort(函数)
# include<algorithm.h>
# include<algorithm>
// string
# include<string.h>
# include<string>
// 数学公式
# include<math.h>
# include<cmath>
pow(a,b)//a的b次幂
sqrt()//取平方根
// 时间函数
# include<time.h>
# include<ctime>
srand((unsigned int)time(NULL));//添加随机数种子部分常用的头文件介绍 
define | 宏(C) 
EOF 被定义为-1
无参数宏:
c
#define <标识符> <字符或字符串>
#define PI 3.14 // 预编译时用3.14代替该源文件改行后所有的PI(不包括引号里的)替换时不做计算和语法检查:
c
#define M 1+1
8*m*3   // 变成8*1+1*3终止其作用域
c
#undef PI同一文件中同名宏不得赋值 2 次
带参数的宏:
c
#define M(a,b) a*b //中间一定要有空格,M(a,b)中间一定不能有空格
mm=M(2+9,3+1);//编译后mm=2+9*3+1;
#define M(a,b) (a)*(b)
mm=M(2+9,3+1);//编译后mm=(2+9)*(3+1);const 定义常量 
在 C++中,const 被推荐用于代替#define,因为#define不会进行类型检查,而const会。
c
const int pi=3.14;//常数变量(不可变)const 与指针联用 
| 语法 | 含义 | 能否修改指针? | 能否修改指针指向的值? | 
|---|---|---|---|
| const double *p | 指针指向的值是 const ;可以理解为 (const double) *p | ✅ 可以 | ❌ 不可以 | 
| double *const p | 指针本身是 const;可以理解为 double *(const p) | ❌ 不可以 | ✅ 可以 | 
| const double *const p | 指针和指向的值都是 const | ❌ 不可以 | ❌ 不可以 | 
C++
double value1 = 3.14;
double value2 = 2.71;
const double *point = &value1; // point 指向 value1
// 也可以 const double* point; point = &value1;
std::cout << *point << std::endl; // 输出 3.14
// *point = 4.56;  // ❌ 错误!不能修改 point 指向的值
point = &value2; // ✅ 正确!point 本身可以指向其他 `const double` 变量
std::cout << *point << std::endl; // 输出 2.71条件编译 
c
//eg1:
#ifdef <宏名>//若已经定义了宏则编译该程序段
	<程序段>
#else
	<程序段>
#endif
//eg2:
#ifndef <宏名>//若未定义了宏则编译该程序段
	<程序段>
#else
	<程序段>
#endif
//eg3:
#ifdef <常量表达式>//若表达式非0则编译该程序段
	<程序段>
#else
	<程序段>
#endif