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

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


当前回答

Tcl中的连接是将两个字符串添加为一个字符串:

set s1 "prime"
set s2 "number"
set s3 $s1$s2
puts s3

输出为

primenumber

其他回答

在ColdFusion

Struct(又名Java HashMap)是通过引用传递的。

你可能认为其他数据类型的行为就像Java…

数组是按值传递的,wtf!

List只是一个普通的逗号分隔的字符串!

Common Lisp的format函数有一个选项,可以将数字打印为罗马数字。

在INTERCAL中,这是你能得到的唯一输出形式。

在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;
}

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

作为一名NHibernate爱好者,当我从Smalltalk听到be时,我非常激动……如。

a become: b

它直接将a对象更改为b,这使得编写惰性初始化代理变得很简单,因为所有对a的引用现在都将引用b。非常简洁!

我认为这是一种奇怪的语言特征,因为据我所知,没有其他语言具有这种能力。

不知道它是否可以被认为是一种语言特性,但是,在c++中,几乎任何与模板相关的编译器错误都会每天向世界各地的许多c++程序员交付相当数量的WTF:)