总结几个C语言中的坑(二)
近来又发现了几个C语言中的坑,现总结如下以备后续学习过程中查看回顾。
1、float变量与"零"值的比较
众所周知float型和double型都是有精度限制的,在计算机中用一个近似值来表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,因此使用 if(a == 0) 这样的语句往往会发生意想不到的错误,那么怎样才能比较精确的将浮点型变量与“零”值进行比较呢?这里给出了一种常用的方法。
#define EPSINON 0.000001 if ((a >= - EPSINON) && (a <= EPSINON)(ps:EPSINON是一个宏,它的值可以改成你想要的精度,通过这种方式也可以进行其他任何值的精度比较。)
(pps:由于浮点型变量的存储机制最好不要进行很大的浮点数与很小的浮点数之间进行运算,比如11111111111.000+0.00000000000001这个运算结果可能会很奇葩!)
2、strcpy函数运行机制的理解(来自华为面试题,程序本意是想实现字符串的复制)
void test() { char str[10],str1[10]; int i; for (i = 0; i < 10; i++) { str1[i] = 'a' + i; } strcpy(str,str1); }这段代码第一眼看过去是没问题的,但是再看一眼就能够很轻松找到错误了,strcpy函数是拷贝字符串的函数,它是以'\0'为结尾的,因此当程序运行strcpy这一行时会发生内存非法访问导致程序崩溃。
3、代码不规范所带来的意想不到的错误
<span style="font-size:18px;">y = x/*p; </span>代码的原意为x除以p所指向的内存中的值再将其赋给y,结果。。。。/*看着好奇怪。。。。那不是注释吗????天哪!!!!因此你可以将它写成y = x / *p;或者y = x / (*p);