17 · 类型转换与错误处理
隐式转换(自动,可能悄悄丢精度)
int a = 3.9; // → 3(截断,不是四舍五入)
double d = 5; // int → double,安全
int x = 10; unsigned y = 20;
if (x < y) { } // ⚠️ x 被转成 unsigned,负数会变大数
显式转换(强制类型转换)
double pi = 3.14159;
int n = (int)pi; // → 3
int a = 5, b = 2;
double r = (double)a / b; // ✅ → 2.5(不转就是 2.0)
⚠️ 指针转换要格外小心:(int*) 转 (char*) 再解引用会出问题。
⭐ C 没有异常!错误处理全靠返回值 + errno
#include <errno.h>
#include <string.h>
FILE *fp = fopen("no.txt", "r");
if (fp == NULL) {
printf("错误码 errno = %d\n", errno);
printf("错误信息: %s\n", strerror(errno)); // 把错误码翻译成文字
perror("fopen"); // 直接打印 "fopen: No such file"
return -1;
}
约定:
- 函数返回 NULL / -1 / 非 0 表示出错。
- errno 是全局错误码(<errno.h>),用 strerror(errno) 可读化。
- 自己写的函数也应用返回值告诉调用者成功还是失败。
常用错误码
| errno | 含义 |
|---|---|
EACCES |
权限不足 |
ENOENT |
文件不存在 |
ENOMEM |
内存不足 |
EINVAL |
参数无效 |
⚡ Java 对比
Java 的 try/catch 强制你处理异常;C 里没人管你,忘了检查返回值,程序会带着错误默默往下跑,最后在某处神秘崩溃 —— 所以 C 程序员的习惯是「每个可能失败的系统调用后面立刻判返回值」。
关联
03-数据类型与变量 · 15-文件读写 · 19-内存管理