auto 类型推导:让编译器替你写类型
auto 让编译器根据初值自动确定类型:auto a = 3 是 int,auto b = 3.14 是 double。
类型在编译期就定死,不影响运行速度。auto 必须写初值,否则无从推导、直接报错。
基本用法
auto a = 3; // a 是 int
auto b = 3.14; // b 是 double
auto c = 'X'; // c 是 char
编译器看 = 右边的初值,推导出左边的类型。推导发生在编译期——程序运行时,auto 变量与手写类型的变量没有任何差别,不存在性能损失。
必须给初值
auto x; // 编译报错:无法推导
auto y = 0; // 正确:y 是 int
初值是 auto 推导的唯一依据,没有初值就没有类型。这条约束也顺手治好了"忘记初始化"的老毛病。
什么时候用
auto 适合两类场景:一是类型从初值一目了然,写出来是重复劳动(auto sum = a + b;);二是类型名字又长又难写——这个要等 STL 章节才有体会,届时遍历容器的迭代器类型动辄几十字符,auto 是标准解法。
反过来,初值看不出类型时不该用:auto x = f(); 读者不知道 x 是什么,不如写明 int x = f();。auto 是省事的工具,不是隐藏信息的工具。
可视化观察
在 CppStudio 中打开本课示例,点击播放:
- 四个 auto 变量依次出现在监视区,对照初值看它们各自的真实类型;
a + 10的结果 sum 也是 auto,监视区确认它是 int;- 尝试把
auto b = 3.14;改成auto b;再运行,亲眼看一次"无法推导"的编译报错。
常见错误
- 不写初值:
auto x;编译失败,auto 与初始化永远同时出现; - 以为类型运行时才定:auto 不是"任意类型",编译期就固定了,之后给 a 赋小数同样会被截断或报错;
- 过度使用:每个变量都 auto,代码读起来全靠猜,类型不明时请写明。
下一课:章末演练——用一个综合程序复盘变量的诞生、变化与消失。
▶ 运行本课示例 弹窗里直接跑,流程图同步展开;也可新窗口打开
常见问题
auto 是什么意思?
让编译器根据初始值自动推导类型:auto a = 3; 中 a 是 int,auto b = 3.14; 中 b 是 double。类型在编译时就确定,不是动态类型。
auto 可以不写初始值吗?
不可以。auto 靠初值推类型,auto x; 没有初值无从推导,直接编译报错。
auto 会让程序变慢吗?
不会。类型推导发生在编译期,运行时 auto 变量与手写类型的变量完全没有差别。
什么时候用 auto 合适?
类型明显从初值看得出时用(如 auto sum = a + b;),类型复杂难写时用(STL 迭代器,后续章节见)。初值看不出类型时(如 auto x = f();),写明类型更清楚。