思考题三
问题
请你介绍一种C/C++语言的语法、标准库。
看法
1.inline 关键字:内联函数
例子:
inline void printbool(bool b){
if(b) puts("YES\n");
else puts("NO\n");
}
该关键字可以向编译器提出建议,取消申请该函数的栈空间。若编译器采纳,将会类似于在下文使用到对应函数时,直接将函数拷贝过去。在一定程度上,可以加快程序运行速度。但也可能导致代码膨胀,需要慎用。
2.register 关键字
例子:
int ans=0;
for(register int i=1;i<=100;i++) ans+=i;
该关键字可以向编译器提出建议,将后面申请的变量存到寄存器中。若编译器采纳,将在一定程度上加快读取速度
3.typedef 关键字
例子1:
typedef int i32;
i32 a=0;
例子2:
struct Node{
int L,R,Sum,Lazy;
Node *Lc,*Rc;
};
typedef *Node Tree;
Tree t=0;
例子3:
const int MAXN=1024;
typedef int ar[MAXN];
ar phi;
用于将变量名重命名,一定程度上可以加强代码的可读性
4.namespace 关键字:名称空间
例子:
namespace IO{
int read(){
int ans=0;char c=getchar();bool neg=0;
while(c<'0'||c>'9') { if(c=='-') neg=!neg; c=getchar(); }
while(c>='0'&&c<='9') { ans=ans*10+c-'0'; c=getchar(); }
if(neg) return -ans;
else return ans;
}
}
using namespace IO;
int main(){
int a=read();
......
}
/*
或者前面每加 using namespace IO;
直接后面写 int a=IO::read();
*/
该关键字会开辟一个新的命名空间,避免了变量名或函数名因为命名相同而发生冲突
5.time() 函数的一个用法(在
time(NULL);
//有时亦写作 time(0)
该操作将返回1970年1月1日0时0分0秒到现在的秒数,常用于作为随机数生成器的种子
6.static 关键字:静态局部变量
例子:
long long int rand(){
static long long int num=rand();
return num=(num+19260817)*19491001%998244357;
}
该操作在自定义函数内申请的变量,将会在赋初值后,每次调用该函数时,相对应变量为上一次该函数运行结束时的值
- 基于 fread 函数的读入优化
例子:
inline char gc(){
static char s[1<<20|1],*p1=s,*p2=s;
return (p1==p2)&&(p2=(p1=s)+fread(s,1,1<<20,stdin),p1==p2)?EOF:*(p1++);
}
inline long long read(){
register long long ans=0;register char c=gc();register bool neg=0;
while(c<48||c>57) neg^=!(c^'-'),c=gc();
while(c>=48&&c<=57) ans=(ans<<3)+(ans<<1)+(c^48),c=gc();
return neg?-ans:ans;
}
fread() 函数有四个参数:第一个是缓冲区,可以简单理解为存储的数组;第二个是读入单元的大小,即读入内容的最小单位的大小;第三个是最大读入量;第四个,我没理解是啥玩意儿,反正每次都是写 stdin ;最后的返回值为实际读入的大小
-
template 关键字:
-
args 变长参数