C 语言书
模块一 · 入门基础 / 第 02 课

02 · 变量与数据类型

入门 30 分钟 跳到过关题
学习目标
  • 会声明并使用变量
  • 分清 int、char、float 的用途
  • 知道类型决定「占多大、能装什么」

变量 = 有名字的盒子

程序要处理数据,就得先有地方存。变量就是带名字的盒子。声明时要说明类型,类型回答两个问题:

  • 占多大空间:int 常见 4 字节,char 1 字节……
  • 怎么解释里面的比特:同样是 0100…,当 int 读是整数,当 float 读是小数

所以「先声明类型,再赋值」不是语法洁癖,而是让编译器知道该分配多少字节、该用哪套算术规则。

#include <stdio.h>

int main(void)
{
    int age = 18;           // 整数:年龄、个数
    float score = 92.5f;    // 小数:分数(f 表示单精度字面量)
    char grade = 'A';       // 单个字符,用单引号

    printf("年龄=%d\n", age);     /* %d 对应 int */
    printf("分数=%.1f\n", score); /* %.1f 保留 1 位小数 */
    printf("等级=%c\n", grade);   /* %c 对应 char */
    return 0;
}

常用类型一览

类型放什么例子printf 占位符
int整数42、-7%d
float单精度小数3.14f%f
double更精确的小数3.14159%lf 或 %f
char一个字符'A'、'0'%c
单引号 vs 双引号
'A' 是 char(一个字符)。 "A" 是字符串(一串字符,后面细讲)。 不能混用:char c = "A"; 类型不对。

占位符必须和类型对齐,这是初学最常见的「打印出乱码/怪数」原因:用 %d 打 float、用 %f 打 int,都是未定义行为,结果不可信。

命名规则(必须记)

  • 只能用字母、数字、下划线
  • 不能以数字开头(2name 非法,name2 合法)
  • 不能用关键字(如 int、for)
  • 建议起有意义的名字:score、max_value

好名字能省掉注释。x 在算法题里可以,在业务代码里三个月后就是谜语。

赋值与修改

赋值 = 是「算出右边,存进左边」。左边必须是可写的盒子(变量),不能写 18 = age;。

n = n + 5 读作:取出 n 的旧值,加 5,再写回 n。它不是数学等式,而是「更新」。

#include <stdio.h>

int main(void)
{
    int n = 10;
    printf("%d\n", n);   // 10
    n = 20;               // 再次赋值,旧值被覆盖
    n = n + 5;            // 用旧值算完再存回去
    printf("%d\n", n);   // 25
    return 0;
}

未初始化就很危险

局部变量若不赋值就使用,内容是不确定的垃圾值。养成习惯:定义时就初始化。

int a;       /* 危险:不知道里面是多少 */
int b = 0;   /* 安全:明确从 0 开始 */

int c, d = 1;  /* c 未初始化,d 是 1 —— 容易看漏 */

sizeof:看类型占几字节

不同环境里 int 可能是 2 或 4 字节。不确定时就问 sizeof:

#include <stdio.h>

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

类型决定能装什么

类型大约范围适合存
char-128~127单个字符、很小的整数
int数十亿(4字节时)年龄、个数、下标
float约 6~7 位有效数字一般小数
double约 15 位有效数字更精确的计算
别混用
给 float 赋值建议写 1.75f(带 f),更明确。 把大数硬塞进 char 会溢出,结果变得很怪。

单片机场景 · 变量与常量:计数器

计数、温度和按键状态都是变量。使用前赋初值,并根据范围选择类型。

边界与验证:执行后 cnt = 1,sum = 1。0~255 以 8 位 unsigned char 为前提;实际范围可查看 limits.h 中的 UCHAR_MAX。

unsigned char cnt = 0;
int sum = 0;
cnt = cnt + 1;
sum = sum + cnt;

本课过关

必做

下面哪个是合法的变量名?

必做作业
  1. 声明姓名首字母(char)、年龄(int)、身高(float),并打印出来。
  2. 把 age 从 18 改成 19,写出两行赋值代码。
  3. 解释 int 和 float 分别适合存什么。
先自己写完,再点开看解答

1:综合声明与打印

#include <stdio.h>
int main(void)
{
    char first = 'X';
    int age = 18;
    float height = 1.75f;

    printf("首字母 %c\n", first);
    printf("年龄 %d\n", age);
    printf("身高 %.2f\n", height);  /* %.2f 保留两位 */
    return 0;
}

2:赋值 age = 18; age = 19; 或直接 int age = 19;。

3:怎么选类型:整数、个数、下标、开关用 int;带小数的测量值(身高、温度)用 float/double;单个字符用 char。钱在工程里常存「分」(整数),避免浮点误差累加。