在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么?

请每个回答只回答一个特征。


当前回答

在PHP中,字符串字母不能像在C中那样使用,你需要使用ord()和chr()来将数字转换为字符,反之亦然:"a" != 97,但ord("a") == 97。

不过,有一个例外:

for ($i = 'a'; $i < 'z'; $i++) {
    print "$i ";
}

将打印字母a到y,就像你所期望的,就像它是C风格的数据类型一样。

但是,如果将测试条件更改为<=,它将不会像您想象的那样输出a到z,而是输出a到yz!(共打印676项)

同样,如果您将676项列表中“z”后面的“z”更改为“aa”,并再次将测试条件更改为<,您将只看到“a”被打印出来!不是像你想的那样从a到z。

如果你将增量变量改为$i+=2,它将再次只打印“a”!唯一的方法是按顺序使用$i++, $i++,现在它像预期的那样工作。

尽管如此,这是PHP中输出字母a-z组合的好方法,尽管实际使用起来非常困难。

其他回答

ActionScript 3:

当一个对象被它的接口使用时,编译器不识别从object继承的方法,因此:

IInterface interface = getInterface();
interface.toString();

给出一个编译错误。 解决方法是将类型转换为Object

Object(interface).toString();

PHP:

. 和+运算符。它有其合理的解释,但“a”+“5”= 5仍然显得尴尬。

Java(以及任何IEEE754的实现):

System.out.println(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1);

输出0.9999999999999999

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

资料来源:Doug Crockford

在Java中从文本文件中读取一行。

BufferedReader in = null;
try {
   in = new BufferedReader(new FileReader("filename"));
   String str;
   str = in.readLine();
   if (str != null) {
      ...
   } 
} catch (IOException e) {
   ...
} finally {
   try {
      if (in != null) {
         in.close();
      }
   } catch (IOException e) {}
}

啊。虽然我承认这并不奇怪……只是邪恶。: -)

更短、更习惯的版本:

try {
   BufferedReader in = new BufferedReader(new FileReader("filename"));
   try {
       String str = in.readLine();
       while (str != null) {
          str = in.readLine();
       } 
    } finally {
        in.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}

c++模板机制是图灵完备的:只要在运行时不需要输入,就可以在编译时进行任意计算。任意的。或者你可以很容易地编写一个永远不会编译的c++程序——但是语法是正确的。

在JavaScript中,void不是关键字,不是类型声明,也不是变量名,也不是函数,也不是对象。Void是一个前缀操作符,类似于-、——、++和!你可以给任何表达式加上前缀,这个表达式的值将是undefined。

它经常被用在bookmarklet和内联事件处理程序中,比如下面这个比较常见的例子:

<a href="javascript:void(0)">do nothing</a>

在这个例子中使用它的方式使它看起来像一个函数调用,而实际上它只是一种获得原始未定义值的过于聪明的方法。大多数人并没有真正理解JavaScript中void的真正本质,这可能会导致许多讨厌的bug和奇怪的意想不到的事情发生。

不幸的是,我认为void操作符是在JavaScript中获得未定义值的唯一真正保证的方法,因为未定义,正如在另一个回答中指出的,是一个可以重新赋值的变量名,而{}。a可以被Object.prototype.a = 'foo'打乱

更新:我想到了另一种生成undefined的方法:

(function(){}())

嗯,有点啰嗦,返回“undefined”是它的目的就更不清楚了。