17 · 类型转换与错误处理

2026.09.27 · 🟡 中

隐式转换(自动,可能悄悄丢精度)

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-内存管理