龙空技术网

C++的这些关键字你都用过吗

编程老大叔 1031

前言:

现时各位老铁们对“c语言关键字 register”大致比较关心,各位老铁们都需要知道一些“c语言关键字 register”的相关文章。那么小编同时在网摘上网罗了一些关于“c语言关键字 register””的相关内容,希望朋友们能喜欢,你们快快来学习一下吧!

关键字是对编程语言有特定含义的词或标识符,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

register是从C语言就存在的一个关键字,但是我好像从来没用过。register修饰符暗示编译程序相应的变量将被频繁地使用,请求编译器将其保存在CPU的寄存器中,以加快其存储速度。

register char *s;register int a;

但是register需要注意一下几点:

1、register变量必须是一个单个的值,并且长度不能太长,一般不能大于一个int的长度

2、不能被取地址,也即&a是非法的

3、register static int a非法,局部静态变量不可申明为register,全局变量也不可申明为register

标签: #c语言关键字 register