当前位置: 首页 > 科技观察

编程语言中的一些邪恶咒语,千万别用_0

时间:2023-03-21 14:28:19 科技观察

自从看了GaryBernhardt评价很高的视频Wat后,我??就对特定编程语言的怪异行为感到惊讶。有些编程语言的行为比其他语言更出乎意料。例如,有一整本书专门讨论Java中的边缘情况和怪事。此外,只需花费大约200美元,您就可以阅读C++规范。下面是我最喜欢的咒语的集合,这些咒语很棒,很有趣,而且仍然有效。一般来说,利用这些怪癖被认为是一件坏事,因为代码不应该是意外的。值得庆幸的是,如果您尝试下面的大部分愚蠢行为,那么有很多linters准备好嘲笑您。话虽如此,知识就是力量,所以我们开始吧。幸运的是,Python2中True的恶意重新分配>>>True=False>>>TrueFalse在Python3中导致了SyntaxError,因为True、False和None现在是保留字。与将#definetruefalse偷偷放入同事开发机器上的标准头文件中的C++恶作剧相比,它仍然远没有那么邪恶。Java和Python中的奇怪行为示例==的语义常常让新的Java程序员感到困惑。即使在微不足道的情况下,此运算符的不一致性也会使事情复杂化,即使性能优势是值得的。Integera=100;Integerb=100;System.out.print(a==b);//printstrueIntegerc=200;Integerd=200;System.out.print(c==d);//printsfalseJVM会把区间[-128,127]使用相同的引用。更奇怪的是,同样的行为发生在Python中。>>>x=256>>>y=256>>>xisyTrue>>>x=257>>>y=257>>>xisyFalse到目前为止,没有什么特别出乎意料的。>>>x=-5>>>y=-5>>>xisyTrue>>>x=-6>>>y=-6>>>xisyFalse看来python解释器的下界使用同一个例子是...-5。[-5,256]范围内的整数具有相同的ID。不知何故,这变得更奇怪了。>>>x=-10>>>y=-10>>>xisyFalse>>>x,y=[-10,-10]>>>xisyTrue好像是用解构赋值来改变这里的规则。我不确定为什么会这样。事实上,我在StackOverflow上问了一个问题来尝试理解它。我的猜测是一个列表中的重复值指向同一个对象以节省内存。C中的反向下标表示法反向下标表示法可能会让所有开发人员头疼。intx[1]={0xdeadbeef};printf("%xn",0[x]);//printsdeadbeef这样做的原因是array[index]实际上只是*(array+index)的语法糖。由于加法的可交换性,我们可以交换数组和索引并得到相同的结果。C中的“倒数”运算符->运算符,第一次看到好像是个语法错误。当您意识到它可以编译时,它看起来像是一个未记录的语言功能。幸运的是,两者都不是。for(x=3;x-->0;){printf("%d",x);//prints210}–>"operator"实际上是两个运算符,在此上下文中它解析为(x–)>0.众所周知,大量使用会导致混乱,这是彻头彻尾的邪恶。C中的sizeof运算符sizeof运算符是一个编译时运算符,它赋予了它有趣的属性。intx=0;sizeof(x+=1);if(x==0){printf("wtf?");//thiswillbeprinted}由于sizeof运算符示例是在编译时求值的,(x+=1)不会跑步。另一个有趣的事情是,研究表明printf("wtf?")是最常见的未推送代码。Lua、Smalltalk、MATLAB和其他,索引从1开始/r/programminghumor一直在玩“索引从1开始”模因。令人震惊的是,有多少编程语言使用从1开始的数组索引。可以在此处找到更全面的列表。0在Ruby中的计算结果为真……而且只有Ruby。*这在Ruby中是正确的。*if0thenprint'thanks,ruby'end#printsthanks,ruby*编辑:reddit上指出这对Lua、Lisp和Erlang也是如此。*编辑:Reddit上指出这对Lua也是如此、Lisp和Erlang。也成立。CC中的三字母、有向字母和标记由于历史原因,C中有非字母符号的替代符号。if(trueandtrue){//sameasif(true&&true)printf("thanks,c");}一些国外的设备,比如IBM3270,没有提供一些C/C++中常用的符号,所以提供了digraph,trigraph,token避免排除特定字符集。