🎯 本章你会学到:搞清基本类型的大小、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 的格式符
| 类型 | printf | scanf | 说明 |
|---|---|---|---|
| int | %d | %d | 最常用的整数 |
| long long | %lld | %lld | 需要大范围时用它 |
| double | %f / %.2f | %lf | 读入必须 %lf,输出常用 %.2f |
| char | %c | %c | 读字符时前面加空格可跳过空白 |
| 字符串 | %s | %63s | 读入要限宽,防止越界 |
| size_t | %zu | %zu | sizeof 的结果类型 |
读入两个数并计算
#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=7、d=2.00、n/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。