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

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


当前回答

在Python中,至少对我来说,这是非常wft的!我第一次看的时候:

>>> "ja " * 5
'ja ja ja ja ja '

你可以将字符串相乘!WTF ? ?

PS:我认为这是因为x * n意味着:n乘以x,所以,5次“ja”是“ja”“ja”“ja”“ja”“ja”“ja”,因为你可以像这样连接字符串:

>>> "ja ""ja ""ja ""ja ""ja "
'ja ja ja ja ja '

两个代码有相同的结果(可能是相同的)

其他回答

腓backticks

从http://www.php.net/manual/en/language.operators.execution.php

PHP支持一种执行操作符:反撇号(' ')。注意,这些不是单引号!PHP将尝试作为shell命令执行反勾号的内容;输出将被返回(即,它不会简单地转储到输出;它可以赋值给一个变量)。

$output = `ls -al`;
echo "<pre>$output</pre>";

在代码中发现“instead of”是“相当容易的”。

这也很有趣:

经过一番折腾,我得出结论,反勾运算符(和shell_exec)的返回缓冲区有限。我的问题是,我正在处理一个超过50万行的文件,收到的回复远远超过10万行。短暂的停顿之后,我收到了大量来自grep的关于管道关闭的错误。

我不敢相信这里还没有这个:JSF属性访问。

在JSF UI标签中,你可以将服务器端对象的属性值引用到接口中:

<h:inputText value="#{myObject.property}></h:inputText>

问题是Java不支持属性,所以你必须编写以get和set开头的方法,以便将UI对象链接到服务器上的“属性”。

public void setProperty(String property){...}
public String getProperty(){...}

当我第一次学习JSF时,这让我感到困惑,我仍然认为它值得使用wtf。尽管在Java实现对c#风格属性的支持之前,确实没有其他方法可以做到这一点。

在我看来,这在c++中是不允许的:

class A {
public:
  virtual string foo(){return "A::foo";}
};

class B : public A {
public:
  virtual string foo(){return "B::foo";}
};

int main () {
  B* b = new B();
  // In my opinion the following should not be allowed
  cout << b->A::foo() << endl;  // Will print "A::foo"
}

这似乎是正确的,但这意味着如果不允许子类的用户调用原始方法而不是新方法,就不能重写方法。

只要考虑一个集合的子类,当向集合本身添加一个元素时,您希望增加元素的数量。

一个合乎逻辑的解决方案是重写add()方法,在添加元素之前增加计数器,但是新集合的用户可以使用旧方法向其添加元素,这样就绕过了增量,导致元素计数器与集合的实际元素数量不一致。

这在Java中是不可能的。

在Javascript中,我认为以下是等价的:

a['title'] = "Syntactic sugar is good for yr teeth.";
a.title = "Syntactic sugar is good for yr teeth.";

在C语言中,sizeof操作符不计算其实参。这允许编写看起来错误但实际上是正确的代码。例如,给定类型T,调用malloc()的惯用方法是:

#include <stdlib.h>

T *data = NULL;
data = malloc(sizeof *data);

这里,*data在sizeof操作符中不被求值(data是NULL,所以如果它被求值,就会发生糟糕的事情!)。

这使得人们能够编写令人惊讶的代码,无论如何,对于新手来说。请注意,没有哪个头脑正常的人会这么做:

#include <stdio.h>

int main()
{   
    int x = 1;
    size_t sz = sizeof(x++);
    printf("%d\n", x);
    return 0;
}   

输出1,而不是2,因为x永远不会增加。

对于sizeof的一些真正的乐趣/困惑:

#include <stdio.h>
int main(void)
{
    char a[] = "Hello";
    size_t s1 = sizeof a;
    size_t s2 = sizeof ("Hi", a);
    printf("%zu %zu\n", s1, s2);
    return 0;
}

(只有当人们对数组、指针和操作符感到困惑时才会出现这种困惑。)