← C 语言 学习路线(共 8 章)

第 2 章 变量、类型与输入输出

red wenzi · 2026-09-15 · 编程语言 · C 语言 · 📖 预计阅读 8 分钟 · 共 2 道练习
🎯 本章你会学到:搞清基本类型的大小、printf/scanf 的格式符,以及为什么类型选错会出错。建议边读边敲,每节练习先自己做,再展开答案对照。

C 的类型大小是跟平台绑定的:同一个 int 在不同平台上可能是 4 字节或 2 字节。写 C 要养成心里有数的习惯。

基本类型与 sizeof

sizeof.c
#include <stdio.h>

int main(void) {
    printf("char=%zu short=%zu int=%zu long=%zu long long=%zu\n",
           sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long));
    printf("float=%zu double=%zu 指针=%zu\n",
           sizeof(float), sizeof(double), sizeof(int *));
    return 0;
}
运行结果
char=1 short=2 int=4 long=4 long long=8
float=4 double=8 指针=8

输出的数字取决于平台:64 位 Windows / Linux 上通常是 1、2、4、4 或 8、8,double 是 8,指针是 8。写这类代码永远用 sizeof,不要写死数字。

printf 与 scanf 的格式符

类型printfscanf说明
int%d%d最常用的整数
long long%lld%lld需要大范围时用它
double%f / %.2f%lf读入必须 %lf,输出常用 %.2f
char%c %c读字符时前面加空格可跳过空白
字符串%s%63s读入要限宽,防止越界
size_t%zu%zusizeof 的结果类型
读入两个数并计算
#include <stdio.h>

int main(void) {
    int n = 0;
    double d = 0.0;
    if (scanf("%d %lf", &n, &d) != 2) {   /* 检查返回值:成功读入了几个 */
        return 1;
    }
    printf("n=%d\n", n);
    printf("d=%.2f\n", d);
    printf("n/d=%.3f\n", (double)n / d);  /* 整数除整数会截断,先转 double */
    return 0;
}
输入
7 2
运行结果
n=7
d=2.00
n/d=3.500

输入 7 2 会输出 n=7d=2.00n/d=3.500。注意 (double)n / d 里的转换:整数除整数会向零截断,5 / 2 得 2 而不是 2.5。

⚠️ 易错点 scanf 忘了写 &scanf("%d", n) 是把变量的值当地址用,程序很可能直接崩溃,而编译器不一定报错。
⚠️ 易错点 读 double 要用 %lf。用 %f 读 double 是未定义行为(%f 是给 float 用的)。

✍️ 本节练习

2.1必做圆的面积

读入半径 r(double),输出面积,保留 3 位小数。圆周率用 3.14159265。

输入 一个实数 r。

输出 一行 area=面积(3 位小数)。

样例输入
2
样例输出
area=12.566

💡 提示 scanf("%lf", &r) 读入,printf("area=%.3f\n", ...) 输出。

✅ 查看参考答案与解析
#include <stdio.h>

int main(void) {
    double r = 0.0;
    if (scanf("%lf", &r) != 1) {
        return 1;
    }
    printf("area=%.3f\n", 3.14159265 * r * r);
    return 0;
}

解析 %.3f 表示保留 3 位小数;先算 r * r 再乘 π。

2.2挑战秒数换算

读入一个整数秒数(0 ≤ n ≤ 10^9),输出它等于多少小时、多少分钟、多少秒。

输入 一个整数 n。

输出 一行三个整数:小时 分钟 秒。

样例输入
3725
样例输出
1 2 5

💡 提示 小时用 n / 3600,分钟用 n % 3600 / 60,秒用 n % 60

✅ 查看参考答案与解析
#include <stdio.h>

int main(void) {
    long long total = 0;
    if (scanf("%lld", &total) != 1) {
        return 1;
    }
    long long h = total / 3600;
    long long m = total % 3600 / 60;
    long long s = total % 60;
    printf("%lld %lld %lld\n", h, m, s);
    return 0;
}

解析 %/ 优先级相同、从左到右结合,所以 total % 3600 / 60 等价于 (total % 3600) / 60

📚 本文概念都在知识大全:

C 语言 · GCC 编译器 · 指针 · 动态内存 malloc/free · C 字符串 · 结构体 · 预处理 · 编译与链接