30条初学C语言踩过的坑(上):被浮点数精度折磨到怀疑人生
2026/7/26 1:24:19 网站建设 项目流程

最近翻电脑旧文件,翻出了我当年初学C语言时亲手记的老笔记。

全是当年没人带、没人教,纯靠自己写代码报错、熬夜调试,一点点踩坑总结出来的血泪经验。

课本只会讲标准语法,这些藏在实操里的隐形坑,老师基本不会细讲。但初学写代码时,80%的诡异bug、莫名其妙的报错,全都出自这些细节。

下面这10条最经典的初学翻车笔记,每条都附带我当年真实踩坑经历 + 可直接运行的演示代码。正在学C的新手认真看完,能少走半年弯路。

1. 浮点数精度丢失:写记账程序,金额永远差0.000001

初学练手写小计费程序时,我一直纳闷:为什么简单的小数相加,结果永远差一点点?

后来才懂核心原理:很多十进制小数转二进制是无限循环小数,电脑存不下,只能截断保存,天然带误差。

错误示范(新手必写):

#include int main(void) { float money = 0.1f; if (money == 0.1f) { printf("相等\n"); } return 0; } // 相等判断永远不会执行

最大误区:浮点数绝对不能用==判断相等。

正确写法(误差比对):

#include #include int main(void) { float a = 0.1f; float b = 0.1f; if (fabs(a - b) < 1e-6) { printf("数值相等\n"); } return 0; }

2. long long不加LL后缀:大数悄悄溢出全错

刚学long long的时候,我完全不知道数字常量默认是int。数字稍微大一点,不加LL直接溢出截断,算出来的结果完全离谱。

// 错误写法:大数默认int,溢出出错 long long num1 = 9223372036854775807; // 正确写法 long long num2 = 9223372036854775807LL;

3. long long不初始化:变量忽对忽错,玄学现场

初学写代码特别懒,变量随手定义不初始化。当时经常遇到一个玄学问题:代码没变,有时候结果对、有时候错。

后来才知道:局部变量不初始化,里面是栈内存遗留的随机乱码,运算自然飘忽不定。

long long data1; // 翻车:随机脏数据 long long data2 = 0;// 规范:定义必清零

4. 除数为0:随手一写,程序直接闪退

初学写公式,经常不小心出现变量为0的情况,程序直接闪退。C语言除0是硬性崩溃红线,不会警告、直接终止。

int res = 10 / 0; // 经典翻车

5. 返回值-1用char接收:类型坑导致莫名报错

初学调用库函数,看到返回-1代表失败,随手用char去接收。实际char存负数极易出异常,符号错乱。

新手统一记住:接收函数返回值,全部用int。

char ret1 = -1; // 错误写法 int ret2 = -1; // 稳妥写法

6. unsigned减法溢出:倒计时突然变超大数

这是我初学觉得最玄学的bug。写倒计时功能用了unsigned变量,减到不够减的时候,不会变负数,直接溢出成超级大数,判断逻辑全部失效。

#include int main(void) { unsigned int num = 2; num = num - 5; // 不是-3,是超大正数 printf("%u\n", num); return 0; }

7. float/double精度有限:高精度计算全白写

float只有6~7位有效数字,double只有15~16位有效数字。数值一旦过长,后面全是虚假乱数,精密计算绝对不能用float。

8. char越界翻转:赋值128,正数变负数

char范围-128~127,强行赋值128会循环翻转成负数,判断条件直接错乱。

9. i++与++i混用:循环逻辑悄悄乱

i++先取值后自增,++i先自增后取值。嵌套代码里混用,会出现肉眼完全看不出来的逻辑bug。

10. 浮点数判等必须用误差区间

新手一定要养成习惯,浮点比较永远这样写:

if (fabs(a - b) < 1e-6)

这10条里面,我最惨的是unsigned减法溢出那一回,倒计时变超大数,查了一晚上没睡着。

你初学C语言时,被浮点数精度、unsigned溢出、还是char越界坑得最惨?

评论区告诉我你踩过哪个——1=浮点数,2=unsigned,3=char,我看看哪个是“初学全民公敌”

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询