c语言与c++语言中关键字auto的使用

最近一直在读cpp方面的书籍,虽然每天看的页数不多,但是收获很多,我时间不是很充裕,只能挑拣着一点我觉得我已经掌握的还可以了,有一定把握写好的记录下来。之前写了两篇博客都是讲解cpp与C中的一些关键字的差别,这一篇也是,讲的是关键字auto在c与cpp中的差异。

c语言中的auto

大家都学过c语言,但是可能很多人都不知道c语言中还有个关键字叫做auto。其实很正常,这个关键字在c语言中确实没什么存在感。在讲解之前,我们先来了解一下c语言中变量的存储类型。

存储类型

变量的存储类型是指存储变量值的内存类型。变量的内存类型决定了变量何时创建、何时销毁、以及它的值将保持多久。

一般有三个地方可以存储变量:静态普通内存、运行时堆栈、硬件寄存器。

  1. 其中静态变量存储在静态普通内存,这种变量在程序运行之前创建,在程序的整个执行期间始终存在。它始终保持原先的值,除非赋给它一个不同的值或者程序结束。
  2. 自动变量存储在堆栈中,代码块中的变量在缺省情况下就是自动变量。在程序执行到声明自动变量的代码块时,自动变量才创建,当程序执行离开该代码块时,这些自动变量便会自行销毁。
  3. 寄存器变量存储在硬件寄存器中,需要用关键字register来声明。这种变量访问效率更高,一般用于对效率要求高的地方,同时由于寄存器有限,编译器只会理睬有限少数几个register声明,甚至不理睬(有的编译器)。寄存器变量的创建与销毁和自动变量相同,但它需要一些额外操作,在一个使用寄存器变量的函数返回之前,这些寄存器先前存储的值需要恢复,确保调用者的寄存器变量未被破坏。

auto的作用

上面讲解了c语言中变量的存储类型,这关auto什么事情呢?细心地人可能会发现,三种存储类型的变量中有一种叫做自动变量,auto刚好有自动的意思。这不是巧合,c语言中auto关键字就是用来修饰这种类型的。

但是在c语言中auto极少使用,因为代码块中的变量在缺省情况下就是自动变量。实在是找不到用它的场合。

c++中的auto

相比较于c语言中auto关键字打酱油一般的角色,在c++中,auto关键字的地位简直是天差地别,当然,关键字的含义也是天差地别。

在c++中,auto是一种类型说明符,用它就会使编译器替我们分析表达式所属于的类型。

1
2
int i=10;
auto j=i;
在上述代码中,编译器会根据初始值分析并未变量j选择int类型作为初始化类型。也因为这个特性,auto定义的变量必须有初始值(不然编译器不好分析啊)。阅读相关代码时,大家可以简单的把auto替换成合适的类型说明符(比int,float等)。

在c++中,经常会将auto用于基于范围的for语句,用于遍历string对象或者vector的每个元素。

1
2
3
4
string str("some string");
for (auto &c : str)
c = toupper(c);
cout<<str<<endl;

还有一种场合,在你不知道或者不确定一个元素的类型时,比如使用迭代器时,迭代器的类型很难记,又长,可以直接用auto代替。

1
2
vector<int> v(10,1);
auto b = v.begin(); //代表v的第一个元素
其中auto就相当于vector<int>::iterator,明显省事了很多,而且迭代器的类型实在难记。类似的还有string和vector的size_type成员到底是什么类型一样等。

题外话 decltype

在c++还有一个与auto功能类似的符号,就是decltype。

1
2
int ci = 0;
decltype(ci) x = 0;
上述代码中decltype(ci)返回变量ci的类型,并将x声明为这种类型。

参考资料

  • [1] C++ Primer(第5版)
  • [2] c和指针

c语言与c++语言中关键字auto的使用
http://line.com/2018/08/26/2018-08-26-auto-c-cpp/
作者
Line
发布于
2018年8月26日
许可协议