程序预处理
目录
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