最奇怪的语言功能


974

您认为您遇到的最令人惊讶,奇怪,奇怪或真正的“ WTF”语言功能是什么?

每个答案只能使用一项功能。


5
@gablin我认为,如果您使用JavaScript解析将LISP分隔符与PERL正则表达式结合使用,则将覆盖90%的WTF ...
Talvi Watia 2010年

Answers:


1859

在C中,可以像这样对数组建立索引:

a[10]

这很常见。

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

10[a]

与上述相同。


758
那是因为a [10]表示*(a + 10)...,而10 [a]表示*(10 + a):)
Michel Gokan 2010年

77
不要忘记“ Hello World” [i]。或i [“ Hello World”]
理查德·彭宁顿

167
或者,更有用的是“ 0123456789abcdef” [x&0xf]
油尺2010年

17
@frunsi:它总是按预期工作。指针加法与地址上的简单整数加法不同。无论所讨论的类型是什么大小,它都是可交换的。
R. Martinho Fernandes

12
@mcv-a [10]与“ *(a + 10)”相同,其中表达式“ a + 10”是指针算术(并且由于a是缩写,因此在您的示例中,a + 10表示'起始于a的地址,并移动10个短裤,即20个字节)。表达式10 [a]解释为“ *(10 + a)”,其中“ 10 + a” 也是指针算术,并且以完全相同的方式处理。
Edan Maor 2010年

1292

在JavaScript中:

 '5' + 3 gives '53'

鉴于

 '5' - 3 gives 2

81
我记得当我第一次开始使用Javascript使用这种技术在字符串中加数字时:“ 111”--“ 222”给出333,而“ 111” +“ 222”给出“ 111222”。
卡勒姆·罗杰斯

112
+字符串连接的方法太可怕了
Matteo Riva 2010年

416
+ concat并不是问题。打字很弱。
FogleBird 2010年

270
@FogleBird都不是问题所在。这只是两者与强制规则不一致的结合
TM。

70
因此,基本上,当涉及字符串时,+是concat。他们为什么不能编码类似'123456'-456 ='123'的代码?那会很有趣。
Jimmie Lin 2010年

872

在JavaScript中,以下结构

return
{
    id : 1234,
    title : 'Tony the Pony'
};

返回undefined是一个语法错误由于对之后的换行符偷偷摸摸隐分号插入return。尽管您可以期望以下工作:

return {
    id : 1234,
    title : 'Tony the Pony'
};

更糟糕的是,这个程序也很好(至少在Chrome中):

return /*
*/{
    id : 1234,
    title : 'Tony the Pony'
};

这是同一问题的变体,不会产生语法错误,只是默默地失败:

return
    2 + 2;

225
分号插入是JavaScript最邪恶的部分之一。

230
在设计语言功能时,您总是会遇到这样的问题,即假设用户大多是白痴。
罗布·范丹

8
我实际上遇到了这个问题,我自己是c#开发人员,所以我把括号放在了新的一行。花了我几个小时才意识到问题出在哪里。即使我解决了问题,但直到我读完您的答案,我才知道问题出在哪里!
Fedor Hajdu 2010年

24
Nick Retallack:因为JavaScript类似于C的花括号和分号语法,所以换行符并不是很明显。
Tamas Czinege 2010年

19
如果在使用JavaScript编程时不应该使用C风格,那么选择C风格的语法对于JavaScript语言设计者来说是很不正确的。
瑞安·伦迪

795

JavaScript真值表:

''        ==   '0'           // false
0         ==   ''            // true
0         ==   '0'           // true
false     ==   'false'       // false
false     ==   '0'           // true
false     ==   undefined     // false
false     ==   null          // false
null      ==   undefined     // true
" \t\r\n" ==   0             // true

资料来源:道格·克罗克福德


237
那么,Javascript具有===运算符。
匿名

65
那么==在语言设计者眼中,有什么目的呢?
克里斯·S

137
让人困惑。
哈维尔2010年

123
如果==具有的含义===,那就太好了,然后还有另一个运算符,类似于~=允许类型强制的操作。
TM。

18
@Otto实际上,由于我们很讨厌,他的示例表明==不对称。目前,我还没有看到如何为二元关系指定可交换性。
PeterAllenWebb 2010年

660

C和C ++中的三字母组合。

int main() {
   printf("LOL??!");
}

这将打印LOL|,因为三部曲??!被转换为|


71
快!告诉所有C / b /程序员!
EstebanKüber'1

235
Trigraph令人惊叹,因为您可以确定没有人会-永远-找出??!将意味着来自Google,但尚不知道其名称。
zaratustra

56
在GCC中,默认情况下,三联字已禁用。
萨斯坦宁

360
这些使您可以使用“ WTF运算符”:(foo()!= ERROR)??!??!cerr <<“发生错误” << endl;
user168715 2010年

57
介绍三部曲是一种必不可少的邪恶。某些平台只是不包含某些特定于该语言的字符,因此它要么是“ trigraphs”,要么是“您不能使用C编译器的期末声明,因此请使用汇编器”。在“ C ++编程语言”中查看Stroustrup的描述。
Euro Micelli 2010年

573

自动装箱和Java中的整数缓存的乐趣:

Integer foo = 1000;
Integer bar = 1000;

foo <= bar; // true
foo >= bar; // true
foo == bar; // false

//However, if the values of foo and bar are between 127 and -128 (inclusive)
//the behaviour changes:

Integer foo = 42;
Integer bar = 42;

foo <= bar; // true
foo >= bar; // true
foo == bar; // true

说明

快速浏览一下Java源代码将发现以下内容:

/**
 * Returns a <tt>Integer</tt> instance representing the specified
 * <tt>int</tt> value.
 * If a new <tt>Integer</tt> instance is not required, this method
 * should generally be used in preference to the constructor
 * {@link #Integer(int)}, as this method is likely to yield
 * significantly better space and time performance by caching
 * frequently requested values.
 *
 * @param  i an <code>int</code> value.
 * @return a <tt>Integer</tt> instance representing <tt>i</tt>.
 * @since  1.5
 */
public static Integer valueOf(int i) {
    if (i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

注意: IntegerCache.high默认为127除非由属性设置。

自动装箱操作的结果是,除非明确创建foo = new Integer(42),否则foo和bar都是从缓存中检索到的同一整数对象:例如,因此,在比较引用相等性时,它们将为true而不是false。比较整数值的正确方法是使用.equals;


31
花了我几秒钟的时间来了解原因... Java必须为-128到128之间的值保留一个Integer实例池,否则它将分配一个新的Integer,对吗?
Mike Akers 2010年

18
但是请记住,如果您指定新的Integer(42),它将不会使用池中的实例,因此foo == bar的值将为false
z-2010年

10
如果可能的话,我总是使用ints而不是Integers,但是如果出于某种原因不得不使用Integers,我应该只使用.equals()而不是==吗?
MatrixFrog 2010年

246
很高兴我是C#程序员。

87
@Will:C#有一些非常相似的陷阱。参见blogs.msdn.com/jmstall/archive/2005/03/06/386064.aspx
spookylukey 2010年

373

引用尼尔·弗雷泽Neil Fraser)(请参阅该页面的结尾),

try {
    return true;
} finally {
    return false;
}

(在Java中,但行为在JavaScript和Python中显然是相同的)。结果留给读者练习。

编辑:只要我们在这个主题上也考虑以下:

try {
    throw new AssertionError();
} finally {
    return false;
}

42
+1。由于某种原因,我觉得这很有趣,不能停止咯咯笑。
2010年

153
幸运的是,C#不允许这种疯狂……Control cannot leave the body of a finally clause
理查德·埃夫

64
这返回错误,是吗?它看起来像是WTF(可能是一个WTF),但我遵循的规则是:除非您之前使机器崩溃,否则总会获胜。
Michael Stum

28
公平地讲,我将TDWTF的出色解释归咎于记住除非您不拉电源线,否则总会赢:thedailywtf.com/Articles/My-Tales.aspx
Michael Stum

22
我不确定在这种情况下应该返回什么代码。但是,我绝对确定您一定不要return加入finally条款。
jfs 2010年

325

APL(不是全部),仅需一行即可编写任何程序。

例如,Away中Conway的《人生游戏》

替代文字http://catpad.net/michael/APLLife.gif

如果该行不是WTF,那么什么都不是!

这是一个视频


19
我爱APL。啊,花一整个下午写半行代码的乐趣!使用键盘可以编程显示字母时,我要做的第一件事是再次使自己熟悉APL。
Daniel C. Sobral

24
看起来像希腊人的语言。
Esko 2010年

45
@Erik:编写代码纯粹是您想要的东西,而不是如何到达那里,这是令人高兴的。将代码表示为单个表达式。就像最终的完美武士刀切割一样。当然,在真正的战斗中,我宁愿拥有枪支。
Daniel C. Sobral

7
@Daniel:您花了整个下午来编写一行代码……并花了整整一周时间来阅读一行代码。;-)
于尔根A.艾哈德

93
在科幻动作片中看到APL真是太棒了。我可以想象有人坐在一个三色终端喃喃自语:“重塑敌人的导弹向量……移置……圆周率乘以对数……提升并执行!” 其次是爆炸和欢呼。
乔伊·亚当斯

321

可以使用C ++模板的怪异事物,“多维模拟文字”(Multi-Dimensional Analog Literals)最好地证明了这一点,该多维多维文字使用模板来计算“绘制”形状的面积。以下代码对于3x3矩形有效的C ++

#include"analogliterals.hpp"
using namespace analog_literals::symbols;

          unsigned int c = ( o-----o
                             |     !
                             !     !
                             !     !
                             o-----o ).area;

或者,另一个使用3D立方体的示例:

  assert( ( o-------------o
            |L             \
            | L             \
            |  L             \
            |   o-------------o
            |   !             !
            !   !             !
            o   |             !
             L  |             !
              L |             !
               L|             !
                o-------------o ).volume == ( o-------------o
                                              |             !
                                              !             !
                                              !             !
                                              o-------------o ).area * int(I-------------I) );

18
虽然Eelis的模拟文字很棒,但它们是一种奇怪的语言功能,还是仅仅是一种使用功能的奇怪方式?

85
真正的WTF将是由格式错误的代码之一生成的编译器错误。
Andrew McGregor 2010年

6
那是多么恶心..当有支持在Eclipse中绕X,Y和Z轴旋转文字的AnalogLiterals版本时,再次唤醒我...现在这将赋予“可视化编程”新的真实含义。
TheBlastOne

2
o和L和|的顺序是否重要?
Ming-Tang

4
顺序很重要,因为模板创造性地利用了运算符重载。(不要对真实的代码执行此操作,滥用运算符会使代码难以阅读)
josefx 2011年

292

Perl的许多内置变量:

  • $#- 没有评论!
  • $0$$$?-就像具有相同名称的shell变量一样
  • $&$'-奇怪的匹配变量
  • $"$,—列表和输出字段分隔符的怪异变量
  • $!-就像errno一个数字,但strerror(errno)作为一个字符串
  • $_- 隐形变量,总是习惯从来没见过
  • $#_ —最后一个子例程参数的索引号...也许
  • @_ —当前函数的(非)名称...也许
  • $@ —上一次提出的例外
  • %:: —符号表
  • $:$^$~$-,和$=-是与输出格式
  • $.$%—输入行号,输出页号
  • $/$\—输入和输出记录分隔符
  • $| —输出缓冲控制器
  • $[—将您的数组基数从0更改为1,将基于42 更改为:WHEEE!
  • $}-一点都没有,奇怪的是!
  • $<$>$($)-真实和有效的UID和GID
  • @ISA —当前包的直接超类的名称
  • $^T —脚本启动时间,以纪元秒为单位
  • $^O —当前的操作系统名称
  • $^V —这是Perl的哪个版本

这些来自更多的地方。在此处阅读完整列表。


83
$[变量是他们所有的最邪恶的。
布拉德·吉尔伯特

24
如果Perl 6是我可以编写的东西而不必perldoc perlvar每5秒钟检查一次,我将非常感激。(尽管我承认,有一半时间我在检查它时都在想:“我知道有一个特殊的变量可以为我做这件事,但我不记得是哪个...” = P)
Chris Lutz 2010年

17
问题use English;在于它会影响RegExp性能。我没有弥补。 perldoc.perl.org/English.html#PERFORMANCE
Dave Webb 2010年

13
@Dave:这不是问题,因为您链接的页面中有-no_match_vars选项。@布拉德:$ [太邪恶了。它背后的意图是邪恶的,是的,但是它甚至也不起作用!@Artem:来自perlvar“以数字,控制字符或标点符号开头的Perl标识符不受包声明的影响,并且始终被强制包含在包main中;它们也不受严格的'vars'错误约束。” 因此,这意味着即使在严格的条件下,@ $也可以无错误地创建并分配给它。啊!
rjh 2010年

4
@Brian:当官方文档本身指出在某些情况下Perl解释器试探性地猜测一个字符序列意味着什么时,您打算如何学习语法?例如/$foo[bar]/[bar]零件是数组的字符类还是下标@foo?Grep perldata给出了可怕的答案。
j_random_hacker 2010年

289

PHP对string中的数值的处理。有关完整的详细信息,请参见先前对其他问题的回答,但总之:

"01a4" != "001a4"

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

"01e4" == "001e4"

PHP不喜欢字符串。它正在寻找可以将您的价值观视为数字的借口。稍微更改那些字符串中的十六进制字符,然后PHP突然断定它们不再是字符串,它们是科学计数法中的数字(PHP不在乎您使用引号),并且它们是等效的,因为数字的前导零被忽略了。为了强调这一点,您会发现PHP也被评估"01e4" == "10000"为true,因为这些是具有相等值的数字。这是有记录的行为,只是不太明智。


56
只需使用===和!==。除非需要进行松散类型比较,否则无论如何都应使用。
Dykam'1

14
@Dykam,如果您单击指向完整答案的链接,您将看到我已经解决了===运算符的使用。
Dan Dyer 2010年

18
打字再次失败!
gillonba 2010年

43
我一直都知道PHP是一种罪过。直到现在,我还没有意识到这是不可原谅的罪过:D
托马斯·爱丁

2
他们应该让技术人员在任何编程书籍或教程中使用===。补充说明:在一个写得不好的PHP应用程序上,我能够提供解析为相同数字的任何内容作为我的密码。
Pepijn

282

让我们对所有试图取消保留字的语言(例如PL / I)进行投票。

您还可以在哪里合法地编写如下有趣的表达式:

IF IF THEN THEN = ELSE ELSE ELSE = THEN

IFTHENELSE是变量名)

要么

IF IF THEN THEN ELSE ELSE

IF是一个变量,THEN并且ELSE是子例程)


1
@quark:这是一个单独的答案!;)...(是的,您可以使用英语编程,只需将其作为.ppt部署到其他开发人员即可。;)
Macke 2010年

