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

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

a[10]

  这种写法相当常见。

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

10[a] 

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

  2、在 JavaScript 里:

 '5' + 3 结果是 '53' 

  而

'5' - 3 结果是 2 

  3、在 JavaScript 里,下面的语法结构

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

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

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

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

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

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

return2 + 2;

  4、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 。

  6、在 Java 里:

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

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

  7、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) );

  8、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 都是函数)

  10、JavaScript 里八进制的转换:

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

  11、在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;}

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

转载于:https://www.cnblogs.com/kivenhou/archive/2011/12/26/2302504.html

最奇特的编程语言的特征相关推荐

  1. 最奇特的编程语言特征

    目前为止,据我个人观察,从语法角度上讲,最被人诟病的一种语言应该是LISP语言了.打开这种语言的代码,一眼望去,满目全是括弧,一层套一层. 这种语言特征最大的问题是,它不符合人们通常的思维习惯.LIS ...

  2. HttpWatch工具简介及使用技巧

    joan 私は张で QQ:774199038 HttpWatch工具简介及使用技巧(转载) 一 概述: HttpWatch强大的网页数据分析工具.集成在Internet Explorer工具栏.包括网 ...

  3. 一种奇特的DEDE隐藏后门办法

    ? 15:24 / 28 一种奇特的DEDE隐藏后门办法 单位某站用的dedecms,今天被某黑阔getshell了,提交到了wooyun. 为了还原黑阔入侵的手法,用鬼哥的getshell测试居然没 ...

  4. 《C语言编程魔法书:基于C11标准》——第一篇 预备知识篇 第1章 C魔法概览1.1 例说编程语言...

    本节书摘来自华章计算机<C语言编程魔法书:基于C11标准>一书中的第1章,第1.1节,作者: 陈轶 更多章节内容可以访问云栖社区"华章计算机"公众号查看. 第一篇 预备 ...

  5. python vb 哪个好学_最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几...

    原标题:最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几 在很多人眼里程序员的标配就是黑框眼镜+格子衫+双肩包+牛仔裤+运动鞋,拥有了这些可能就被判定为一个程序员. 而如何判定一个程 ...

  6. 集合论怎么用计算机语言表示,编程语言理论

    编程语言理论(PLT)是计算机科学的一个分支,涉及编程语言及其各自特征的设计,实现,分析,表征和分类. 它属于计算机科学学科,既依赖于并影响数学,软件工程,语言学甚至认知科学. 它是一个公认的计算机科 ...

  7. 最全GIS开发编程语言汇总及分类

    目录 编程语言的特征 GIS开发通用编程语言 一级流行编程语言 Python JavaScript C# C++ Java 二级流行编程语言 C PHP R/S Ruby Rust Shell SQL ...

  8. 计算机语言python发音_最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几...

    原标题:最难学的七大编程语言,VB 第一,Python垫底,看你学的排第几 在很多人眼里程序员的标配就是黑框眼镜+格子衫+双肩包+牛仔裤+运动鞋,拥有了这些可能就被判定为一个程序员. 而如何判定一个程 ...

  9. 漫画 | 编程语言三巨头的陨落

    对于一个小学生来说,就可以轻松地计算这样的算式  3+10*5 但是对一个程序员来说,如果你想从头儿写个程序,解析并执行这个算式,你会发现就很难了. 但是,算术表达式可以更复杂,需要一个通用的程序处理 ...

最新文章

  1. DeviceEventEmitter 使用监听通知进行传值
  2. Matlab符号运算总结
  3. Serializable在C#中的作用及其优点
  4. mysql数据库上传ftp服务器中_备份部分mysql表并上传至指定ftp服务器目录中
  5. 宣布EAXY:在Java中简化XML
  6. Kettle7.1在window启动报错
  7. 阿里巴巴下一代云分析型数据库AnalyticDB入选Forrester Wave™ 云数仓评估报告 解读
  8. Java基础入门笔记-单根继承
  9. javaweb解决编码问题_学习编码? 首先,学会解决问题。
  10. tolua打包Android后路径出错,unity+tolua 64位android崩溃排查过程记录
  11. c语言优先级大全,C语言运算符及其优先级汇总表口诀
  12. 15_http响应相关概念
  13. 加密芯片SPI通讯的调试
  14. php 用什么缓存最好,在PHP中缓存中/大型数据集的一些最好的工具/策略是什么?...
  15. 鑫迪自助建站系统1.1版网站源码完整源码
  16. Beaglebone Black– 智能家居控制系统 LAS - 网页服务器 Node.js 、Web Service、页面 和 TCP 请求转 UDP 发送...
  17. 如何将class文件转换成java文件
  18. T-SQL - 习题02_将数据表year|month|amount查询成year|m1|m2|m3|m4的样式
  19. 【GZH逸佳君】:科技感膨爆,观赏性极强:送你PS粒子飞溅特效插件,1秒瞬间爆开
  20. DataBinding详解

热门文章

  1. Fedora 8安装非官方compiz-fusion
  2. (57)FPGA面试题-我们是否应该在敏感列表中包含组合电路的所有输入?
  3. parameter与localparam使用区别
  4. System verilog随机系统函数$urandom_range使用方法
  5. Vivado 2019.1 生成bit文件报错解决
  6. mysql percona 密码设置_Percona mysql5.7 默认密码
  7. 使用J-flash arm下载程序
  8. mapreduce分组统计_mongodb中使用mapreduce进行分组统计
  9. 【STM32】【STM32CubeMX】STM32CubeMX的使用之八:低功耗模式及MCU唤醒
  10. HDVPSS模块介绍及使用