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

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


当前回答

这不是一个奇怪的功能,事实上,如果你仔细想想,它是完全有意义的,但还是给了我一个WTF时刻。

在c++(和c#)中,基类的子类不能访问基实例上的私有和受保护成员。

class Base {
protected:
 m_fooBar;
};

class Derived: public Base {
public:
 void Test(Base& baseInstance) {
  m_fooBar=1; //OK
  baseInstance.m_fooBar = 1; //Badness
  //This, however is OK:
  ((Derived&)baseInstance).m_fooBar = 1; //OK
 }
};

其他回答

在c#中

Math.Round(2.5)==2

PHP的列表构造:

$array = array(0,1,2);
list (,,$x) = $array;
$x == 2; // true

在C语言中,数组可以像这样被索引:

a[10]

这很常见。

然而,鲜为人知的形式(真正有效!)是:

10[a]

这与上面的意思相同。

下面这个我觉得很奇怪:

在C/ c++中,你可以有尽可能多的分号,至少在MS c++中:

int main(void)
{
 cout<<"Hello World";;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;;;;
 return 0;;;;;;;;;;;;;;;;;;;;;;;
}

好吧,这也是我最喜欢的很难找到的虫子…将以0开头的整数视为八进制数。这导致了一个只会在早上8点到10点之间显示的错误:

有一次,我帮助构建了一个自动回归测试,在晚上通过cron执行。在一个20人的团队中,它几乎适用于每个人——除了一个开发人员偶尔会抱怨自动测试失败,但当手动运行时,一切都很好。这甚至一次都无法人工复制。

好吧,原因是,我们根据date命令的输出进行了一些统计计算(在bash中),这只在早上8:00到9:59期间失败,因为我们将小时值读取为“08”(这是一个非法的八进制值,而“01”-“07”是有效的八进制值,从“10”开始,所有内容都被再次视为十进制)……