嘿嘿,程序員的幽默可以程序員們捧腹大笑,而其他人則一頭霧水,看不到懂這些段子的笑點。如果你不是程序員,請看看下方對應的解釋。
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 等等。
分享之前我還是要推薦下我自己的前端學習群:180442230,不管你是小白還是大牛,小編我都挺歡迎,不定期分享乾貨,包括我自己整理的一份2017最新的前端資料和零基礎入門教程,送給大家,歡迎初學和進階中的小夥伴
如果我們把八進位的 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.
這個問題就是該問題的答案。請看問題前後的紅色字元,你會看到「
HTML「標籤」通常包括一個開始標記和一個結束標記。開始標記是在包含在 <> 里(有時還有額外信息)的標記名。那麼,結束標記的標記名和開始標記一樣,不過它的前面有個 /。
「
所以,這張圖讓人相當煩。
8.
在這張漫畫中,老師罰學生寫 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/s2 的加速度來加速。
和物理沾邊的電腦笑話,還真不多。
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(或說刪除)包含所有學生的所有信息的表格(數據集)。
我猜這所學校通過這種痛苦的方式,學到了該凈化他們得到的輸入信息。