28
@RoadieRich一组水牛不是来自水牛城,而是非描述性的水牛城。
尔根A.艾哈德

18
詹姆斯曾经有过的约翰曾经有过对老师有更好的影响。
GameFreak 2010年

4
前几天,我在Ben and jerrys冰淇淋工厂的工厂外面看到一些标牌制作者。我批评了他们的工作,我告诉他们在ben和and和and和and jerrys之间没有足够的空间。
汤姆·古伦

9
也许将来的时间程序需要它。如果THEN = NOW && WHERE =在那时THEHEN = THEN ELSEWHERE
Kelly S. French

282

JavaScript八进制转换“功能”是一个很好的相关知识:

parseInt('06') // 6
parseInt('07') // 7
parseInt('08') // 0
parseInt('09') // 0
parseInt('10') // 10

更多细节在这里


60
陷入了一个错误,那就是除了8和9之外所有数字都有效!快要疯了!!!谢谢布莱恩!
法鲁兹

10
@Yada你不是八进制吗?十六进制为0x。
luiscubal

48
这就是为什么parseInt需要一个(可选)额外的参数:)的原因。
LiraNuna

10
前导0表示八进制数。因为图8是不是有效的八进制数字,结果必须为0。
devio

22
...和parseInt('010')-> 8只是让您感到困惑。
理查德·加兹登

