banner.gif adie's blog
主页 博客 胭脂泪,相留醉,几时重,自是人生长恨水长东
统计
日志总数: 127
评论总数: 123
日志分类
日志归档
最近日志
最近评论
订阅
rss2.gif

atom.gif

google_rss
yc.gif 【技术评论】 阅读 5464 次

动态语言最容易出错的地方 ---- 不区分定义和赋值

2011-10-13 13:47:19

许多动态语言的变量是无需定义就可以直接使用的, 比如 Python,  perl 等, 还有一些动态语言虽然可以先进行定义, 但是没有定义的变量还是可以直接使用, 比如 JavaScript, Basic 等等. 这些语言的赋值语句兼有定义变量的功能, 比如一个 x = 5, 可能是在改变一个已经存在的变量的值, 也可能是重新定义一个新的变量. 这样看起来是很方便, 实际上确是非常容易产生错误的. 并且它可能把一个在 C++, Java 这些语言中可以在编译期就检查出来的拼写错误变成一个逻辑错误! 注意是逻辑错误, 不是运行的时候出错, 你的程序还将正常运行, 只是里面的逻辑已经发生了变化, 运行的结果可能是正确的, 也可能在某些时候变得莫名其妙, 是属于最难找的那类错误! 

第一种情况是对已有变量赋值时拼写错误了

hello = 10

heiio = hello + 1

return hello

这里的第二行本来是想把 hello 的值增加 1 的, 结果由于拼写错误, 变换成了一个新变量的定义, 程序照常运行, hello 的值没变...  如果区分了定义和赋值, 这里的赋值是一个未定义的变量, 程序不能正常运行, 这个错误很快就会被找出来, 会被直接定位到错误的地方. 而变成逻辑错误了之后,  除非你有非常完善的单元测试来测试你的逻辑,  否则这个错误将会很难找到.

 

还有一种情况是定义新变量时和已有变量重名了, 如果定义有自己的语法明确这是条定义, 这个重名也能立即被发现, 但是把定义和赋值混淆后会把它认为是一个赋值语句, 改变了之前变量的值, 引起逻辑上的混淆.

 

 

▲评论

X 正在回复:
姓 名: 留下更多信息
性 别:
邮 件:
主 页:
Q Q:
来 自:
职 业:
评 论:
验 证:


Valid HTML 4.01 Strict Valid CSS!
Copyleft.A!die Software Studio.ADSS
Power by webmaster@adintr.com