让程序员都费解的10大编程语言特性

每种语言都有自己的独到之处,或奇特的语法,或不常见的函数,或非标准的执行方式。因此,不论新丁还是老手,看着某个特性会突然醉了。文中总结了10个经常被提及的“奇异”特性。

1. Javascript: + 是一个连接符

问题描述:

在JS中,+ 号用在数字间,可以用作常规加法;但如果遇上字符,又可作为字符连接符。例如:'1'+ 1的结果是11。

成因分析:

根本性原因是JS属于弱类型语言。比方说Python,同样地使用+ 号作为字符连接符,但由于它是强类型语言,一旦发现一个字符与一个整数进行相加,它会提示这是个错误操作。

网友们的看法:

“问题在于这是个无法预料的强制性静默转换,很容易就忽略了。”匿名

“JS应该就该情况作异常抛出处理。” crgwbr

“用+来进行字符连接简直是个噩梦。” Matteo Riva

2. Perl:模块必须返回TRUE值

问题描述:

绝大多数情况下,Perl模块在结束时候,都必须以1;语句来结尾,否则,如果最后一条语句的返回值不是TRUE,系统就会报错了。

成因分析:

Perl模块中包含了初始代码和子程序。当模块文件被载入时,Perl会根据是否返回TRUE来判断代码是否成功执行。即使没有初始代码,Perl仍然期望最后的语句需返回TRUE,否则会报错。

网友们的看法:

“这个通常让我有不安的感觉。” Drew Hall

“这是最无实用价值的用法了。”Schwern

3. C/C++:三字母词用法

问题描述:

