10 个有趣的程序员笑话,不懂可以看解释

嘿嘿,程序员的幽默可以程序员们捧腹大笑,而其他人则一头雾水,看不到懂这些段子的笑点。如果你不是程序员,请看看下方对应的解释。

1.为什么程序员总是搞混万圣节和圣诞节?因为 Oct 31 = Dec 25。

这个笑话是说八进制的 31(其缩写看着像 October 31st ,万圣节)和十进制的 25(其缩写很像 December 25th ,圣诞节)相等。

十进制和八进制是两种计数制,它们的基数不同。

十进制是基于 10 的计数制,大家都很熟悉了。一种计数制的数字个数和它的基数数目一样。这就是说,基数为 10 的计数制有 10个数字(0, 1, 2, 3, 4, 5, 6, 7, 8, 9),十进制因此得名( 其英文单词 decimal 源自拉丁语 decimus,意思是第 10 个)。

当你要表示一个比最高位数还高的数字时,在左边再加上一列,所以你会这样数:9, 10, 11, 12,等等。

八进制(英文单词源自拉丁语词根 oct-,意思是8)是一种基数为 8 的计数制,通常用于编程。基数为8的计数制意味着它有8个数位(0, 1, 2, 3, 4, 5, 6, 7)。当你要表示一个大于 7 的数时,你也得再加一列,那么你像这样数:6, 7, 10, 11, 12 等等。

如果我们把八进制的 31 转换成十进制,我们最后得到 25。瞧:如果我们把八进制的 31 分解,用一个数学等式表示,最终是3*81+1*80=3*8+1*1= 24+1= 十进制的 25。

反过来把十进制转换成八进制的话,用你可以除的基数(在这个例子里是8)的最大次幂去除,得到一个整数,保留这个整数,再用余数去除基数的小一次的幂,直到幂的次数为0。然后,你只要把除后得到的数字组合起来即可。比如在这个例子里转换25,我们从81开始:25/81=3,余数1/80=1,因此它的八进制是31。

2. 世界上有 10 种人,懂二进制的和不懂二进制的。

这是一个关于二进制的笑话。二进制是一种基数为 2 的计数制。因为它基数为 2,所以它只有 2 个数字,0 和 1。

如果我们把二进制 10 转换成十进制,我们得到:1*21+0*20=1*2+0= 2

所以,这个笑话的意思就是 “世界上有 2 种人。懂二进制的和不懂二进制的。”

如果你不懂二进制,你会认为世界上有十种人,那这个笑话就很诡异了。

除了十进制(基数为 10),八进制(基数为8)和二进制(基数为 2),十六进制(基数为 16)也广泛用于编程。它用字母A、B、C、D、E 和 F表示大于 9 的“数字”。

3. 有两种方法写出零错误的程序,只有第三种方法奏效。

这个段子指出了一个事实,实际上不可能写出一个零错误的程序。

写出一个看似没有错误的程序还是有可能的(错误在程序员的术语中叫做“bug”),但控制论昆虫学的 Lubarsky 法则就说了,“总会还有一个 bug”。Bug 可能很小,在某些特定的情况下你根本发现不了它……但是总会还有一个bug。

正因为总是还有一个 bug,这个段子说只有第三种方法,即不存在的方法,是写出一个零错误程序的唯一方法。

4. 关于布尔数最棒的事情是,就算你错了,你也只是错了一点(bit)。

布尔数是一种只有两个值的数据类型,即「真」和「假」。

数据类型是指,比如在像变量之类的东西里保存的数据是什么类型的。

编程世界里的变量,类似于你可能在数学课里见过的变量,不同的是,程序里的变量可以表示的不仅仅是数字。例如,它能保存一个字母,如“c”,或者一整句话或是短语,比如“Hello World”。这种变量一般叫做字符串,或者布尔数。

典型的布尔数保存一个 bit 。bit 是计算机里最小的存储单位。bit 保存的是一个二进制数位。二进制,也就是基数为 2 的计数制,表示说它只有 0 或者 1 的值。在布尔数里,0 通常表示「假」,而 1 通常表示「真」。

那么这个笑话就说了,如果你有一个布尔数,你最多只能错一个 bit,不是 0 就是 1。

5. 优秀的程序员,在过单行道时总要左右看两边。

这个笑话指出了这样一个事实,作为一个程序员,你不能假定程序会如何运行,并且总是需要核对一切。

举个例子,如果让用户输入一个数字,优秀的程序员不会只假设用户输入的就是一个数字。他们需要检查得到的是否真是一个数字,而不是一个词语或一个符号或一片空白。然后,他们需要检查数字是否在他们期望的区间内(例如,对“有多少人出席了?”,负三 -3 就不是一个有效值)。

因此,这个笑话是说,程序员们不能只因为路是单行道,就假定每个人都遵守单向行驶的规则。

6.调试犹如大海捞针

调试就是程序员把 bug 从程序里移除的过程。找 bug(及其成因)经常是件棘手的事,尤其是代码量非常多的时候,找到它们就好比在大海里找一根针。

因此,调试犹如大海捞针。

7. <div>问:如何惹恼 Web 开发者?</span>

这个问题就是该问题的答案。请看问题前后的红色字符,你会看到“<div>”和”</span>”。它们是 HTML 语言中的「标签」,而 HTML 是编写网页的语言。

HTML「标签」通常包括一个开始标记和一个结束标记。开始标记是在包含在 <> 里(有时还有额外信息)的标记名。那么,结束标记的标记名和开始标记一样,不过它的前面有个 /。