213

Duff的C语言装置!

在C语言中,可以将do / while与switch语句交织。这是使用此方法的memcpy的示例:

void duff_memcpy( char* to, char* from, size_t count ) {
    size_t n = (count+7)/8;
    switch( count%8 ) {
    case 0: do{ *to++ = *from++;
    case 7:     *to++ = *from++;
    case 6:     *to++ = *from++;
    case 5:     *to++ = *from++;
    case 4:     *to++ = *from++;
    case 3:     *to++ = *from++;
    case 2:     *to++ = *from++;
    case 1:     *to++ = *from++;
            }while(--n>0);
    }
}

9
Duff的设备可能是switch语句默认没有中断的一个很好的原因;-)但是,我还没有看到隔行切换和循环的其他任何很好的用法-但是可能有一个。哦,等等,是的,还有另一个用途:协程和protothreads。
弗隆西(Frunsi)2010年

16
@frunsi:“ Duff的设备可能是switch语句默认不中断的一个很好的理由”-始终将常见情况设为默认情况。我不完全说这是常见的情况..
BlueRaja -丹尼Pflughoeft

6
如果您尝试将其作为汇编代码读取,则@mcv可能是最简单的,即while,结尾处的是(有条件的)JMP返回到do,这说明了为什么可以跳过do并仍然在循环中结束。
wds

