c语言与c++语言中关键字auto的使用
最近一直在读cpp方面的书籍,虽然每天看的页数不多,但是收获很多,我时间不是很充裕,只能挑拣着一点我觉得我已经掌握的还可以了,有一定把握写好的记录下来。之前写了两篇博客都是讲解cpp与C中的一些关键字的差别,这一篇也是,讲的是关键字auto在c与cpp中的差异。
c语言中的auto
大家都学过c语言,但是可能很多人都不知道c语言中还有个关键字叫做auto。其实很正常,这个关键字在c语言中确实没什么存在感。在讲解之前,我们先来了解一下c语言中变量的存储类型。
存储类型
变量的存储类型是指存储变量值的内存类型。变量的内存类型决定了变量何时创建、何时销毁、以及它的值将保持多久。
一般有三个地方可以存储变量:静态普通内存、运行时堆栈、硬件寄存器。
- 其中静态变量存储在静态普通内存,这种变量在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非赋给它一个不同的值或者程序结束。
- 自动变量存储在堆栈中,代码块中的变量在缺省情况下就是自动变量。在程序执行到声明自动变量的代码块时,自动变量才创建,当程序执行离开该代码块时,这些自动变量便会自行销毁。
- 寄存器变量存储在硬件寄存器中,需要用关键字register来声明。这种变量访问效率更高,一般用于对效率要求高的地方,同时由于寄存器有限,编译器只会理睬有限少数几个register声明,甚至不理睬(有的编译器)。寄存器变量的创建与销毁和自动变量相同,但它需要一些额外操作,在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值需要恢复,确保调用者的寄存器变量未被破坏。
auto的作用
上面讲解了c语言中变量的存储类型,这关auto什么事情呢?细心地人可能会发现,三种存储类型的变量中有一种叫做自动变量,auto刚好有自动的意思。这不是巧合,c语言中auto关键字就是用来修饰这种类型的。
但是在c语言中auto极少使用,因为代码块中的变量在缺省情况下就是自动变量。实在是找不到用它的场合。
c++中的auto
相比较于c语言中auto关键字打酱油一般的角色,在c++中,auto关键字的地位简直是天差地别,当然,关键字的含义也是天差地别。
在c++中,auto是一种类型说明符,用它就会使编译器替我们分析表达式所属于的类型。
1
2int i=10;
auto j=i;
在c++中,经常会将auto用于基于范围的for语句,用于遍历string对象或者vector的每个元素。
1
2
3
4string str("some string");
for (auto &c : str)
c = toupper(c);
cout<<str<<endl;
还有一种场合,在你不知道或者不确定一个元素的类型时,比如使用迭代器时,迭代器的类型很难记,又长,可以直接用auto代替。
1
2vector<int> v(10,1);
auto b = v.begin(); //代表v的第一个元素vector<int>::iterator
,明显省事了很多,而且迭代器的类型实在难记。类似的还有string和vector的size_type成员到底是什么类型一样等。
题外话 decltype
在c++还有一个与auto功能类似的符号,就是decltype。 1
2int ci = 0;
decltype(ci) x = 0;decltype(ci)
返回变量ci的类型,并将x声明为这种类型。
参考资料
- [1] C++ Primer(第5版)
- [2] c和指针