Language agnostic 最奇怪的语言特征

Language agnostic 最奇怪的语言特征,language-agnostic,programming-languages,Language Agnostic,Programming Languages,在你看来,你遇到过的最令人惊讶、最怪异、最奇怪或最“WTF”的语言特性是什么 请每个答案只有一个功能。我对此有些挣扎: 1; 在Perl中,模块需要返回一些真的。C++中的< /P> < P>三元组。 intmain(){ printf(“LOL??); } 这将打印LOL |,因为trigraph被转换为|,数组的索引如下: a[10] 这是很常见的 然而,鲜为人知的形式(确实有效!)是: 这与上面的意思相同。Algol按名称传递(使用C语法说明): inta[3]={1,2,3}; i

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


请每个答案只有一个功能。

我对此有些挣扎:

1;

在Perl中,模块需要返回一些真的。C++中的< /P> < P>三元组。

intmain(){
printf(“LOL??);
}

这将打印
LOL |
,因为trigraph
被转换为
|

,数组的索引如下:

a[10]
这是很常见的

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

这与上面的意思相同。

Algol按名称传递(使用C语法说明):

inta[3]={1,2,3};
int i=1;
空f(int j)
{
int k;
k=j;//k=2
i=0;
k=j;//k=1(!?!)
}
int main()
{
f(a[i]);
}

PHP对字符串中数值的处理。有关详细信息,请参见,但简而言之:

"01a4" != "001a4"
如果有两个字符串包含不同数量的字符,则不能认为它们相等。前导零很重要,因为它们是字符串而不是数字

“01e4”=“001e4”
PHP不喜欢字符串。它正在寻找任何可以找到的借口,把你的价值观当作数字。稍微更改这些字符串中的十六进制字符,PHP突然决定这些不再是字符串,它们是科学记数法中的数字(PHP不在乎是否使用引号),它们是等效的,因为数字忽略前导零。为了强调这一点,您会发现PHP也会将
“01e4”==“10000”
计算为true,因为这些数字具有相等的值。这是记录在案的行为,只是不太明智。

可能是最奇怪的语言特性的最佳概要。我个人最喜欢的是(几乎)与GOTO相反的陈述

COMEFROM与COMEFROM大致相反 因为它可以执行死刑 代码中任意点的状态 从陈述中得出结论。重点 发生状态转移的代码 通常作为参数提供给 来自。是否发生转移 在现场指导之前或之后 指定的传输点取决于 使用的语言。取决于 使用的语言,多种来源 参考同一出发点 可能无效,不确定, 以某种定义的方式执行 优先权,甚至诱导平行或平行 否则并发执行,如图所示 在螺纹间。一个简单的例子 “COMEFROM x”语句的名称是一个标签 x(不需要是 物理上位于其附近的任何位置 相应的COMEFROM)充当 “活板门”。当代码执行时 到达标签时,控件被传递 对以下声明: 来自。其效果是 主要是进行调试(和 了解系统的控制流程 程序)非常困难,因为 标签附近没有指示 该控件将神秘地跳转到 节目的另一点


我想说Python的整个空白部分是我最大的WTF特性。诚然,过了一段时间,你或多或少会习惯它,现代的编辑器使它变得容易处理,但即使在过去一年中大部分时间都是全职python开发之后,我仍然相信这是一个坏主意。我已经阅读了所有背后的理由,但老实说,这妨碍了我的工作效率。虽然不多,但马鞍下还是有一个毛刺

编辑:根据评论判断,有些人似乎认为我不喜欢缩进代码。这是一个错误的评估。我总是缩进我的代码,不管是什么语言,也不管我是否被迫缩进。我不喜欢的是缩进定义了一行代码所在的块。我更喜欢显式分隔符。除其他原因外,我发现显式分隔符更容易剪切和粘贴代码

例如,如果我有一个缩进4个空格的块,并将其粘贴到缩进8个空格的块的末尾,我的编辑器(所有编辑器?)不知道粘贴的代码是属于8个空格的块还是外部块。OTOH,如果我有显式分隔符,那么很明显代码属于哪个块以及应该如何(重新)缩进——它通过智能地查找块分隔符来实现

编辑2:一些提供评论的人似乎认为这是我讨厌的特性,或者我认为这使python成为一种糟糕的语言。再说一次,不是真的。虽然我不太喜欢这一切,但这不是重点。问题是关于最奇怪的语言特性,我认为这很奇怪,因为它是非常少(但>0)种语言使用的东西。

在JavaScript中:

 '5' + 3 gives '53'
鉴于

 '5' - 3 gives 2

不知道它是否可以被认为是语言特征,但是,在C++中,几乎所有与模板相关的编译器错误都会给世界上许多C++程序员提供相当数量的WTF:(

< P>)不是一个语言特征,而是一个实现缺陷:一些早期FORTRAN编译器通过使用常量池来实现常量。所有参数均通过引用传递。如果你调用了一个函数,例如

f(1)
编译器会将常量池中常量1的地址传递给函数。
如果为函数中的参数指定了一个值,则会在程序中全局更改该值(在本例中为值1)。引起了一些挠头。

对于那些不知道的人来说,
bc
是一种“任意精度计算器语言”,我经常使用它进行快速计算,特别是当涉及的数字很大时(
$
是提示):

bc
长期以来一直是一个问题

现在进入“WTF功能”。这是来自曼恩bc(我的重点):

quit:当读取quit语句时,bc进程
f(1)
$ bc -lq
12^345
20774466823273785598434446955827049735727869127052322369317059031795\
19704325276892191015329301807037794598378537132233994613616420526484\
93077727371807711237016056649272805971389591721704273857856298577322\
13812114239610682963085721433938547031679267799296826048444696211521\
30457090778409728703018428147734622401526422774317612081074841839507\
864189781700150115308454681772032
>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False
print "Hello World!"
IF IF THEN THEN = ELSE ELSE ELSE = THEN
IF IF THEN THEN ELSE ELSE
# BLOAT {bloatsize}