14
请记住,与现代编译器的正常循环语句相比,Duff的设备通常会生成WORSE代码,因为现代编译器比手动编译器知道如何(更好)循环展开。
Billy ONeal,2010年

37
@frunsi:达夫本人发表了这样的声明:“这肯定在讨论中提供了一个论点,即默认情况下切换是否应该通过,但我不确定该论点是赞成还是反对。”
SF。

204

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

int a[3] = { 1, 2, 3 };
int i = 1;

void f(int j)
{
    int k;
    k = j;  // k = 2
    i = 0;
    k = j;  // k = 1 (!?!)    
}

int main()
{
    f(a[i]);
}

33
如果您考虑一下,它实际上具有某种扭曲的含义
RCIX 2010年

90
这是最终的“通过引用”。
Dykam'1

3
不过,这可能在Scala(def f(j : => int)
Dario 2010年

10
所以这是什么样的... template<typename T> struct by_name { virtual operator T&() = 0; }; void f(by_name<int> j) { ... } int main() { f(struct : by_name<int> { operator int&() { return a[i]; } }); }
西蒙·布坎

2
它实际上很简单:您生成一小段代码(通常称为“ thunk”,因此在上面是我的双关语),用于计算由表达式产生的地址,在这种情况下为&a [i]。指向此函数的指针传递给被调用的函数,然后每次访问参数时,该函数便使用该指针来计算当前地址。
理查德·彭宁顿

189

在Python中:

>>> x=5
>>> 1<x<10
True
>>> 1<x<3
False

不是WTF,而是有用的功能。


176
我希望其他所有语言都具有此功能
vava 2010年

32
与几乎所有酷的Python功能一样,Guido看起来像是ALGOL对酷的Lisp功能的语法进行了ALGOL化。:-)

