让程序员都费解的10大编程语言特性
作者:junjie 发布时间:2023-09-12 03:56:49
每种语言都有自己的独到之处,或奇特的语法,或不常见的函数,或非标准的执行方式。因此,不论新丁还是老手,看着某个特性会突然醉了。文中总结了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
猜你喜欢
- 翻译整理:Young.J;官方网站:http://jquery.comjQuery是一款同prototype一样优秀js开发库类,特别是对c
- 使用type()查看数据的类型在Python中, 可以使用type()类型来查看数据的类型:>>> type(3)<
- 在使用matplotlib模块时画坐标图时,往往需要对坐标轴设置很多参数,这些参数包括横纵坐标轴范围、坐标轴刻度大小、坐标轴名称等 在mat
- 前言之前在使用包括大型文档(商汤科技、百度飞浆)代码的时候都一直使用 pip install -v -e . ,这一命令,但是一直不是很清楚
- 序列是Python中最基本的数据结构。序列中的每个元素都分配一个数字 - 它的位置,或索引,第一个索引是0,第二个索引是1,依此类推。Pyt
- 对于xml2ddl项目,Freshmeat.org提供了一整套基于GNU或者GPL通用公共许可证下的Python程序。在一个运行的Pytho
- 下面演示了,当asp程序发生错误时,屏蔽系统默认的错误显示,而显示自定义的错误信息。<%@ LANGUAGE="V
- 首先我们知道这个效果应该是一个老话题了。今天整理文件的时候,发现自己以前的一些布局的解决方法躺在文件夹里很长时间了,翻翻老底吧。需要说明的是
- 前言:随着企业应用的不断迭代,不断扩大,应用的发布发布可能涉及多个团队,如pc端,手机端,小程序端等等。应用发布也就成为了一项高风险,高压力
- 目录一 列表二 集合三 字典总结一 列表# 列表:包含0个或多个对象引用的有序队列,用中括号[]表示# 增加 a = [] a.append
- 本文实例讲述了Python实现的txt文件去重功能。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#! pyt
- 很多时候我们都需要了解下python中导入包的属性方法信息,当然dir 是最便捷的了,不过如果想知道特定的,例如以_ 开头的属性,需要写个筛
- tensorflow利用anaconda在ubuntu下安装方法及jupyter notebook运行目录及远程访问配置Ubuntu下安装A
- 找到一句可以获得当前最新ID的语句,如下:conn.execute("insert into member (user,code)
- 一、为什么要使用Python进行数据分析?python拥有一个巨大的活跃的科学计算社区,拥有不断改良的库,能够轻松的集成C,C++,Fort
- Python中的模块(.py文件)在创建之初会自动加载一些内建变量,__name__就是其中之一。Python模块中通常会定义很多变量和函数
- 元字符(Meta Characters)是正则表达式中具有特殊意义的专用字符,在Python中也不例外,是用来指明前导字符(位于元字符前的字
- MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值
- 本文实例讲述了php查询whois信息的方法。分享给大家供大家参考。具体如下:这里使用php通过查询whois信息的网站列表进行查询func
- 一、生产者消费者模型介绍1.1 为什么需要使用生产者消费者模型生产者是指生产数据的任务,消费者是指消费数据的任务。当生产者的生产能力远大于消