---
slug: auto
lesson: 14
chapter: 2
chapterTitle: 变量
title: auto 类型推导：让编译器替你写类型
description: auto 让编译器根据初始值自动确定变量类型：auto a = 3 是 int，auto b = 3.14 是 double。auto 必须给初值，不写初值编译报错。本课用可在线运行的示例看 auto 变量的真实类型。
code: |
  #include <iostream>
  using namespace std;

  int main() {
      auto a = 3;
      auto b = 3.14;
      auto c = 'X';
      auto sum = a + 10;
      cout << a << " " << b << " " << c << " " << sum << endl;
      return 0;
  }
faq:
  - q: auto 是什么意思？
    a: 让编译器根据初始值自动推导类型：auto a = 3; 中 a 是 int，auto b = 3.14; 中 b 是 double。类型在编译时就确定，不是动态类型。
  - q: auto 可以不写初始值吗？
    a: 不可以。auto 靠初值推类型，auto x; 没有初值无从推导，直接编译报错。
  - q: auto 会让程序变慢吗？
    a: 不会。类型推导发生在编译期，运行时 auto 变量与手写类型的变量完全没有差别。
  - q: 什么时候用 auto 合适？
    a: 类型明显从初值看得出时用（如 auto sum = a + b;），类型复杂难写时用（STL 迭代器，后续章节见）。初值看不出类型时（如 auto x = f();），写明类型更清楚。
---

<div class="answer">
auto 让编译器根据初值自动确定类型：auto a = 3 是 int，auto b = 3.14 是 double。
类型在编译期就定死，不影响运行速度。auto 必须写初值，否则无从推导、直接报错。
</div>

## 基本用法

```cpp
auto a = 3;      // a 是 int
auto b = 3.14;   // b 是 double
auto c = 'X';    // c 是 char
```

编译器看 `=` 右边的初值，推导出左边的类型。推导发生在**编译期**——程序运行时，auto 变量与手写类型的变量没有任何差别，不存在性能损失。

## 必须给初值

```cpp
auto x;     // 编译报错：无法推导
auto y = 0; // 正确：y 是 int
```

初值是 auto 推导的唯一依据，没有初值就没有类型。这条约束也顺手治好了"忘记初始化"的老毛病。

## 什么时候用

auto 适合两类场景：一是类型从初值一目了然，写出来是重复劳动（`auto sum = a + b;`）；二是类型名字又长又难写——这个要等 STL 章节才有体会，届时遍历容器的迭代器类型动辄几十字符，auto 是标准解法。

反过来，初值看不出类型时不该用：`auto x = f();` 读者不知道 x 是什么，不如写明 `int x = f();`。auto 是省事的工具，不是隐藏信息的工具。

## 可视化观察

在 CppStudio 中打开本课示例，点击播放：

1. 四个 auto 变量依次出现在监视区，对照初值看它们各自的真实类型；
2. `a + 10` 的结果 sum 也是 auto，监视区确认它是 int；
3. 尝试把 `auto b = 3.14;` 改成 `auto b;` 再运行，亲眼看一次"无法推导"的编译报错。

## 常见错误

- **不写初值**：`auto x;` 编译失败，auto 与初始化永远同时出现；
- **以为类型运行时才定**：auto 不是"任意类型"，编译期就固定了，之后给 a 赋小数同样会被截断或报错；
- **过度使用**：每个变量都 auto，代码读起来全靠猜，类型不明时请写明。

下一课：章末演练——用一个综合程序复盘变量的诞生、变化与消失。
