`
goodscript
  • 浏览: 73050 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

最奇特的编程语言特征

 
阅读更多
本文引自 外刊IT评论网

目前为止,据我个人观察,从语法角度上讲,最被人诟病的一种语言应该是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;
    }


如果你觉得还没看够,请到这里,还有更多。
分享到:
评论

相关推荐

    关于编程语言时间的知识1

    编程语言时间知识点总览 编程语言中日期类型的内部存储是通过数字来实现的,这点非常重要。日期类型的加减实际上是数字的加减。多数编程语言的日期开始时间是 1970-01-01 00:00:00,这是因为 UNIX 系统的时间纪元是...

    C/C++语言经典实用趣味程序设计编程百例精解

    C/C++语言经典实用趣味程序设计编程百例精解 <br>C/C++语言经典实用趣味程序设计编程百例精解(1) <br>1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数...

    关于 JavaScript 语言最奇怪部分的文档集合 .zip

    关于 JavaScript 语言最奇怪部分的文档集合。JavaScript 花园2024 年更新该项目多年来一直没有得到积极维护。原作者 于 2022 年关闭了该网站 (不作评判 - 更新它将是一个大项目!)。那时它已经过时很久了,例如...

    搞怪语言——Starry语言简介

    在IT行业中,编程语言是构建软件和应用程序的基础,而“搞怪语言”Starry则是一种非主流、趣味性十足的编程语言。本文将深入探讨Starry语言,了解其特点、语法以及如何通过源码和工具进行解析。 首先,让我们理解...

    JavaScript_一个脚本的集合,描述了编程语言的奇怪特性.zip

    JavaScript,一种广泛应用于Web开发的轻量级解释型编程语言,是互联网上最流行的脚本语言之一。它的设计目标是使动态网页变得简单易用,它允许开发者在HTML页面中嵌入可执行代码,实现与用户的实时交互。JavaScript...

    汇编语言程序设计全部实验报告.zip

    汇编语言实验八分析一个奇怪的程序 汇编语言实验九根据材料编写程序 汇编语言实验十编写子程序(显示字符串) 汇编语言实验十一编写子程序 汇编语言实验十二编写0号中断处理程序 汇编语言实验十三编写安装7ch中断...

    随便做的奇怪的东西-少儿编程scratch项目源代码文件案例素材.zip

    Scratch是由麻省理工学院(MIT)的媒体实验室 Lifelong Kindergarten Group 开发的一款面向儿童的图形化编程语言。它的界面友好,通过拖拽积木式的编程块,孩子们可以轻松地构建程序,理解编程的基本概念。在“随便做...

    PERL编程24学时教程.pdf

    3.4.1 奇特的执行顺序 33 3.4.2 明细控制 34 3.4.3 标号 35 3.4.4 退出Perl 35 3.5 练习:查找质数 35 3.6 课时小结 37 3.7 课外作业 37 3.7.1 专家答疑 37 3.7.2 思考题 37 3.7.3 解答 38 3.7.4 实习 38 第4学时 ...

    C-C++语言趣味程序设计编程百例精解

    C/C++语言经典实用趣味程序设计编程百例精解(1) (详解收藏在)http://www.klfd.net.cn/?p=384 <br>1.绘制余弦曲线 2.绘制余弦曲线和直线 3.绘制圆 4.歌星大奖赛 5.求最大数 6.高次方数的尾数...

    我的编程感悟(中文PDF)(共37M二分卷)分卷二

    第3章 编程语言 45 3.1 C 语言 46 3.2 BASIC 50 3.3 C++ 51 3.4 汇编语言 54 3.4.1 概述 55 3.4.2 程序的本质 57 3.4.3 寄存器 58 3.4.4 寻址方式 60 3.4.5 汇编指令 61 3.4.6 C/C++ 语言和汇编 62 3.4.7 小结 63 ...

    nico-lang:Nico-lang是Nico Yazawa的编程语言

    《Nico-lang:Nico Yazawa的编程语言探索》 Nico-lang,一款以动漫人物Nico Yazawa命名的编程语言,它不仅承载了开发者对编程的热爱,更融合了二次元文化的魅力。Nico-lang的出现,为编程世界带来了独特的趣味性,...

    trophy-lang:面向未来的快速,类型安全,内存安全的系统编程语言

    奖杯编程语言这是Trophy编程语言的主要存储库,这是我尝试创建现代系统编程语言的尝试。 Trophy很大程度上仍在开发中,但是已经实现了足够多的内容,以传达我的见解并证明Trophy为什么会是对当前语言的一种改进。 ...

    C ++多线程编程实战姜佑译.rar

    C++作为一门强大且灵活的编程语言,其在多线程编程方面的支持为开发人员提供了丰富的工具和机制。 并发编程是现代计算机系统中的核心概念,它允许程序同时执行多个任务,提高资源利用率和程序性能。C++11及其后续...

    windows核心编程-73.zip

    通过丰富的实例和代码,作者详细讲解了如何利用C++语言进行Windows编程。 在Visual Studio 2010环境下进行Windows编程,开发者可以充分利用其强大的集成开发环境(IDE)和调试工具。VS2010支持C++标准库,以及对...

    i-use-arch-btw:“我使用Arch btw”,但这是一种图灵完整的编程语言

    因此,尽管"Arch btw"是一种相对少见且可能设计得相当奇特的编程语言,但它仍然拥有足够的计算能力。 标签中提到了"C language library",这可能暗示"Arch btw"支持C语言库,或者其语法、结构与C语言有所关联。...

    Lisp语言入门.pdf

    作为一种历史悠久的编程语言,Lisp由John McCarthy于1958年开始设计,并逐渐发展成为一种极具影响力的编程语言。尽管Lisp在语法上看起来与其他现代语言大相径庭,尤其是其独特的括号使用方式,但它至今仍然活跃在...

    Go语言编写一个简单的文本生成器,生成随机的"奇怪句子"

    这个案例展示了如何使用Go语言编写一个简单的文本生成器,生成随机的"奇怪...它适合那些想要学习Go语言基础知识并通过实际编程练习来提升技能的人群。你可以根据自己的喜好扩展词汇列表,以生成更多有趣的奇怪句子。

    Go编程语言SQLite驱动程序-Golang开发

    go-sqlite-lite go-sqlite-lite是用于Go编程语言SQLite驱动程序。 在设计时要牢记以下目标。 轻量级-大多数方法应该只是围绕SQLite C的一个小的包装。go-sqlite-lite go-sqlite-lite是用于Go编程语言SQLite驱动程序...

Global site tag (gtag.js) - Google Analytics