举例来说,系统看到??!会把它自动转为|,看到??(会转为[。这很容会引起造成意想不到的结果,并且会大大降低代码的可读性。

成因分析:

早期进行编程时,键盘上还不能直接打出某些特殊字符,例如大括号。因此用了这种间接的方法。

网友们的看法:

“博学如谷歌,也一定看不懂什么是??!??!” Isaac

“自1977年有了三字母词,C就变得晦涩难懂了。”Martin Beckett

4. PHP:大小写敏感处理

问题描述:

PHP对大小写处理比较混乱,有些地方区分,有些地方不区分。例如:变量名,常量名区分;函数名,方法名,类名不区分。

成因分析:

很可能是PHP从CGI脚本集发展成成熟编程语言过程中出现的人工产品。

网友们的看法:

“这是为什么PHP程序员习惯用下划线进行函数命名,而不是采取驼峰命名法的原因。”paperstreet7

“在PHP中,一切皆有可能!”Grzechooo

5. Ruby:0作为真值

问题描述:

在Ruby中,0值等同于TRUE值。这对有C,Python基础的程序员来说不可不谓是一场噩梦。

成因分析:

只有布尔值FALSE和nil等价于FALSE,其余的都等同于TRUE。0与1,2,3等都会被相同对待。

网友们的看法:

“这简直是让人抓狂,虽然初衷是善意的。”Chris Lutz

“0==true!我这个C语言脑袋都快崩溃了!”Kenny

6. Python:以空格数进行层次划分

问题描述:

不同于采用关键字或标点符,PY中采用缩进层级来进行层次划分,以明确每一行代码的位置。不正确的空格数(或空格和换位符数不一致)都可能造成程序报错。

成因分析:

PY作者的意图是希望代码更为可读,减少不必要的输入,并希望程序员本身应该承担起维护代码清晰度的责任。

网友们的看法:

“由衷地说,这是使我对PY敬而远之的根本原因。”wazoox

“如果我们真的需要类似的强制机制,我们是不是真的太懒了!”Joris Meys

7. C:数组索引工作模式等同于指针

问题描述:

在C中,a[i]和i[a]是可以互换的,两个写法都能得出一样的结果。

成因分析:

在C中,对内存块而言,数组与指针是无差别的,就是说:

a[i] = *(a + i) = *(i + a) =i[a]。

网友们的看法:

“在C语言混乱代码比赛中,这毫无价值可言。”Confusion

“我想这正正揭露了C语言的核心,指针和更直接地与内存打交道。”Michael Neale

8. Perl's:预定义变量

问题描述:

Perl有一份很长很长的特殊变量列表,里面的名字都是十分繁杂的(尽管有对应的长英文单词)。因此,除非是Perl资深开发人员,否则反复翻阅Perl文档是常有的事。

成因分析:

这些变量都有不同的含义,例如:进程ID($$),错误信息($@),正则表达式匹配($^R)。

网友们的看法:

“十分令人懊恼!”MatrixFrog

“对精简型开发者可能是福音。”niXar

“这些变量的问题是:无法通过谷歌查找得到!” malvim

9. JavaScript:自动分号插入

问题描述:

JS使用分号作为语句结束的标志,并且会自行插入,即使是代码断行的情况。因此会常常导致错误的出现。

成因分析:

自动化的本意是为了带来便利,特别是对新手来说。

网友们的看法:

“如果我们设计语言的特性时,老把用户看成是傻瓜,那是会出问题的。”Rob Van Dam

“自动分号插入是JS最让人头疼的地方之一。” fennec

10. Java:自动装箱(autoboxing)与Integer缓存

问题描述:

Java会自动把基础类型数据转为对象(自动装箱),例如把int转为一个Integer对象。同时默认地,缓存Integer对象的取值为-128到127。这样的话,在使用==来比较两个相同取值Integer对象时会出现问题(在-128和127之内是TRUE,其余的是FALSE)

成因分析:

自动装箱机制减少了代码输入量,同时Integer缓存提升了处理速度。

网友们的看法:

“还好我只是一名C#程序员。” Will

“这不算什么错误,反而给了我们一个使用原始类型(如:booleans)进行数字处理的理由。”RaviWallau

(0)

相关推荐

  • 8种类型极品程序员,不知你属于哪一种?

    在日常工作里肯定会发现很多有趣的事情,极品程序员所做的事就是很有意思的.事实上,现在所讨论的极品程序员主要是从他们的判断力.行为举止.个人态度和匪夷所思的工作方式上来判断的,有的时候这些程序员一味的只是追求文档上的内容,而不擅于用分析方式来解决问题. 几乎每一个软件开发者多多少少都会出现头脑短路的现象,也就是说,下面所列举的各种极品程序员类型,总有一款是属于你的. 1. 钟爱型程序员:万般宠爱集于一种技术 这种类型的程序员所遇到的致命错误就是:只钟爱一种技术,对别的技术不来电.其实这不是什么值得

  • 关注程序员健康:程序最需要注意的几件事

    导读: 说实在的,程序员是一门苦差事,虽然工资待遇相对其他行业略高一点,但是工作节奏和工作压力却远远大于大部分行业.然而,面对这样一个客观事实,仍有很大一部分程序员没有良好的工作方法和生活方式,让自己长期处在亚健康的状态,这是让人非常心痛的. 本文列出了几件毁掉程序员健康的事情,希望你可以尽量避免它们,写健康的程序代码. 一.熬夜 很多程序员将熬夜变成了生活习惯,还口口声声解释"程序员只有在晚上效率才高",这是非常扯淡的理论.有人将程序员做下图的类比,虽然比较贴切,但这种方式对你的健康

  • 让程序员都费解的10大编程语言特性

    每种语言都有自己的独到之处,或奇特的语法,或不常见的函数,或非标准的执行方式.因此,不论新丁还是老手,看着某个特性会突然醉了.文中总结了10个经常被提及的"奇异"特性. 1. Javascript: + 是一个连接符 问题描述: 在JS中,+ 号用在数字间,可以用作常规加法:但如果遇上字符,又可作为字符连接符.例如:'1'+ 1的结果是11. 成因分析: 根本性原因是JS属于弱类型语言.比方说Python,同样地使用+ 号作为字符连接符,但由于它是强类型语言,一旦发现一个字符与一个整数

  • Java程序员容易犯的10大低级错误

    本文根据java开发人员在编码过程中容易忽视或经常出错的地方进行了整理,总结了十个比较常见的低级错误点,方便大家学习. 1.不能用"=="比较两个字符串内容相等. 2. 对list做foreach循环时,循环代码中不能修改list的结构. 3. 日志和实际情况不一致;捕获异常后没有在日志中记录异常栈. 4. 魔鬼数字. 5. 空指针异常. 6. 数组下标越界. 7. 将字符串转换为数字时没有捕获NumberFormatException异常. 8. 对文件.IO.数据库等资源进行操作后

  • 程序员都不知道C语言中的这些小细节

    既然题目都说了是小细节,一来就介绍细节多没意思啊,先坑坑大家再详细介绍吧,嘿嘿.直接上7个题吧,看看你能做对几个呢? 计算型细节 ①: #include <stdio.h> int main() { char a = 3; char b = 127; char c = a + b; printf("结果是:%d",c); return 0; } 您想想这个题的答案是多少?先不要看后面的答案哦 答案是 -126, 嘿嘿,是不是答错了呢?先不要着急,继续看下面的题 ②: #in

  • 作为Java程序员应该掌握的10项技能

    本文详细罗列了作为Java程序员应该掌握的10项技能.分享给大家供大家参考.具体如下: 1.语法:必须比较熟悉,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息知道是什么样的语法错误并且知道任何修正. 2.命令:必须熟悉JDK带的一些常用命令及其常用选项,命令至少需要熟悉:appletviewer.HtmlConverter.jar.java.javac.javadoc.javap.javaw.native2ascii.serialver,如果这些命令你没有全部使用过,那么你对jav

  • Java 程序员容易犯的10个SQL错误

    Java程序员编程时需要混合面向对象思维和一般命令式编程的方法,能否完美的将两者结合起来完全得依靠编程人员的水准: 技能(任何人都能容易学会命令式编程) 模式(有些人用"模式-模式",举个例子,模式可以应用到任何地方,而且都可以归为某一类模式) 心境(首先,要写个好的面向对象程序是比命令式程序难的多,你得花费一些功夫) 但当Java程序员写SQL语句时,一切都不一样了.SQL是说明性语言而非面向对象或是命令式编程语言.在SQL中要写个查询语句是很简单的.但在Java里类似的语句却不容易

  • 小米Java程序员第二轮面试10个问题 你是否会被刷掉?

    近日,开发者头条上分享了一篇"小米java第二轮面经",有很多的java程序员表示非常有兴趣. 下面就和各位分享小米java第二轮面经: 0.谈谈对Spring的认识 1.java集合的继承关系 相关文章: java集合继承关系图分享 Java集合类的组织结构和继承.实现关系详解 Java集合继承体系详解 Java中集合关系图及常见操作详解 2.你知道CLOSE_WAIT这个状态吗? 3.谈谈你对jvm.java内存模型的认识? 4.Java里的红黑树是怎么实现的? 相关文章: jav

  • 程序员应该投资的10件事

    1.  关注你的健康 毫无疑问,软件开发是一项最需要久坐的工作之一,每天在电脑前要坐 8 到 16 个小时,中间几乎没有休息,这就很容易长肉.而肥胖很很可能会引起其它的疾病,心脏病就是其中一种严重的疾病.当然,你可以通过一些锻炼避免它,比如花点儿钱去办一张健身卡. 长时间不符合人体工程学的打字姿势,会造成软件开发人员重复性的肌肉损伤,比如腕管综合征.你应该每隔几个小时的打字后就活动伸展一下手腕,防止这样的损伤,或者选择买带有手腕保护功能的鼠标和键盘.总盯着屏幕也会给你的眼睛带来压力,这就是为什么

  • Java程序员应该遵守的10条纪律

    有哪些"纪律"是Java程序员所要遵守的? 1. 为代码添加注释(Add comments to your code). – 每个人都知道这一点,但不是每个人都会这么做.你有多少次"忘记"添加注释了?确实,注释不会为你的程序增加任何函数功能.但是,有多少次,看到2周前写的代码,你都记不起它是干什么的?你很幸运,那些未注释的代码是你自己写的,你脑海中还会有残存的印象.非常不幸,大多时候,代码是别人写的,并且那个人很可能已经离开公司了.有句谚语说的好:"有来有

  • 每个程序员都应该学习使用Python或Ruby

    如果你是个学生,你应该会C,C++和Java.还会一些VB,或C#/.NET.多少你还可能开发过一些Web网页,你知道一些HTML,CSS和JavaScript知识.总体上说,我们很难发现会有学生显露出掌握超出这几种语言范围外的语言的才能.这真让人遗憾,因为还有很多种编程语言,它们能让你成为一个更好的程序员. 在这篇文章里,我将会告诉你,为什么你一定要学习Python或Ruby语言. 跟C/C++/Java相比 - Python/Ruby能让你用少的多的多的代码写出相同的程序.有人计算过,Pyt

  • 每个程序员都需要学习 JavaScript 的7个理由小结

    最近在和招聘经理交流现在找一个好的程序员有多难的时候,我渐渐意识到了现在编程语言越来越倾重于JavaScript.Web开发人员尤其如此.所以,如果你是一个程序员,那么你应该去学习JavaScript. 需求 我之所以这样说的主要原因是,随着JavaScript的日渐成熟,以及Node.js方案变得越来越可行,我们对JavaScript程序员的需求正在持续增长. JavaScript在需求比例上已经超过了C#,仅屈居于Java之下.如果你看看GitHub上可行的项目,你会发现JavaScript

随机推荐