类型与变量

程序需要保存数量、比例、状态和字符。类型说明一份数据能表示什么,变量则给这份数据一个可以在代码中使用的名字。本章讨论 C++ 内置类型与变量,字符串等文本类型由字符串章节承担。

选择基础类型

常见基础类型可以先这样理解:

类型 适合表示 示例
int 整数 count
double 近似小数 ratio
bool 真或假 enabled
char 单个字符 grade
types-and-variables.cpp
#include <iostream>

int main() {
  int count{12};
  double ratio{0.85};
  bool enabled{true};
  char grade{'A'};

  std::cout << "数量: " << count << "\n";
  std::cout << "比例: " << ratio << "\n";
  std::cout << std::boolalpha << "已启用: " << enabled << "\n";
  std::cout << "等级: " << grade << "\n";
  return 0;
}

类型不是装饰:它会影响可表示的值、允许的运算和编译器能发现的错误。double 不是“更大的 int”,bool 也不是只能保存任意整数的容器。

初始化与赋值

声明变量时要写类型和名字,初始化则是在创建时给它第一个值,赋值是修改已经存在的变量:

片段:声明、初始化与赋值
// 片段
int count{12};
count = count - 3;
int remaining{count};

变量的类型在创建后不会改变。需要表达数量时使用整数,需要表达是否成立时使用 bool,不要把所有数据都塞进 double 或 int。

作用域

写在函数外的名字处于全局作用域,整个翻译单元都可能看见它。写在一对花括号内的名字处于块作用域,离开代码块后就不能再使用:

片段:全局作用域与块作用域
// 片段
int default_limit{1};  // 全局作用域:示例中的共享值

int main() {
  int count{12};      // main 的块作用域
  {
    int increment{3}; // 内层块作用域
    count += increment;
  }
  // increment 在这里已经不可见。
}

全局可见不等于应该到处修改。可变全局状态会让代码难以测试。后续 const、constexpr 和自定义类型章节会继续说明更稳妥的组织方式。

常见错误

字符当文本

char 用单引号表示一个字符,例如 'A',多个字符的文本属于字符串主题。

使用前没有初始化

局部自动变量写成 int count; 后直接读取,没有可依赖的初始值,属于未定义行为,创建时使用 {} 或明确的初始值。

过度使用全局变量

全局作用域用于少量真正共享的值即可,会变化的状态优先放在更小的作用域中。

自测问题

  1. 为什么比例适合用 double,数量适合用 int?
  2. 全局作用域和块作用域的可见范围有什么不同?
  3. count = 500; 与 int count{500}; 分别是什么动作?

本章回顾

你已经能用 int、double、bool 和 char 表达基础数据,并能区分初始化、赋值以及全局和块作用域。可运行示例见 types-and-variables.cpp。