邪恶的编码魔咒,你中招没?

2018-01-31 10:58:17来源:http://blog.csdn.net/csdnnews/article/details/79191257作者:CSDN人点击

分享

自从我观看了Gary Bernhardt所推崇的视频以后,就对某些编程语言的怪异表现着迷了。一些编程语言比其他语言有更多令人感到意外的表现。例如:有一整本关于Java语言的书,专门介绍它的边界类(Edge)及一些特性。相应的,对于C++语言我们可以参考它的标准规范,花上200美元即可。

 

下面是我最喜欢的内容,是一些令人感到惊讶、搞笑的内容,还有一些像是魔咒。一般来说,使用这些有着特殊行为的代码被认为是邪恶的,因为你的代码不应该给人带来惊讶的感觉。如果你执意要去做下面这些愚蠢行为的话,会有不少洋相等着你呢。话虽如此,知识就是力量呢,我们开始吧。

 

在Python 2中对True进行了错误的重赋值

 

英文中的Two和True的发音是押韵的,但这并没什么意义。

 

 

幸好Python 3以来将True、False和None作为保留字后,重复赋值的做法就会产生SyntaxError这样的错误。但这样奇怪的做法远比你在其他人的标准头文件中用#define true false少得多。

 

Java和Python语言中不可思议的表现

 

对于Java程序员来说,“==”运算符的语义常常令人感到困惑。但是,即使是一些微不足道的场景,操作符的不一致性表现也会使情况变得比较复杂。即便这样做能够提升程序的执行效率。

 

 

在[-128,127]之间,JVM将使用同一个引用。更令人称奇的是,python语言也有同样的行为。

 

 

即使变成负值,结果也是一样的。

 

 

相同的实例代码中,python语言解释器的整数区间下限似乎是-5。在[-5, 256]范围内的整数区间的得到了相同的ID值,这样就更奇怪了。

 

 

似乎使用破坏性赋值会对既有规则有所改变。我不知道为什么会是这样,实际上我遇到过一个堆栈溢出的问题并试图去理解它。我的猜测是,内存中一个列表里重复的值是指向相同对象的。

 

C语言中的反向下标

 

反向的下标符让任何一位开发者都会感到头疼。

 

 

这种写法能够运行的原因在于array[index]实际上只是*(array + index)的语法糖。多亏还有这样可互换的性质,我们可以将数组名和其索引进行互换而得到相同的结果。

 

C语言中的”一直走”操作符

 

当第一次看到→操作符的时候,看上去似乎是语法错误。编译的时候,它看起来像是一项没有被归档的语言功能特性。不过,这些想法都是不对的。

 

 

操作符→实际上是两个操作符,在所举的例子中被解析为(x--)>0。众所周知,这样做在成品软件中会造成相当大的混乱,极为邪恶。

 

C语言中的sizeof运算符

 

运算符sizeof是一个编译时运算符,它提供了有趣的属性。

 

 

由于在编译时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语言中有那些非字母和非数字符号有其替代符。

 

 

 

一些国外的设备,例如IBM3270就没有提供C/C++中常用的一些符号,因此提供了那些digraph、trigraph和token,目的在于不歧视特定的字符集。

 

我希望这篇文章能够让您感到有趣,还可以在reddit网站上进行讨论。

 

原文链接:http://9tabs.com/random/2017/12/23/evil-coding-incantations.html

 

作者:Jekyll

 

译者:白云鹏

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台