软件开发
OA系统

扫一扫微信二维码

险恶的编程咒语

发布时间2018年12月13日标签:险恶,恶的,编程,咒语 22
本文由 计算机软件开发 - 精算狗 翻译。未经允许,禁止转载!
英文出处:9tabs。迎接加入翻译组。

自从我看了 Gary Bernhardt 备受推许的一个视频 Wat,就惊异于特定编程语言的怪异举动。相较于其他编程语言来说,某些编程语言的举动更出乎料想。例如,有一整本书是针对 Java 的边缘案例和古怪情况。同样,差不多只要 200 美元你就可以阅读 C++ 规范说明了。

下面是我喜好的、惊讶的、滑稽的并仍然有用的咒语荟萃。一样平常来讲,行使这些古怪的举动被视为坏事,由于代码不应该出乎料想。值得庆幸的是,假如你尝试以下大多数蠢事,有许多代码校检工具(linters)已经预备好嘲笑你了。说了这么多武汉网页设计,知识就是力量,那就开始吧。

Python 2 中对 True 险恶的重赋值

123 >>> True = False>>> TrueFalse

谢天谢地,这在 Python 3 中会导致?SyntaxError,由于 True、False 和 None 如今是保留字。它仍远没有 C++ 的那个恶作剧那么险恶,把 #define true false 静静写进同事的开发机器的标准头文件中。

Java 和 Python 中的诡异举动实例

对 Java 新手程序员来说,== 的语义每每使人疑心。甚至在眇乎小哉的情境下,这个操作符的前后矛盾也会使情况变得复杂,即使性能效益是值得的。

1234567 Integer a = 100;Integer b = 100;System.out.print(a == b); // prints true Integer c = 200;Integer d = 200;System.out.print(c == d); // prints false

JVM 会对区间?[-128, 127] 内的值使用雷同的引用。更新鲜的是,Python 中也有同样的举动。

123456789 >>> x = 256>>> y = 256>>> x is yTrue >>> x = 257>>> y = 257>>> x is yFalse

目前为止,还没有分外出乎料想的。

123456789 >>> x = -5>>> y = -5>>> x is yTrue >>> x = -6>>> y = -6>>> x is yFalse

好像 python 诠释器使用雷同例子的下限是……-5。区间?[-5, 256] 内的整数有同样的 ID。不知怎地,这变得更新鲜了。

1234567 >>> x = -10>>> y = -10>>> x is yFalse>>> x, y = [-10, -10]>>> x is yTrue

好像使用解构赋值改变了这里的规则。我不确定为什么是如许。事实上,我在 Stack Overflow 上提了一个题目来试着理解它。我的猜测是幼儿园长培训,一个列表中的重复值指向统一个对象,用以节省内存。

C 中颠倒的下标符号

颠倒的下标符号,会使所有开发者都头疼。

123 int x[1] = { 0xdeadbeef }; printf("%xn", 0[x]); // prints deadbeef

这行得通的缘故原由是,array[index] 确实只是 *(array + index) 的语法糖。因为加法的交换性,我们可以交换数组和索引,并得到同样的效果。

C 中的“倒数”操作符

–> 操作符第一次被看到时,好像是句法错误。在你意识到它可编译时,它看起来像未被记载的语言特征。荣幸的是,两者都不是。

123 for (x = 3; x --> 0;) {    printf("%d ", x); // prints 2 1 0}

–> “操作符”现实上是两个操作符四川人事考试网报名,在这个背景下解析为 (x–) > 0。众所周知,大量使用会导致疑心,这完全是险恶的。

C 中的 sizeof 操作符

sizeof 操作符是一个编译时操作符,这给予了它风趣的属性。

12345 int x = 0;sizeof(x += 1);if (x == 0) {    printf("wtf?"); // this will be printed}

因为 sizeof 操作符的例子是对编译时进行评估的,(x += 1)?不会运行。另一件趣事是,研究注解 printf(“wtf?”) 是普遍的没有被?push 的代码。

Lua、Smalltalk、MATLAB 及其他语言,索引由 1 开始

/r/programminghumor?一向在用“indexing starts at 1”表情包取乐。令人震惊的是,有大量编程语言使用从 1 开始的数组索引。可以在这里找到更周全的清单。

Ruby 中的 0 被判为 true

… and only Ruby. *

在 Ruby 中是如许。*

1 if 0 then print 'thanks, ruby' end # prints thanks, ruby

* edit: It was pointed out on reddit that this is true for Lua, Lisp, and Erlang as well.

* 修订:Reddit 上有人指出,这在 Lua、Lisp 和 Erlang 中也成立。

Trigraph, Digraphs, and Tokens in C

C 中的 Trigraph、Digraph 和 Token

因为历史缘故原由广告策划,C 语言中的非字母符号有替换品。

123 if (true and true) { // same as if (true && true)    printf("thanks, c");}

有些外国设备,例如 IBM 3270,在 C/C++ 中不提供某些常用符号,所以提供了 digraph、trigraph 和 token 来避免排斥特定字符集。