程序就是把数据放进变量,再对它们做运算。数据类型决定了数据在内存中如何表示,每种类型决定了变量能存什么样的值、占多少内存、能参与哪些运算。
变量:给内存里的数据起名字
变量就是程序运行期间用来存数据的一块内存空间。你给它起个名字,以后按名字读写。先看一个完整程序:
#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):直接写进代码的值,比如
18、9.9、'A'、"hello"。
变量能够存放不同数据,常量的值固定不变。接下来介绍怎样接收键盘输入,把数据保存到变量里。