“<div>Q: How do you annoy a web developer?</div>”, “<span>Q: How do you annoy a web developer?</span>”, 和“<div><span>Q: How do you annoy a web developer?</span></div>” 这 3 个都正确使用标签。但 <div> 和 </span> 混起来用就不对了,任何一个 Web 开发者都会想要纠正。

所以,这张图让人相当烦。

8.

Funny Programming Jokes

在这张漫画中,老师罚学生写 500 遍「我不会在课堂里扔纸飞机了」。

学生觉得他挺聪明,他在黑板上写了一个 C++ 程序,来替他做事。

这个程序是这样的:

第一行代码是在 C++ 里所有程序通常需要包含进去的。它告诉编译器去为你写的程序引入某些额外内建的特性(stdio 库是标准输入/输出的缩写)。(外行人可以把编译器理解成把「一种语言」翻译解释成「另外一种语言」的程序。)

下一行代码声明了“main”函数。函数基本上就是一个代码块,你可以多次使用该函数。在C++里,所有程序都必须有一个名为”main”的函数,它是程序启动时调用的第一个函数。main 前面的 int,表示它必须返回一个 integer(也就是整数)。“返回”一个值的意思是,不管什么函数调用这个函数,在它运行完时,会告诉调用函数这个值。“void”是指函数不必返回任何值。

下一行的开括号(也被认作左花括号)和最后一行的闭括号(或右花括号),配成一对,表示一个代码块区间。这个代码块属于开括号之前的对象(在这里,就是 main 函数)。

下一行的 “int count”。它声明了一个类型为 “int” 的变量(一个信息容器,很像代数里的变量)。它表示 count 里会存放一个integer(一个整数)。分号(;)表示一条语句的结束。

下一行:“for (count = 1; count <= 500; count++)” 是一个 for 循环。循环是指它会多次运行给定的命令。在这里,我们有“count = 1”,它告诉我们 count 将以 1 为起始值。然后,“count <= 500;” 告诉我们“当 count 小于或等于 500 时一直运行”。最后,“count++”告诉我们,在我们做了 for 循环包含的命令之后,把 count 的值加 1。

在这个程序中,for 循环只有一条命令:“printf(“I will not throw paper airplanes in class.”);”。如果它包含不止一行语句,它应该要有它自己的一对花括号将它们括起来。这一行告诉程序去打印 “I will not throw paper airplnes in class.” 这句话。由于它在 for 循环里,而for循环从 1 计数到 500,每次增加一条短语,这条短语将被打印 500 次。

最后,“return 0;”只是表示程序返回整数 0(因为 main 函数那一行说它会返回一个整数)。

因此,理解这个程序,我们可以推断出老师给了什么样的惩罚……还有老师为什么看起来不像被逗乐了。

9. 给一台慢电脑加速的最好方法,就是用 9.8m/s的加速度来加速。

和物理沾边的电脑笑话,还真不多。

9.8m/s2(9.8米每平方秒)是地球重力加速物体到地面的常量。就是说,如果你扔个东西到真空中(即指没有空气的环境,因为空气实际上让物体落得更慢),每秒钟它会比上一秒快 9.8 米。

基本上,这个笑话是说,如果你被一台慢的要死的电脑烦着,加速它的最快办法是把它扔出窗外,或者要么把它从高处扔下去。

请注意,这当然是个玩笑。扔掉你的电脑,实际上只会得到一台破电脑哈。:)

10.

这个笑话跟 SQL 有关。SQL是用来控制数据库的命令,也是常见的黑客用来攻击不安全的网站用的命令,这种情况下叫做 SQL 注入。

基本概念是,当你从用户能输入的地方(像是登录表格)得到一些信息,你可能会把它用在查询(一条SQL命令)里,如果你不「净化」这些输入信息,或者清除它的不必要的值,用户可能做出一些恶意的行为。

以这条查询 “SELECT * FROM users WHERE username = $user AND password = $password” 为例。一般来说,这条语句会查看 $user变量里保存了用户名和 $password 变量里保存了密码的用户。因此,如果我输入“Bob”和“cookiesareyummy”,它会得到这些值,就像这样:“SELECT * FROM users WHERE username = ‘Bob’ AND password = ‘cookiesareyummy’”。

这都很好。然而,如果我想稍微恶毒一点,我可能说我的用户名是“Bob’;—”。这会让查询语句变成“SELECT * FROM users WHERE username = ‘Bob’; –’ AND password = ‘cookiesareyummy’”。分号(;) 意味着查询语句的结束,而  意味着它后面的任何字符只是注释,代码被忽略了。这个小伎俩可以让我不知道密码的前提下以任何人的身份登录。在健壮的系统里,你会净化输入信息,这些信息可能会让所有人没办法正常访问。

这位特别的母亲做了更出格的事。她通过给她的儿子取名“Robert’); DROP TABLE Students; –“,加了一条额外的命令。这句“DROP TABLE Students”会drop(或说删除)包含所有学生的所有信息的表格(数据集)。

我猜这所学校通过这种痛苦的方式,学到了该净化他们得到的输入信息。

打赏支持我翻译更多好文章,谢谢!

打赏译者

打赏支持我翻译更多好文章,谢谢!

任选一种支付方式

2 4 收藏 6 评论

关于作者:风-晴-雪

1. 在职翻译2. 兴趣点:C/C++,Javascript,PHP,在线教育,游戏,项目管理,职场经验 个人主页 · 我的文章 · 12 ·  

可能感兴趣的话题



直接登录
最新评论
跳到底部
返回顶部