程序员

注册

 

发新话题 回复该主题

10个有趣的程序员笑话,不懂可以看解释 [复制链接]

1#

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

1.为什么程序员总是搞混万圣节和圣诞节?因为Oct31=Dec25。

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

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

十进制是基于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”,或者一整句话或是短语,比如“HelloWorld”。这种变量一般叫做字符串,或者布尔数。

典型的布尔数保存一个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「标签」通常包括一个开始标记和一个结束标记。开始标记是在包含在里(有时还有额外信息)的标记名。那么,结束标记的标记名和开始标记一样,不过它的前面有个/。

“divQ:Howdoyouannoyawebdeveloper?/div”,“spanQ:Howdoyouannoyawebdeveloper?/span”,和“divspanQ:Howdoyouannoyawebdeveloper?/span/div”这3个都正确使用标签。但div和/span混起来用就不对了,任何一个Web开发者都会想要纠正。

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

8.

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

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

这个程序是这样的:

1

2

3

4

5

6

7

8

9

10

#includestdio.h

intmain(void)

{

intcount;

for(count=1;count=;count++)

printf(“Iwillnotthrowpaperairplanesinclass.”);

return0;

}

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

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

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

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

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

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

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

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

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

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

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

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

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

10.

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

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

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

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

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

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

预览时标签不可点收录于话题#个上一篇下一篇
分享 转发
TOP
发新话题 回复该主题