关键字是对编程语言有特定含义的词或标识符,C 在C语言32个关键字的基础上又新增了很多功能强大且实用的关键字。那么,下面这些关键字,你有见过或者用过吗?
auto这个关键字应该很多人都见过,但是用的比较少而已。C 是强类型语言,变量必须指明类型。但是在C 功能越来越丰富,越来越强大的时候,例如模板的出现导致又是并不清楚某些复杂的expression会返回何种类型,此时auto就起了很大作用:自动类型推断和返回值占位。类似于C#中的var,系统可以自动推断变量类型
auto x = 1 ;//x为int型 auto y = 1.2 ;//y为float型 auto c = "ss" ;//c为string型 vector<int> vec(3) ; auto itera = vec.begin();//vec的正向迭代器 auto itera_r = vec.rbegin();//vec的反向迭代器and, and_eq, or, or_eq, not, not_eq
这些都是C 11中新增的关键字,都是用来处理逻辑操作的。有了这些关键字C 写起来居然有点python的味道。
and相当于&&; and_eq相当于&=; or相当于||; or_eq相当于|=; not相当于! not_eq相当于!=nullptr
nullptr是避免野指针的一大利器,我们一直用的NULL表示空指针,但是殊不知在某些极端情况下,NULL可能会出现意料之外的情况。NULL的定义为:NULL的定义为:#define NULL ((void *)0),也就是说NULL实质上是一个void *指针。请看下面的代码:
void Func(char *); void Func(int); int main() { Func(NULL); }
如果此时NULL表示一个空指针的话,实际上我们Func(NULL);本意是要调用Func(char *);因为C 把NULL定义为0,所以实际结果却是调用的Func(int);
nullptr的使用也是十分的简单
char *p1 = nullptr; int *p2 = nullptr;noexcept
C 在函数申明时一般是默认可以抛出任何异常,但是可以用throw来指定该函数可以抛出的异常的类型,这样方便函数调用处理时catch语句好匹配。
void func_anyException();//可以抛出任何异常 void func_NoException() throw();//不可抛出任何异常 void func_defineException() throw(char*,int);//只可以抛出char* 和 int类型异常。
而C 11新增的noexcept,看翻译就知道是不抛出任何异常的意思,那么
void func_NoException() throw(); void func_NoException() noexcept;
上面两个申明在语法上功能是一摸一样的,区别就是程序运行时的行为和编译器优化的结果。当使用noexcept时,如果运行时函数抛出异常而有没有适合类型的catch语句,std::teminate()函数会被立即调用,而不是调用unexpected(); 而throw在这种情况下就会先调用unexpected()
所以,noexcept在异常处理的过程中,编译器不会回退栈,这为编译器的优化提供了更大的空间。
register是从C语言就存在的一个关键字,但是我好像从来没用过。register修饰符暗示编译程序相应的变量将被频繁地使用,请求编译器将其保存在CPU的寄存器中,以加快其存储速度。
register char *s; register int a;
但是register需要注意一下几点:
1、register变量必须是一个单个的值,并且长度不能太长,一般不能大于一个int的长度
2、不能被取地址,也即&a是非法的
3、register static int a非法,局部静态变量不可申明为register,全局变量也不可申明为register