总结几个C语言中的坑(二)
2015-06-08 16:43
288 查看
近来又发现了几个C语言中的坑,现总结如下以备后续学习过程中查看回顾。
1、float变量与"零"值的比较
众所周知float型和double型都是有精度限制的,在计算机中用一个近似值来表示任意某个实数。具体的说,这个实数由一个整数或定点数(即尾数)乘以某个基数(计算机中通常是2)的整数次幂得到,因此使用 if(a == 0) 这样的语句往往会发生意想不到的错误,那么怎样才能比较精确的将浮点型变量与“零”值进行比较呢?这里给出了一种常用的方法。
(pps:由于浮点型变量的存储机制最好不要进行很大的浮点数与很小的浮点数之间进行运算,比如11111111111.000+0.00000000000001这个运算结果可能会很奇葩!)
2、strcpy函数运行机制的理解(来自华为面试题,程序本意是想实现字符串的复制)
3、代码不规范所带来的意想不到的错误
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);
相关文章推荐
- 总结几个C语言中的坑(二)
- C++第七章
- C++第五章
- C/C++ 笔试、面试题目大汇总-1
- NYOJ 55 懒省事的小明(哈弗曼树)
- BUFF 在C++ 中取其中一部分 并且写到固定的目录下
- C++ 中 五种基本的内存分配方式
- C++ static 静态成员变量 和 静态成员函数
- C++程序设计 - Week 6 多态与虚函数
- 第十四周项目4(3)-处理C++源代码的程序
- c++ --> static关键字总结
- 第十四周项目4(2)-处理C++源代码的程序
- C++64位整型相乘取模的溢出处理(一)
- C++经典面试题
- C++全局变量的声明和定义
- 第十四周项目4(1)-处理C++源代码的程序
- 模板类和友元函数
- 下推栈实现(c++编程思想 p136)
- 【Minimum Window】cpp
- 关于C#中调用C++编写的DLL(非托管的DLL)的实现和问题记录