邪恶的编码魔咒,你中招没?
原文链接 http://9tabs.com/random/2017/12/23/evil-coding-incantations.html
自从我观看了Gary Bernhardt所推崇的视频以后,就对某些编程语言的怪异表现着迷了。一些编程语言比其他语言有更多令人感到意外的表现。例如:有一整本关于Java语言的书,专门介绍它的边界类(Edge)及一些特性。相应的,对于C++语言我们可以参考它的标准规范,花上200美元即可。
下面是我最喜欢的内容,是一些令人感到惊讶、搞笑的内容,还有一些像是魔咒。一般来说,使用这些有着特殊行为的代码被认为是邪恶的,因为你的代码不应该给人带来惊讶的感觉。如果你执意要去做下面这些愚蠢行为的话,会有不少洋相等着你呢。话虽如此,知识就是力量呢,我们开始吧。
在Python 2中对True进行了错误的重赋值
英文中的Two和True的发音是押韵的,但这并没什么意义。
幸好Python 3以来将True、False和None作为保留字后,重复赋值的做法就会产生SyntaxError这样的错误。但这样奇怪的做法远比你在其他人的标准头文件中用#define true false少得多。
#python 2.7
True=1
print(True) #1
Java和Python语言中不可思议的表现
对于Java程序员来说,“==”运算符的语义常常令人感到困惑。但是,即使是一些微不足道的场景,操作符的不一致性表现也会使情况变得比较复杂。即便这样做能够提升程序的执行效率。
Integer a=100;
Integer b=100;
System.out.print(a==b);
Integer c=200;
Integer d=200;
System.out.print(c==d);
java 保存有八种基本类型的“池” 整型是范围是-128~127,所以如果整数不超过127则引用指向同一“池”,所以他们指向的是同一对象,超过127 就不是同一对象。
原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。也就是说在-128到127之间的数字是同一引用地址,而其它范围就是不同的引用地址。
a=256
b=256
a is b#True
c=257
d=257
c is d#False
即使变成负值,结果也是一样的。
e=-5
f=-5
e is f #True
g=-6
h-6
g is h #False
相同的实例代码中,python语言解释器的整数区间下限似乎是-5。在[-5, 256]范围内的整数区间的得到了相同的ID值,这样就更奇怪了。
i=-10
j=-10
i is j #False
k,l = [-10,-10]
k is l #True
似乎使用破坏性赋值会对既有规则有所改变。我不知道为什么会是这样,实际上我遇到过一个堆栈溢出的问题并试图去理解它。我的猜测是,内存中一个列表里重复的值是指向相同对象的。
C语言中的反向下标
反向的下标符让任何一位开发者都会感到头疼。
这种写法能够运行的原因在于array[index]实际上只是*(array + index)的语法糖。多亏还有这样可互换的性质,我们可以将数组名和其索引进行互换而得到相同的结果。
C语言中的sizeof运算符
运算符sizeof是一个编译时运算符,它提供了有趣的属性。
int x=0;
sizeof(x+=1);
if(x==0){
printf("wtf?")//this will be printed
}
由于在编译时sizeof运算符的实例就进行了运算,那么x+=1就不会被执行。同样有趣的是:研究表明printf(“wtf?”)这行代码是最典型永远不会被推入堆栈中的情况。
Lua、Smalltalk、MATLAB以及更多语言的索引从1开始
/r/ProgrammerHumor/这个目录下有很多索引从1开始所闹的笑话。令人感到惊奇的是,事实上很多编程语言的数组索引都是从1开始的。
Ruby语言中0的值是true
……也只有Ruby语言。
修正一下:在reddit站点上有人指出,Lua、Lisp和Erlang语言也是如此。
C语言中的Trigraph、Digraph和Token
由于历史原因,在C语言中有那些非字母和非数字符号有其替代符。
Trigraph | Symbol | Digraph | Symbol | Token | Symbol |
---|---|---|---|---|---|
??= |
# |
<: |
] |
%:%: |
## |
??/ |
\ |
:> |
[ |
compl |
~ |
??' |
^ |
<% |
{ |
not |
! |
??( |
[ |
%> |
} |
bitand |
& |
??) |
] |
%: |
# |
bitor |
| |
??! |
| |
and |
&& |
||
??< |
{ |
or |
|| |
||
??> |
} |
xor |
^ |
||
??- |
~ |
and_eq |
&= |
||
or_eq |
|= |
||||
xor_eq |
^= |
||||
not_eq |
!= |
if (true and true) { // same as if (true && true)
printf("thanks, c");
}
一些国外的设备,例如IBM3270就没有提供C/C++中常用的一些符号,因此提供了那些digraph、trigraph和token,目的在于不歧视特定的字符集。
我希望这篇文章能够让您感到有趣,还可以在reddit网站上进行讨论。
发表评论