4
Geoffrey,这是(10 > 5 > 1) != ((10 > 5) > 1)Python的功能。
萨斯坦宁

18
此外,它只评估一次,因此(funct_a(5)+5 > b > funct_a(5))仅调用funct_a(5)一次。这是一个很棒的功能!
Khelben

57
@Khelben:不,funct_a在该示例中将被调用两次。b > funct_a(5) > c与相对,在中它只会被调用一次b > funct_a(5) and funct_a(5) > c
Baffe Boyois 2010年

189

在Java中:

int[] numbers() {
  return null;
}

可以写成:

int numbers() [] {
  return null;
}

23
哇!我希望在设计该数组语法时能如虎添翼!
亚当·佩恩特

29
我讨厌这样说,但是WTF是C类型系统的一致扩展。如果允许C函数返回数组,那将是这样。更好的一个是违反一致性,以使其更具可读性。非常类似于“ const char * var”和“ char const * var”。
Gordon Wrigley 2010年

15
@Adam-当您考虑到变量声明类似地允许“ int stuff []”和“ int [] stuff”时,这实际上是有意义的。他们只是让相同的规则适用于方法声明。
Brandon Yarbrough 2010年

2
@lImbus:实际上,const T*并且T const*等效,它T* const是指针的常量。另外,我讨厌无字体。
西蒙·布坎

3
毕竟numbers()[2]是法律声明。
badp 2010年

184

INTERCAL可能是最奇怪的语言功能的最佳概括。我个人最喜欢的是COMEFROM语句,它几乎与GOTO相反。

COMEFROM与GOTO大致相反,它可以将执行状态从代码中的任意点转移到COMEFROM语句。代码中发生状态转移的点通常作为COMEFROM的参数给出。是否在指定的传输点在指令之前还是之后进行传输取决于所使用的语言。根据所使用的语言,引用同一个出发点的多个COMEFROM可能无效,不确定,以某种已定义的优先级执行,或者甚至导致并行执行或并行执行(如线程插入)所示。“ COMEFROM x”语句的一个简单示例是标签x(它不需要物理上位于其对应的COMEFROM附近的任何位置),它充当“活板门”。当代码执行到达标签时,控制权将传递到COMEFROM之后的语句。这样做的结果主要是使调试(和理解程序的控制流)极其困难,因为在标签附近没有迹象表明控制将神秘地跳到程序的另一点。


16
相当邪恶-将标签变成GOTO。听起来像是一种语言功能,黑客会乞求...
RCIX 2010年

114
好的,但是INTERCAL应该很有趣-这并不是一个令人惊讶的“陷阱”。如果您没有PLEASE足够频繁地使用修饰符,则INTERCAL编译器实际上可以拒绝编译该程序!
Groo 2010年

10
听起来像AOP :)
2010年

6
最让我惊讶的是,在“商业TI世界”中的系统需求分析中,COMEFROM实际上用于描述用例的文本文件中。(严重:一些分析家推迟了公司向OpenOffice而不是MS Office的迁移,因为前者无法正确链接链接中要求的粒度的“ comefrom”)
jsbueno 2010年

5
Groo:更糟。过于频繁地使用PLEASE,它会因为编译而拒绝编译程序(C-INTERCAL要求33%到66%的语句具有PLEASE修饰符)。
Vatine 2010年

160

