柚子Nan--回归原点

Everything can be as easy as you like or as complex as you need.
posts - 231, comments - 973, trackbacks - 17, articles - 29
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

出处:后来增加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>");

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

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


 

Feedback

#1楼    回复  引用    

2004-03-09 14:31 by ahnan [未注册用户]
既然是翻译的,怎么不把原文链接贴出来?
http://wesnerm.blogs.com/net_undocumented/2004/02/correct_code_is.html

#2楼    回复  引用  查看    

2004-03-09 14:54 by koffer      
抱歉,忘记了。 多谢这个兄弟提醒 http://wesnerm.blogs.com/

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2004-03-09 16:18 编辑过


相关链接: