---
slug: init
lesson: 13
chapter: 2
chapterTitle: 变量
title: 变量的三种初始化写法：=、()、{} 有什么区别？
description: C++ 定义变量有三种初始化写法：int a = 1、int b (2)、int c {3}，效果相同但严格程度不同——{} 会拒绝 90.5 这类丢失精度的初始化。现代 C++ 推荐 {}，本课用可在线运行的示例对比三种写法。
code: |
  #include <iostream>
  using namespace std;

  int main() {
      int a = 1;
      int b(2);
      int c{3};
      cout << a << " " << b << " " << c << endl;
      return 0;
  }
faq:
  - q: int a = 1 和 int b(2) 和 int c{3} 有什么区别？
    a: 对 int 这类基本类型效果相同，都是定义并给初值。差别在严格程度：{} 会检查精度丢失，int x{90.5} 直接编译报错，而 = 和 () 会默默截断成 90。
  - q: 三种初始化应该选哪种？
    a: 现代 C++ 推荐 {}（列表初始化），因为它最严格、写法在各种场景下最统一。看别人的代码时三种都要认识。
  - q: int a{} 不给值可以吗？
    a: 可以，而且有用：{} 不给初值时自动初始化为 0。int a{}; 等价于 int a = 0;，这是 {} 独有的便利。
---

<div class="answer">
三种写法效果相同：int a = 1、int b(2)、int c{3}。差别在严格程度——
{} 发现精度丢失会直接报错（int x{90.5} 编译失败），= 和 () 会默默截断。
{} 空写还能自动初始化为 0。现代 C++ 推荐 {}。
</div>

## 三种写法

```cpp
int a = 1;    // 拷贝初始化，最传统
int b(2);     // 直接初始化，函数式写法
int c{3};     // 列表初始化，C++11 起
```

对基本类型，三行效果完全一样。请三种都认识——读别人的代码都会遇到。

## {} 的严格性

```cpp
int x = 90.5;    // 编译通过，x 悄悄变成 90
int y{90.5};     // 编译报错：不允许丢失精度
```

用 `=` 或 `()` 时，把小数装进 int 会被**默默截断**；用 `{}` 则直接编译失败，把问题暴露在写代码的当下。这是 `{}` 被推荐的核心理由：让错误尽早出现。

另一个便利：`int a{};` 不给值会自动初始化为 0，是"定义即清零"的紧凑写法。

## 一点历史感

老代码里 `=` 最多，2011 年以后的代码 `{}` 渐成主流。本系列的示例从本课起统一使用 `{}`，与主流现代教材一致。`{}` 的真正价值到容器（装一组值的类型）才完全展现，数组和 STL 章节会回收这一点。

## 可视化观察

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

1. 三个变量依次出现在监视区，值分别为 1、2、3——三种写法，同一个结果；
2. 输出区一行显示 `1 2 3`；
3. 可以把示例里的 `int c{3}` 改成 `int c{3.5}` 再运行，亲眼看一次编译报错——这是 `{}` 严格性的直接体验。

## 常见错误

- **以为 () 里能写多个值**：`int b(1, 2);` 非法，基本类型一次只能初始化一个值；
- **以为 = 也有检查**：`int x = 90.5;` 不报错只截断，误以为程序正确；
- **圆括号与花括号混写**：`int c{3};` 写成 `int c({3});` 属于画蛇添足，按三种标准写法之一写即可。

下一课：auto 类型推导——让编译器根据初值自动判断类型。