并不是真正的语言功能,而是实现上的缺陷:一些早期的Fortran编译器通过使用常量池来实现常量。所有参数均通过引用传递。如果您调用了一个函数,例如

f(1)

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


124
哦 然后2+2 可以等于52当然,对于非常大的值!)。
Alok Singhal'1

12
嗯,什么是2的值会使“ 2 + 2” ==“ 5”?我不知道任何整数值2都能代表真。
亚伦

36
@earlz:我怀疑不管位模式如何,它最终都会作为整数值出现。另一方面,您可能会以这种方式将5设置为4(对于的较小值2+2也将相等)。55
David Thornley,2010年

18
对不起,Alok,但这是我们谈论的FORTRAN早期。那不是真的2 + 2 = 5; 那将是语法错误。真实的是2 + 2 .EQ. 5
David Thornley 2010年

3
在Haskell中,以下代码段的计算结果为5:“ let 2 + 2 = 5 in 2 + 2” :)
Tirpen 2010年

153

不知道它是否可以被视为一种语言功能,但是,在C ++中,几乎所有与模板有关的编译器错误都每天为世界各地的许多C ++程序员提供相当数量的WTF :)


15
没关系,大多数与模板相关的代码已经在世界范围内创建了许多WTF。
Joris Timmermans 2010年

