最奇特的编程语言特征

开发 前端 开发工具
有一个好事者在一个帖子上征集各种语言里不合常理的地方,结果收集到了320多条,问题最大最多的语言算是Javascript了,另外还有C,Java,Python,PHP等等。下面列出的是其中最有趣的几条。

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

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

  1. a[10]  

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

  1. 10[a]  

这两种写法的效果是一样的。

在JavaScript里:

  1. '5' + 3 结果是 '53'  

  1. '5' - 3 结果是 2  

在JavaScript里,下面的语法结构

  1. return 
  2. {  
  3.     id : 1234,  
  4.     title : 'Tony the Pony' 
  5. }; 

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

  1. return {  
  2.     id : 1234,  
  3.     title : 'Tony the Pony' 
  4. }; 

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

  1. return /*  
  2. */{  
  3.     id : 1234,  
  4.     title : 'Tony the Pony' 
  5. }; 

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

  1. return 
  2.     2 + 2; 

JavaScript的等式对照表:

  1. ''        ==   '0'           // false  
  2. 0         ==   ''            // true  
  3. 0         ==   '0'           // true  
  4. false     ==   'false'       // false  
  5. false     ==   '0'           // true  
  6. false     ==   undefined     // false  
  7. false     ==   null          // false  
  8. null      ==   undefined     // true  
  9. " \t\r\n" ==   0             // true 

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

  1. Integer foo = 1000;  
  2. Integer bar = 1000;  
  3.  
  4. foo = bar; // true  
  5. foo == bar; // false  
  6.  
  7. //然而,如果 foo 和 bar 的值介于 127 和 -128 之间,  
  8. //情况会发生变化:  
  9.  
  10. Integer foo = 42;  
  11. Integer bar = 42;  
  12.  
  13. foo = bar; // true  
  14. foo == bar; // true 

解释

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

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

注意; IntegerCache.high 的值,如果你不设置它,缺省是 127。 自动打包(auto boxing)过程中发生的事情是:除非显式的创建:比如 foo = new Integer(42) ,否则 foo 和 bar 都是从缓存中取出的整数,当比较值时,它们会返回 true。正确的比较Integer的方式是使用 .equals 。

在Java里:

  1. try {  
  2.     return true;  
  3. finally {  
  4.     return false;  

在Python和JavaScript也可以这样写。这样写的结果是什么?当作一个保留的问题考考大家吧。

C++的模板可以做很多奇怪的事情,***的例证是 “多维模拟排版”,你可以用模板来计算“画出的”形状。下面是一段计算一个3×3矩形的有效的C++代码:

  1. #include"analogliterals.hpp"  
  2. using namespace analog_literals::symbols;  
  3.  
  4.           unsigned int c = ( o-----o  
  5.                              |     !  
  6.                              !     !  
  7.                              !     !  
  8.                              o-----o ).area; 

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

  1. assert( ( o-------------o  
  2.            |L             \  
  3.            | L             \  
  4.            |  L             \  
  5.            |   o-------------o  
  6.            |   !             !  
  7.            !   !             !  
  8.            o   |             !  
  9.             L  |             !  
  10.              L |             !  
  11.               L|             !  
  12.                o-------------o ).volume == ( o-------------o  
  13.                                              |             !  
  14.                                              !             !  
  15.                                              !             !  
  16.                                              o-------------o ).area * int(I-------------I)  

#p#

PHP处理数字字符

  1. "01a4" != "001a4" 

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

  1. "01e4" == "001e4" 

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

在一些没有保留字、关键字的语言里,例如PL/I, 你可以写出这样有趣而且合法的代码语句:

  1. IF IF THEN THEN = ELSE ELSE ELSE = THEN 

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

  1. IF IF THEN THEN ELSE ELSE 

(IF 是变量,THEN 和 ELSE 都是函数)

JavaScript里八进制的转换:

  1. parseInt('06'// 6  
  2. parseInt('07'// 7  
  3. parseInt('08'// 0  
  4. parseInt('09'// 0  
  5. parseInt('10'// 10 

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

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

在Python中:

  1. >>> x=5 
  2. >>> 1>> 1 

在Java中:

  1. int[] numbers() {  
  2.   return null;  

可以被写成:

  1. int numbers() [] {  
  2.   return null;  

如果你觉得还没看够,请到这里,还有更多。

原文:http://www.aqee.net/strangest-language-feature/

【编辑推荐】

  1. 提交中的骂声:哪种编程语言最遭骂?
  2. 从过去5年编程语言的演化看未来趋势
  3. 关于Node.js语言的讨论
  4. Dart语言惯用语——Dart中特有的代码味道
  5. 为什么说设计是网站的肢体语言?
责任编辑:陈贻新 来源: 外刊IT评论
相关推荐

2021-03-23 14:50:16

编程语言Rust漏洞

2014-02-04 19:44:23

编程语言开发

2013-04-11 09:51:43

编程语言

2012-03-30 13:56:17

编程开发

2013-07-11 08:51:06

编程语言

2018-03-13 09:34:30

人工智能编程语言Python

2019-04-24 09:20:58

Go语言编程语言

2015-04-22 14:37:41

大数据大数据奇特应用

2018-01-02 14:00:16

编程语言Bug

2011-12-20 15:57:32

程序员

2012-03-27 09:36:59

编程语言

2019-01-30 12:38:41

JavaScript前端编程语言

2015-05-04 10:05:11

编程语言GitHub流行语言

2021-12-29 10:18:46

编程语言PythonJava

2017-12-12 23:22:52

2015-05-07 10:10:29

GitHub编程语言

2018-01-10 08:45:57

编程语言PythonKotlin

2015-04-20 14:27:40

大数据奇特应用

2018-06-06 16:25:44

码农出身奇特

2018-09-11 15:18:41

编程语言TJavaScriptJava
点赞
收藏

51CTO技术栈公众号