程序就是把数据放进变量,再对它们做运算。数据类型决定了数据在内存中如何表示,每种类型决定了变量能存什么样的值、占多少内存、能参与哪些运算。

变量:给内存里的数据起名字

变量就是程序运行期间用来存数据的一块内存空间。你给它起个名字,以后按名字读写。先看一个完整程序:

内存 A 18 9.9 grade = 'A' char · 占 1 个字节 age = 18 int · 占 4 个字节 price = 9.9 double · 占 8 个字节 同一块内存里,char 占 1 格、int 占 4 格、double 占 8 格,类型决定了变量占用的大小。
C 语言变量声明与数据类型示例运行
#include <stdio.h>

int main(void) {
    int age = 18;         // 整数
    double price = 9.9;   // 小数(双精度,默认的浮点类型)
    char grade = 'A';     // 单个字符,用单引号

    printf("age = %d\n", age);
    printf("price = %.1f\n", price);
    printf("grade = %c\n", grade);
    return 0;
}

输出:

age = 18
price = 9.9
grade = A

注意几个细节:

  • 先声明再使用。声明语句 int age; 做了两件事:定义变量名 + 定义它能存的数据类型。
  • 声明与初始化是两回事int age; 只是声明,此时它的内容是未知的垃圾值;int age = 18; 才是声明并初始化。C 不会像 Python 那样自动把你的变量清零,所以声明后先初始化再使用,是最容易被忽略的习惯。
  • = 是赋值,不是数学等号a = a + 1 的意思是:把 a 当前的值加 1 后再存回 a。
  • 同类型的变量可以一条语句声明多个:int x, y, z;

C 语言的基本数据类型

C 语言的内置类型不多,但每一种都有明确的字节数和取值范围。以下是初学者必会的五种:

类型含义典型大小典型范围格式符
int整数4 字节-2,147,483,648 ~ 2,147,483,647%d
char单个字符1 字节-128 ~ 127(默认 signed)%c
float单精度浮点数4 字节约 3.4e-38 ~ 3.4e+38%f
double双精度浮点数8 字节约 1.7e-308 ~ 1.7e+308%lf / %f
void无类型

有两点要提醒:

  • 大小在不同平台上并不完全一样。上表是 64 位桌面系统(Linux/macOS/Windows 配合 GCC/Clang)下的常见值。C 标准只保证最小宽度(比如 int 至少 16 位),所以不同编译器的真实大小可能不同。
  • sizeof 验证。想知道你机器上到底多大,就用它:
#include <stdio.h>

int main(void) {
    printf("int=%zu, char=%zu, float=%zu, double=%zu\n",
           sizeof(int), sizeof(char), sizeof(float), sizeof(double));
    return 0;
}

常见输出:

int=4, char=1, float=4, double=8

类型修饰符:让类型更灵活

在基本类型前加修饰符,可以改变大小或取值范围:

  • signed / unsigned,有无符号。unsigned int 只能存非负数,但最大值翻倍到约 42 亿。类似地,char 默认带符号(-128~127),unsigned char 可到 0~255。
  • short / long / long long,改宽度。long long 通常 8 字节,范围约 ±9.2×1018,存不下的大数用它。

一个很方便的分类视角:整数类型(char/int/short/long/long long)、无符号整数(加 unsigned)、浮点数(float/double)、布尔值(新版用 bool,老版本常拿 char 顶替)。字符串在 C 语言里不是内置类型,而是"以 \0 结尾的 char 数组",后面专门有一章讲

类型选择速查

拿不准选哪种类型时,可以按下面的思路来选:

① 需要小数?
   → 是:double(比 float 更精确,默认选它)
   → 否:继续 ②
② 只存一个字符?
   → 是:char
   → 否:继续 ③
③ 整数
   → 范围在 ±21 亿内:int(默认选择)
   → 更大:long long

四个常见误区

误区 1:用了未初始化的变量

int x;
printf("%d\n", x);   // 垃圾值!每次运行可能不同
int y = 0;           // 正确:先初始化再使用

误区 2:整数除法直接截断

double r1 = 7 / 2;      // 3.0,不是 3.5!整数除整数结果是整数
double r2 = 7.0 / 2;    // 3.5,正确做法:至少一边是浮点

误区 3:占位符和类型不匹配

int n = 42;
printf("%f\n", n);   // 未定义行为,可能打印垃圾或崩溃

误区 4:有符号整数溢出是未定义行为

int m = 2000000000;
m = m + 1000000000;  // 溢出,结果未定义(别这么写)

常量:加了封印的变量

  • const 修饰:一旦赋值不能再改,否则编译器报错。const double PI = 3.14159;
  • 字面量(literal):直接写进代码的值,比如 189.9'A'"hello"

变量能够存放不同数据,常量的值固定不变。接下来介绍怎样接收键盘输入,把数据保存到变量里。