现在的位置: 首页 > 综合 > 正文

正确、简单的代码是并非想象的那么简单

2012年11月19日 ⁄ 综合 ⁄ 共 893字 ⁄ 字号 评论关闭

出处:后来增加http://wesnerm.blogs.com/net_undocumented/2004/02/correct_code_is.html 即使是最简单、最原始的数据结构都会有一些特殊的例子会使debug变得很困难,例如,考虑整型integers)来看看。

你是怎样写一个比较两个整数的函数的,需求为:在第一个数小于第二个数的时候,返回负数,相等返回零,大于就返回正数。如果你就像下边这样写
public int Compare(int i1, int i2)
{
   return i1-i2;
}
这段代码将会在遇到极值的时候出问题,因为在非检测模式下的(unckecked mode)
Compare(int.MinValue, int.MaxValue) 将不会返回1,而且,Compare(int.MaxValue, int.MinValue) 也不会返回-1。即使是使用检测模式(Checked mode)也是于事无补,因为从这个函数不应该引发一个异常,正确的做法如下:
public int Compare(int i1, int i2)
{
   return i1>i2 ? 1 : i1<i2 ? -1 : 0;
}
使用有符号位的浮点数,只是消除了出错的可能性。然而,许多浮点数是不可以比较的,这
种情况下,比较的结果将会是零。

现在让我们写一个求绝对值的函数,它仅仅返回一个正数的绝对值,听起来很容易,是吗?
public int Abs(int n)
{
   return n>=0 ? n : -n;
}
真正的问题在于,机器数0不是数字0的唯一否定值,int.MinValue也是0的否定,因为没有办
法表示这个数的否定(-2147483648而最大的正数是2147483647)。因此正确的写法如下:
public int Abs(int n)
{
   return n>=0 ? n : checked(-n);
}
如果你使用如下的测试,将会得到一个异常(算术运算导致溢出)
Response.Write(Abs(int.MinValue).ToString()+ "<br>");

我举个例子只是想简单的说明,能写出正确的代码并非微不足道。

请认真地对待编程、对待自己的职业!


 

抱歉!评论已关闭.