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

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


当前回答

在c++

const char* wtf()
{
    char buf[100];
    return buf;
}
string s = ... + wtf() + ...;

在s中创建有趣的值。部分是字符串,部分是堆栈内容,与零混合,因此s.length()!=strlen(s.c_str())。 最奇怪的是,编译器在返回指向堆栈的指针时完全没有问题——如果他在那里添加了一个警告,编译器程序员的手可能会掉下来。

其他回答

2000年Perl Journal's obfusated Perl Contest的最佳参赛作品:

#:: ::-| ::-| .-. :||-:: 0-| .-| ::||-| .:|-. :||
open(Q,$0);while(<Q>){if(/^#(.*)$/){for(split('-',$1)){$q=0;for(split){s/\|
/:.:/xg;s/:/../g;$Q=$_?length:$_;$q+=$q?$Q:$Q*20;}print chr($q);}}}print"\n";
#.: ::||-| .||-| :|||-| ::||-| ||-:: :|||-| .:|

代码由作者在http://mysite.verizon.net/les.peters/id2.html详细解释

任何东西都会自动将任何类名和成员名复数或单数。

例如,Linq-to-Sql

交替:在许多语言中的事物之间交替:

boolean b = true;
for(int i = 0; i < 10; i++)
  if(b = !b)
    print i;

乍一看,b怎么可能不等于它自己呢? 这实际上只会打印奇数

Java泛型 都是WTF:

List<String> ls = new ArrayList<String>(); //1
List<Object> lo = ls; //2

2:是非法的(??)这是令人费解的,但你必须想想接下来会发生什么:

lo.add(new Object());
String s = ls.get(0);

我们将对象赋值给字符串引用,哦不!就像这样,他们周围有很多陷阱。

Javascript中有很多东西会让你流泪。

局部变量的作用域,举个简单的例子:

function foo(obj)
{
  for (var n = 0; n < 10; n++)
  {
    var t;        // Here is a 't'
    ...
  }
  t = "okay";     // And here's the same 't'
}