最奇特的编程语言特征

本文引自 [url=http://www.aqee.net/docs/kibo/]外刊IT评论网 [/url]

目前为止,据我个人观察,从语法角度上讲,最被人诟病的一种语言应该是LISP语言了。打开这种语言的代码,一眼望去,满目全是括弧,一层套一层。这种语言特征最大的问题是,它不符合人们通常的思维习惯。LISP语言的这个特点是个整体的语言现象,而任何一种语言其实也都有一些个别的很奇特的东西,其中有些会奇怪的让你摸不着头脑。有一个好事者在一个帖子上征集各种语言里不合常理的地方,结果收集到了320多条,问题最大最多的语言算是Javascript了,另外还有C,Java,Python,PHP等等。下面列出的是其中最有趣的几条。

在C语言里,数组可以这样索引取值:

a[10]


这种写法相当常见。

然而,还有一种很少见的写法(绝对可用!)是这样的:

 10[a] 


这两种写法的效果是一样的。
在JavaScript里:

'5' + 3 结果是 '53' 




 '5' - 3 结果是 2 


在JavaScript里,下面的语法结构

return
{
id : 1234,
title : 'Tony the Pony'
};


会提示语法错误:”缺少分号”。而下面的写法却能按你预想的结果运行:

 return {
id : 1234,
title : 'Tony the Pony'
};


更让人郁闷的是下面的写法竟然可以(至少在谷歌浏览器里是这样的):

return /*
*/{
id : 1234,
title : 'Tony the Pony'
};


下面的例子也是同样的问题引起的,但不会报错,而你却得不到想要的结果:

 return
2 + 2;


JavaScript的等式对照表:

''        ==   '0'           // false
0 == '' // true
0 == '0' // true
false == 'false' // false
false == '0' // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true


Java里有趣的自动打包(auto boxing)和IntegerCache:

 Integer foo = 1000;
Integer bar = 1000;

foo = bar; // true
foo == bar; // false


//然而,如果 foo 和 bar 的值介于 127 和 -128 之间,
//情况会发生变化:

Integer foo = 42;
Integer bar = 42;

foo = bar; // true
foo == bar; // true


解释

在Java源代码里你很快能翻出下面的内容:

 /**
* Returns a Integer instance representing the specified
* int value.
* If a new Integer instance is not required, this method
* should generally be used in preference to the constructor
* {@link #Integer(int)}, as this method is likely to yield
* significantly better space and time performance by caching
* frequently requested values.
*
* @param i an int value.
* @return a Integer instance representing i.
* @since 1.5
*/
public static Integer valueOf(int i) {
if (i >= -128 && i


注意; IntegerCache.high 的值,如果你不设置它,缺省是 127。

自动打包(auto boxing)过程中发生的事情是:除非显式的创建:比如 foo = new Integer(42) ,否则 foo 和 bar 都是从缓存中取出的整数,当比较值时,它们会返回 true。正确的比较Integer的方式是使用 .equals 。
在Java里:

try {
return true;
} finally {
return false;
}

在Python和JavaScript也可以这样写。这样写的结果是什么?当作一个保留的问题考考大家吧。
C++的模板可以做很多奇怪的事情,最好的例证是 “多维模拟排版”,你可以用模板来计算“画出的”形状。下面是一段计算一个3×3矩形的有效的C++代码:

    #include"analogliterals.hpp"
using namespace analog_literals::symbols;

unsigned int c = ( o-----o
| !
! !
! !
o-----o ).area;


这还有一个3D立方体的例子:

assert( ( o-------------o
|L \
| L \
| L \
| o-------------o
| ! !
! ! !
o | !
L | !
L | !
L| !
o-------------o ).volume == ( o-------------o
| !
! !
! !
o-------------o ).area * int(I-------------I) );


PHP处理数字字符

  "01a4" != "001a4"


如果两个字符串来的字符数不相等,它们不可能相等。前面的零非常重要,因为他们是字符而不是数字。

    "01e4" == "001e4"


PHP不太喜欢字符,它会寻找任何的借口来把你提供的值当作数字。把这些十六进制的字符串稍微做些改动,PHP马上认为它们不再是字符,而是数字。它们是按科学计数法写的数字(PHP并不在意你是否用了引号),它们是相等的,因为对于数字来说,前面的零是可以忽略的。更强化这个事实的例子是,你会发现PHP认为 “01e4″ == “10000″ 是正确的,因为作为数字,它们的值是相当的。这是一个被特别提醒的语言特征,原因就是它不太合理。
在一些没有保留字、关键字的语言里,例如PL/I, 你可以写出这样有趣而且合法的代码语句:

 IF IF THEN THEN = ELSE ELSE ELSE = THEN

(IF, THEN, ELSE 都是变量名),或

IF IF THEN THEN ELSE ELSE

(IF 是变量,THEN 和 ELSE 都是函数)
JavaScript里八进制的转换:

parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10


在C语言里,你可以把 do/while 语句和 switch 交织在一起,下面就是一个使用这种方法的内存拷贝的例子:

 void duff_memcpy( char* to, char* from, size_t count ) {
size_t n = (count+7)/8;
switch( count%8 ) {
case 0: do{ *to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
}while(--n>0);
}
}


在Python中:

>>> x=5
>>> 1>> 1


在Java中:

 int[] numbers() {
return null;
}


可以被写成:

int numbers() [] {
return null;
}


如果你觉得还没看够,请到[url=http://stackoverflow.com/questions/1995113/strangest-language-feature]这里[/url],还有更多。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值