43
哦,现在来。未定义引用`std :: basic_ostream <char,std :: char_traits <char>>&std :: operator << <std :: char_traits <char>>(std :: basic_ostream <char,std :: char_traits <char> >&,char const *)'完全可读!
马特·格里尔

10
我曾经有一个与模板相关的编译器错误,该错误为五行,最短​​为一万七千个字符(在深度模板化的程序中,经典的“ x不匹配”错误)。那就是WTF,而不是首先的功能,模板很棒。
安德鲁·麦格雷戈

111
即使没有错误,也请尝试使用分析器找出使用时间最长的功能。哦,看,是std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::vector< std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator>(std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::vector<std::pair<int, std::complex>, std::allocator<std::pair<int, std::complex> > >::iterator, std::allocator<std::pair<int, std::complex> >)
rlbond 2010年

12
我认为这很适合:在bdsoft.com/tools/stlfilt.html上查看STLFilt以使输出可读。
foraidt

150

C的许多名称空间:

typedef int i;

void foo()
{
    struct i {i i;} i;
    i: i.i = 3;
    printf( "%i\n", i.i);
}

或带有字符:

typedef char c;

void foo()
{
    struct c {c c;} c;
    c: c.c = 'c';
    printf( "%c\n", c.c);
}

这到底是怎么编译的?!
Earlz'1

13
枚举和结构的+1标签标识符是C imho中最令人困惑的部分。很少有人理解为什么对一个结构体的指针进行类型定义的惯用法看起来如此。
Tadeusz A.Kadłubowski10年

11
之所以进行编译,是因为上下文使我的每个人都拥有明确的命名空间。
安德鲁·麦格雷戈

149

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

编辑:从评论来看,有些人似乎认为我不喜欢缩进我的代码。那是不正确的评估。无论使用哪种语言以及是否被强制使用,我总是缩进代码。我不喜欢的是缩进定义了一行代码所在的块。为此,我更喜欢使用显式定界符。除其他原因外,我发现显式的定界符使剪切和粘贴代码更加容易。

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

编辑2:一些提供评论的人似乎认为这是我讨厌的功能,或者我认为使python成为不良语言。再次,不是真的。尽管我不太喜欢它,但这是没有意义的。问题是关于最奇怪的语言功能,我认为这很奇怪,因为它使用的语言非常少(但> 0)。


63
如果它妨碍了您的工作效率,那么您的非python代码就不太可读了……
Tor Valamo 2010年

27
在使用Python之前,您使用什么语言?您如何与其他人一起工作而不会缩进该语言?谁能忍受任何语言的非缩进代码?您是否在一个充满天才的房间里工作,这些人不需要源代码中的视觉提示?
S.Lott

53
+1不能完全同意,如果我的编辑器(Emacs)无法根据不同的内容(例如大括号/开头,结尾/您自己命名)自动缩进代码,那将是非常愚蠢的。您对“更大”的功能进行的任何重构几乎都是非常糟糕的体验。
德米特里(Dmitry)2010年

83
达成协议-使用任何其他语言,我可以突出显示一段代码,并由任何编辑者正确缩进。但是由于按定义空格是正确的缩进,因此您会在Python中失去该功能。因此,移动代码或重构代码变得更加困难。对于声称OP是“第一个声称这是一个问题的人”的人来说,我不得不维持一段时间的python代码,由于这个原因,我现在将在python上使用任何语言。
Kendall Helmstetter Gelner 2010年

38
我不在乎Python中的空格。WTF表示它没有被一致地执行。您可以混合使用缩进级别和制表符,只要它们与其同级一致即可。因此,第一个缩进级别可以是一个空格,第二个可以是两个TAB,这不是语法错误。
ieure 2010年

138

我为此感到挣扎:

1;

在perl中,模块需要返回true


29
某些模块可能基于运行时操作返回值。如果您始终返回true,则仍然不必对此创意不佳:returnvalues.useperl.at
Anonymous

8
如果我的Perl内存正确地为我服务,则从模块返回true表示模块已成功加载。返回假值意味着出了点问题,并会阻止程序运行(如果未捕获)。
巴里·布朗

这也是一个有效的C语句,仅返回任何内容。
sigjuice 2010年

24
马克·多明纳斯(Mark Dominus)写道:“我很少使用'Cogito ergo sum';众所周知的在所有可能的宇宙中都是正确的。这确保了最大的可移植性。”
格雷格·培根

PHP <?=1;?>返回1. <?=true;?>返回1. <?=false;?>返回null。
Talvi Watia 2010年

135

我很惊讶没有人提到Visual Basic的7循环结构。

For i As Integer = 1 to 10 ... Next
While True ... End While
Do While True ... Loop
Do Until True ... Loop
Do ... Loop While True
Do ... Loop Until True
While True ... Wend

因为贴!在有条件的正面的方式太复杂!


47
他们应该将其命名为“ WhileWhend”,因为有些人确实会用无声的唇音近似的发音来发音“ while”。当然,它的排列更好,并且排列的代码也不错。
dreamlax 2010年

43
你怎么这么傻
艾里克·福布斯

48
哇。考虑一下,我有点怀旧。我第一次使用VB是在9岁的时候。我来自瑞典,那时英语还不太熟练。现在,有一个瑞典语单词“vänd”,基本上表示“转身”,其发音与“ wend”类似。因此,我认为这很有道理... :)
Emil H 2010年

61
!不是在VB中,而是“不是”。还是?是的,不是不是!,而是不是。
brianary

7
是的,“ Wend”是一个英文单词,意思是沿着某种路线或方式前进或前进(google.com/search?q=define%3A+wend)。我不确定这是有用还是有害。
迈克尔·迈尔斯

134

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

$ bc -lq
12^345
20774466823273785598434446955827049735727869127052322369317059031795\
19704325276892191015329301807037794598378537132233994613616420526484\
93077727371807711237016056649272805971389591721704273857856298577322\
13812114239610682963085721433938547031679267799296826048444696211521\
30457090778409728703018428147734622401526422774317612081074841839507\
864189781700150115308454681772032

bc长期以来一直是标准的Unix命令

现在开始使用“ WTF功能”。这来自man bc(强调我的):

quit:读取quit语句时,无论在哪里找到quit语句,bc处理器都会终止。 例如,“ if(0 == 1)quit”将导致bc终止。

halt:halt语句(扩展名)是已执行的语句,该语句使bc处理器仅在执行时退出。 例如,“ if(0 == 1)暂停”将不会导致bc终止,因为未执行暂停。


41
我用Haskell做这些东西。
Thomas Eding

8
Google计算器?
igul222

7
我已经开始使用Python了,如果您在线,Google计算器也不错。但是bc在那之前我曾经使用过,并且bc由于手册页中的引号,我想在我的帖子中写一些内容。
Alok Singhal'1

6
@Brian,那么您会喜欢:(echo '[q]sa[ln0=aln256%Pln256/snlbx]sb3135071790101768542287578439snlbxq'|dc尽管您可能已经知道这一点)。
Alok Singhal'1

2
我使用irb(Ruby交互式外壳)。但是回到那天,我一直都想获得直流电-像公元前一样,但是使用反向抛光。极客!
tragomaskhalos 2010年

134

我一直想知道为什么最简单的程序是:

class HelloWorldApp {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

可能是:

print "Hello World!"

也许这首先是要吓computer计算机科学专业的学生...


34
在某些语言中,“ Hello World!” 是有效的程序。
David Thornley,2010年

31
@SoMoS:在大多数动态语言(如Python,Ruby或Perl)中,都显示“ Hello World!”。或某些细微的变化(例如,打印而不是打印)是有效且完整的程序。
戴夫·柯比

36
@Loadmaster:暗示“所有代码都属于一个类”或“所有代码都属于一个函数”是不必要的约束
Jimmy 2010年

19
仅仅因为一种语言强制使用对象,并不意味着它就被用于正确的面向对象编程。完全有可能用Java或C#进行程序编程。那就是静态方法的目的。
jdmichal 2010年

68
我爱那些认为OOP意味着一切都应该成为对象的人。
Tor Valamo 2010年

132

JavaScript是面向对象的,对吗?因此,应在文字字符串和数字上运行方法。喜欢"hello".toUpperCase()3.toString()。原来第二个是语法错误,为什么?因为解析器希望数字后跟一个小数点才是浮点文字。这不是WTF,WTF是您只需添加另一个点使其起作用:

3..toString()

原因是文字3.被解释为3.0,并且3.0.toString()可以正常工作。


8
在Python中也可以这种方式工作(试试3..__add__(4))。再说一次,我认为(3).__add__(4)这样做的方式对大脑的伤害要小得多:)
badp

49
您可以只做(3).toString()
Joseph Montanez 2010年

13
@ Gorilla3D:是的,但这不是一个奇怪的语言功能,对吗?
Theo

25
3.0.toString()使我的眼睛发痒。
本·布兰克

18
127.0.0.1.toInt()
白俄罗斯

130

在JavaScript中:

2 == [2]

// Even stranger
2 == [[[2]]]

// And down-right nutty
var a = { "abc" : 1 };
a[[[["abc"]]]] === a["abc"]; // this is also true

幸运的是,stackoverflow.com上的好心人向我解释了整个事情: 为什么JavaScript中2 == [2]?


6
这就是为什么您应该使用它===
Gumbo 2010年

10
顺便说一句,这很有用,如果您有一个返回数字的函数并且想要返回一些其他元数据,则可以返回[number]并添加一些其他字段。简单的代码永远不会知道它不是实数,而其他代码可以获取所需的元数据。
Andrey Shchekin,2010年

36
@Andrey,除非我必须维护符合您建议的代码,否则我将很快祝愿其作者死亡。
布列塔尼

@Andrey,这是个好主意!您也可以Number(n)用来做类似的事情。不幸的是在这两个我们的解决方案的===休息=(
哈维

5
+1:我认为自己是一位博学的js程序员,我对此一无所知:D
Thomas Eding 2010年

126

我最讨厌的功能是任何包含条件逻辑的配置文件语法。这种事情在Java世界中非常盛行(Ant,Maven等。您知道自己是谁!)。

您最终只能使用ac ** p语言进行编程,并且调试和支持的编辑器也很有限。

如果您需要在配置中使用逻辑,则以真实语言对配置进行编码的“ Pythonic”方法要好得多。


24
Tcl在Python诞生很久之前就重新发明了,而Lisp在那之前就发明了它。因此,我们不要将其称为Pythonic,而应将其称为Emacs-ish。
slebetman 2010年

46
我们就称它为正确。
mletterle,2010年

30
阿们 如果您的配置或构建语言即将完成,则说明您做错了。我在看着你CMake /自动工具。
约瑟夫·加文

16
这正是Lua最初设计的目的
Cogwheel

1
好吧,如果您的代码是使用Python编写的,那么将配置文件作为Python文件是一个好主意,因为您只需导入文件并读取模块的属性即可。您会在配置文件中获得Python的100%Turing Complete功能。
asmeurer 2011年

113

powerbasic(www.powerbasic.com)包含编译器指令:

# BLOAT {bloatsize}

这会增加编译后的可执行文件的大小(以<bloatsize>字节为单位)。这是放置在编译器中的,以防创建可执行文件的人不喜欢生成的可执行文件的体积小。它使EXE看起来更大,可以与肿的编程语言竞争:)


9
哈哈 我听说开发人员故意放慢某些操作(例如搜索)的速度,因为它可以帮助人们相信它确实在做某事。我猜类似的事情。
David

42
这使我想起了我最近读过的东西。他们正在测试FPS,并决定增加坏蛋的生命值。然后他们问测试人员他们的AI怎么样,他们发誓它要聪明得多。但是AI并没有改变,只是生命值。人们对他们的世界有某种特定的叙述,如果您理解并符合他们的期望,他们只会认为它证实了他们的叙述。
Nate CK 2010年

5
我曾经给程序增加了很多额外的速度,以使它们看起来像在做复杂的事情。回到小学。
Matti Virkkunen 2010年

3
回到学校时,我们有80286台机器,实际上我不得不在汇编中编写一些屏幕输出例程,以达到合理的速度(即不爬行)。
berkus

7
@Nate CK,如果AI活得足够长,以炫耀它的AI,它可能实际上更聪明,而它可能已经死亡太快之前来证明这一点。
zzzzBov 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.