最奇特的编程语言特征

       目前为止,据我个人观察,从语法角度上讲,最让人困惑和难以理解的一种语言应该是LISP语言了。打开这种语言的代码,一眼望去,满目全是括弧,一层套一层。 这种语言特征最大的问题是,它不符合人们通常的思维习惯。LISP语言的这个特点是个整体的语言现象,而任何一种语言其实也都有一些个别的很奇特的东西, 其中有些会奇怪的让你摸不着头脑。有一个好事者在一个帖子上征集各种语言里不合常理的地方,结果收集到了320多条,问题最大最多的语言算是Javascript了,另外还有C,Java,Python,PHP等等。下面列出的是其中最有趣的几条。
1. 在C语言里,数组可以这样索引取值:
a[10]
这种写法相当常见。
然而,还有一种很少见的写法(绝对可用!)是这样的:
 10[a] 
解释:that's because a[10] means *(a+10) ... and 10[a] means *(10+a)
2.这两种写法的效果是一样的。
在JavaScript里:
 '5' + 3 结果是 '53' 


 '5' - 3 结果是 2 
解释:在ECMASCRIPT规范里定义了字符串的加法,但没有字符串减法。11.6.1里有7. If Type(lprim) is String or Type(rprim) is String, then a. Return the String that is the result of concatenating ToString(lprim) followed by ToString(rprim)
3.在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;
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
5.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。(那如何设置呢?答案是在JVM的启动参数上设置).自动打包(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.在一些没有保留字、关键字的语言里,例如PL/I, 你可以写出这样有趣而且合法的代码语句:
    IF IF THEN THEN = ELSE ELSE ELSE = THEN
    (IF, THEN, ELSE 都是变量名),或
    IF IF THEN THEN ELSE ELSE
    (IF 是变量,THEN 和 ELSE 都是函数)
9.JavaScript里八进制的转换:

    parseInt('06') // 6
    parseInt('07') // 7
    parseInt('08') // 0
    parseInt('09') // 0
    parseInt('10') // 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);
        }
    }

11.在Python中:
>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

12.在Java中:
    int[] numbers() {
      return null;
    }
    可以被写成:
    int numbers() [] {
      return null;
    }
13.javascript里的“伪泛型”。
    <script>
    var Model,list,keys,values;
    function List(){};

    List<Model> list;
    list = new List<Model>[];
    list = new List<keys, values>[];
    list = new List();

    document.write(list instanceof List);
    </script>
最早的中文翻译来自OSCHINA.NET,但是错误太多。另外,关于JAVA里面的一些困惑,可以参见《java解惑》一书。javascript的各种小陷阱就不说了。如果你觉得还没看够,请到这里,还有更多。http://stackoverflow.com/questions/1995113/strangest-language-feature
白菜的弟弟的同学的老师的儿子的妈妈养的小狗的表弟的主人的朋友说看帖不回会被鄙视de

添加新评论 »

【已知曲线:y3+5y-6x+2x2-26=0,求点x=4处的斜率】