[音樂播放] 揚聲器1:好的,這是CS50, 這就是本週四開始, 正如你可能已經聽說過或 看,世界已經結束。 去所有的互聯網附近 已經了解和認識 在程序中,一個錯誤的 編程語言,稱為擊。 這已經奇妙的品牌 作為Shellshock,或猛砸門, 但像這些文章 尚未少見。 而事實上,很多人把 Heartbleed回的記憶, 您可能已經注意到,在 按回到過去的這個春天,這 同樣是相當驚人的。 現在,那些你在這裡 今天,你們有多少人有, 即使你不明白 它是所有關於,聽說Shellshock嗎? 沒事了,你們有多少人 有那些易受攻擊的計算機? 好吧,應該是遠遠多動手 了現在,其中的原因,我們將拭​​目以待。 讓我們來看看什麼是 在媒體一直在進行 然後解釋了一下 在這裡,我們在技術上。 揚聲器2:安全專家 警告說,嚴重的缺陷可能 即將影響數百 數以百萬計的全球的網絡用戶。 那麼究竟是一直的錯誤 被稱為Shellshock,並且它有什麼作用? 好,Shellshock也被稱為 Bash的錯誤,它利用該軟件。 黑客利用病毒掃描弱勢 運行Linux和Unix系統 操作系統和再感染它們。 Bash是一個命令行shell。 這使用戶可以發出命令啟動 在軟件程序和功能 通過鍵入文本。 它通常由程序員, 不應該開到更廣闊的世界, 雖然Shellshock改變這一點。 好吧,worringly,一些分析師 警告它可能是一個更大的威脅, 因為Shellshock允許完整 受感染機器的控制權, 而Heartbleed只允許 黑客間諜的計算機上。 它是如此嚴重,它的 被評為10出10 對於由國家嚴重性 漏洞數據庫。 所有Web服務器三分之二是在 風險,包括一些Mac電腦。 好吧,請確保您 現在修補的系統。 任何人託管網站運行 受影響的操作系統 應該盡快採取行動。 任何人誰買得起它應該 他們的監​​控和Web應用程序 防火牆看出來的任何攻擊。 揚聲器3:最壞的事情 可能出現的情況是 有人會寫代碼, 會自動去掃描 互聯網和會影響 所有的這些計算機。 而一旦他們這樣做了,好了, 他們可以做的最糟糕的事情 只是刪除了一切, 或關閉的網站了。 所以我們可以看到損壞 從這個角度看, 在這裡我們將有惡意的人 誰剛剛決定要興風作浪 通過將系統關閉或刪除 文件和類似的東西。 揚聲器2:有人說這是 最難以測量 蟲子多年了,它 可能需要數週甚至數 個月,以確定它的最終影響。 揚聲器1:所以這一切是真實的, 但有趣的是,幾乎所有的 意象你剛才看到的, 也許除了鍵盤, 無關與 臭蟲任何責任。 服務器和電線等, 這有點切向有關, 但在核心實際上很 熟悉的東西是怎麼回事。 其實,讓我進入 我們CS50設備。 讓我繼續前進,最大限度地 在終端窗口中點擊這裡。 而你們一直在用這個, 或嵌入版物, 在以寫程序gedit的, 輸入命令,等等, 這實際上是,具有 已經好幾個星期,猛砸,B-A-S-H。 這是伯恩再次殼, 這是說只是一種奇特的方式, 這是一個程序,有一個 閃爍提示,有效, ,坐在那裡等待 輸入你。 而且它是命令 通過該線路接口 你們已經運行的命令和 最終編譯,然後運行 程序。 但擊也是一種編程 在以下意義上的語言。 你知道,有喜歡的命令 CD和LS也鐺等人, 但你可以定義自己的命令 通過實施這些猛砸。 現在我們不打算 詳談了 作為來砸的編程語言,但 知道,例如,在目前, 有沒有所謂的命令,“你好。” 因此可以發現 其中的一個包。 它不是安裝在我的電腦上。 請詢問您的管理員。 但是,如果我想在那裡是一個程序 Bash或在我的提示叫“你好”, 其實我可以用的語法是 很喜歡C.它是不太一樣的, 但它看起來很相似, 功能,雖然缺少一些細節。 似乎什麼都沒有發生, 但現在如果我輸入“你好”, 你其實可以寫一 方案,而不是在C中,而不是在Java中, 不以其它程序 語言,但在擊本身。 現在,這裡的關鍵是,我寫的 名字我想給這個新的命令, 而括號也 象徵這是一個函數。 順便說一句,你還可以做的樂趣 的事情,而事實上,即使是在Mac OS上, 這是一個叫做終端程序。 它配備內置到任何人的 電腦有一台Mac在這個房間裡, 你可以做的Mac類似的事情 操作系統,但你可以去更不止於此。 這是一個小切, 但它是一種樂趣。 今天早上我被提醒, 想通過這種時候, 一個小遊戲我經常玩 與CS50的前轉錄因子1 因此任何時候,他會走出來 他的鍵盤和他的屏幕解鎖, 我想執行命令 像this--“打招呼”。 現在,任何時候他回來了 鍵盤後,我清屏 他會坐下來, 試著做了一些工作, 列出他directory--的內容 [音頻播放] - 你好。 你好。 揚聲器1:那麼,在公平, 這本來就不是“你好。” 這是一般的東西 更類似於that-- [音頻播放] -Beep。 揚聲器1:--thatìwould-- 所以他的電腦會 任何時候亂罵他,他居然 在他的鍵盤上坐下。 而很快,他想通了 不要離開他的屏幕解鎖。 但這個建議的那種 愚蠢的樂趣,你 可以有類似猛砸。 但它是一個多一點 嚴重的,可以肯定的,不止於此。 而事實上,這是一 最危險和最持久的bug 這確實擊中了世界全球。 這個bug已經存在了 大約20年, 你會在短短的被擊中 此刻,通過相對簡單。 所以這是一個代表 命令,如果你 擁有一台Mac,從字面上現在 當你有你的蓋子打開, 你可以嘗試輸入成 程序調用終端。 終端下 應用Utilities-- 這一次,Windows用戶不必 擔心這個特殊threat-- 但那些你用Mac電腦可以輸入 這成為一個窗口,像我在這裡做的, 如果你鍵入 在這個程序 所謂的終端,像我現在這樣, 如果您看到這個詞“弱勢” 你的電腦 容易受到剝削。 現在是什麼的意思? 這是無可否認的 一些很瘋狂的語法, 但我們至少抽出 一些有趣的方面。 因此,有一些語法看起來 有點眼熟,至少在C 和編程更普遍。 我看到一些括號, 分號,大括號,而這樣, 但事實證明,這 愚蠢的事情在這裡黃 本質上是一種功能 什麼也不做。 結腸手段做任何事情, 分號表示停止做什麼。 因此,這些內 大括號,事實 我有一個平等 登錄到左邊,這 本質上是創造 一個命令或一個變量, 所謂的X,然後分配 代碼,黃位在那裡。 這可能是像“迴聲 你好“或”說嘟“什麼的 類似的。 但是,如果你的眼睛發現 再漫步到右側, 有更多的這條線比 該分號剛剛結束。 “迴聲脆弱”,然後 除此之外,還有更多的。 另外分號時,bash - C:。 所以長話短說, 這行代碼是 足以令人信服 一台電腦,是 容易被做的事情 你想要它做的事, 因為有在擊即中的錯誤 即使猛砸應該停止 命令正確讀線 後有黃色的文字, 一個20多歲的bug, 巴什實際上已讀 除此之外,分號和漂亮 很多做的是什麼告訴我。 那麼,有什麼寓意 的最終? 我剛才說的“迴聲你好” 或“迴聲脆弱,” 但如果你做了什麼 實際惡意,如室射頻* 你可能不 曾經輸入之前, 坦率地說,你可能 不宜太快, 因為你可以做一個 很多與它的傷害。 為什麼呢? RM做什麼,當然? 刪除。 *意味著什麼? 所有。 所以這是一個所謂的 百搭卡,所以這意味著 在刪除一切 當前目錄。 -r恰好意味著遞歸, 這意味著,如果你刪除了 是一個目錄,並有內 是其他的文件和其他目錄, 遞歸潛入有 並刪除了這一切。 和-f是最糟糕的這一切。 任何人都知道是什麼意思-f在這裡? 力。 所以強制手段,甚至 如果這是一個壞主意, 做到這一點,而不會提示我 為進一步確認。 所以,你知道,我們笑 這一點,但坦率地說,我大概 鍵入此多次 一天,因為現實 是它的最快的方法 刪除一大堆東西。 但是,即使我做了一些損害。 但是,如果你是欺騙電腦 為確定一些愚蠢的變量 或函數調用X,但隨後 欺騙電腦進入執行 超出該界限 功能,超越了分號, 你確實可以欺騙計算機 進入執行類似室射頻 或電郵命令 或複製命令。 凡是從字面上就可以用做 計算機,無論是刪除文件, 創建文件,發送垃圾郵件的人, 遠程攻擊某些服務器, 如果你能表達出來 用命令 可以欺騙計算機變成這樣做。 現在有什麼的一個例子 你怎麼可以這樣做? 嗯,有很多計算機 在互聯網上運行bash。 我們所有的Mac用戶都在其中。 許多Linux服務器中 他們以及和Unix服務器。 Windows再次得到 相對打爆 除非你已經安裝了 特殊的軟件。 現在很多的服務器,為 例如,運行Web服務器, 事實上Linux的也許是 最流行的操作系統 到因特網上的計算機上運行 這是煮好的網頁。 現在,我們將在後​​面看到 在學期中,當 您發送的請求 您browser--鉻, Internet Explorer中,whatever-- 到遠程服務器, 事實證明,即使 你剛才輸入www.example.com, 您的瀏覽器發送消息 這是一個有點神秘的,是這樣的。 但是請注意一點東西奇怪。 前兩行 我從來沒有見過的, 但他們不看 特別危險。 但是請注意,我已經偷 對於這裡的第三行。 如果一個壞傢伙要發送消息 像這樣從他或她的計算機 一個脆弱的Mac或 脆弱的Linux服務器, 有趣的是,猛砸, 這麼簡單的小命令提示符下, 是無所不在的,往往是 使用基本上執行 的內容 它接收消息。 並通過這種邏輯,你可以 欺騙Web服務器,因此, 通過發送類似 用戶代理,通常 應該說 您的瀏覽器的名稱。 用戶代理瀏覽器,用戶代理上網 資源管理器的User-Agent的Firefox,這 只是你的瀏覽器 確定自己的方式。 但是,如果一個壞傢伙很 巧妙地說,毫米毫米,我 不告訴你 什麼我的瀏覽器, 我不是要你送這個 神秘的前瞻性的東西與室射頻 *在裡面,你可以從字面上欺騙 在互聯網上易受攻擊的Web服務器 為正是在執行 有刪除的所有文件。 坦率地說,這不是 即使是最糟糕的。 你可以做任何事情。 你可以啟動一個分佈式 拒絕服務攻擊 如果您收到此消息 Web服務器的整個串 然後讓他們全部下降,為 舉例來說,在Harvard.edu服務器 您可以排序爆炸 赫克了出來 通過這是一個網絡流量 這個壞傢伙,否則觸發。 所以,長話短說,幾乎 每個人都在這個房間裡誰擁有一台Mac 是受到此。 的一線希望是,除非你 在筆記本電腦上運行一個Web服務器, 除非你實際配置 它允許像SSH進去, 你是真正安全的。 它是脆弱的,但沒有 1試圖進入你的筆記本電腦, 這樣你就可以排序的放心。 不過,蘋果將很快 要更新此修復程序。 Linux的世界已經發布 一些修復Fedora和Ubuntu的 和其他版本的Linux,甚至 如果您在設備上運行更新50, 即使是過會 更新和修正。 但也有不 真的是脆弱的, 因為除非你 修補了家電 並公開了你的筆記本電腦 的網絡技術,這是不上訪問 默認情況下,你 其實一直很好,因為 對防火牆和其他技術。 但這是一個錯誤的極端例子 我們已經住在字面上20 多年來,誰知道是否有人 這一切的時候已經知道這件事? 而事實上,這是一 根本的挑戰 我們將在後​​面看到 學期有關安全, 是,就像在真實世界中, 好人都處於劣勢。 為了使壞人,我們必須 確保每個門是鎖著的, 每個窗口是安全的,那 每一個入口點進入家庭 是安全的,以保持壞人。 但到底是什麼壞人要 這樣做實際上損害你的家 從你偷的? 他或她只是要找到一個解鎖 門一破窗戶,還是 沿著這些線路,並且它的 同樣的事情在計算機安全。 我們可以寫幾百萬 的編程代碼行 並花費數百或數千 小時好一會才正確, 但如果你做只有一個 錯誤的正確性, 你可以把整個系統, 實際上在這種情況下,整個互聯網 與世界處於危險之中。 所以,如果你想了解更多 關於這一點,去這個網址在這裡。 有沒有必要採取行動 今晚,除非你 在那些比較舒服的 一直在運行自己的網站 服務器,在這種情況下,你應該, 實際上,更新您的軟件。 而這也是標題 的演講,現在的文件, 我們對所鏈接 當然網站今天。 它是由一個老鄉 名為肯·湯普森,誰 接受了一個非常有名的 獎勵在計算機科學中, 他給了這一番話有些年頭 以前,基本上是在這同一主題。 問人的問題, 如果你真的 信任,最終, 軟件,你已經給? 舉例來說,我們都有 在寫程序, 我們已經編制 他們鏘。 和你的知識,你寫過 任何方案CS50那裡的 各種各樣的後門,有一種方法 一個壞人,如果你運行的程序, 可以接管你的電腦? 或許不會,對吧? 馬里奧和貪婪,以及信用。 這些都是非常小的程序。 你必須非常 如果你真的不好 使你的整個電腦易受攻擊 寫10個或20行代碼後, 或至少​​不知道的一些 對安全的影響。 我說,開玩笑, 但我們要看到今天 而本週它的實際 真的,真的很方便 是壞的,讓即使是 短節目脆弱。 但現在,至少,實現 那在這裡被問的問題 即將鏘的編譯器。 為什麼我們一直相信鏘 在過去兩,三個星期? 誰在說,誰寫鏘 沒有一個“if”條件在那裡 這本質上注入了一些零 和那些到每一個程序在編譯 這將讓他或她訪問 您的電腦,當你睡著了 和你的筆記本電腦的蓋子是打開的 和您的計算機運行的是? 對不對? 我們有這樣的榮譽制度的權利 現在,我們相信鏘是合法的。 你相信這些設備是合法的。 你相信字面上每一個程序 在您的Mac或PC上是值得信賴的。 而作為這個簡單的錯誤提示, 即使它沒有惡意, 這絕對不是 可能是這種情況。 所以,你應該害怕得要命。 坦率地說,有沒有簡單的 解決這個其他 不是某種社會意識 日益增加的複雜性 我們正在構建頂部 我們的電腦系統, 怎麼越來越脆弱 我們很可能是。 現在,隨著中說,突圍。 因此,突圍是設置的問題三, 突圍是從昔日的遊戲 你可能還記得,但 對我們的問題集3, 它使我們能夠 東西回來了一個檔次 所以,當我們在寫程序, 即使是在這樣一個終端窗口, 我們實際上可以運行,最終, 圖形化程序不 不像我們有 訪問的划痕。 因此,這是員工的 實現突圍, 這僅僅是這種磚破 遊戲中,您將您的槳回 來回,你擊出的球 對這些顏色的磚塊往上頂。 因此,這也給我們帶來 排序回哪裡 我們能夠非常迅速地 有划痕的,現在用C, 實現我們自己的 圖形用戶界面。 但更重要的是,這 問題集代表第一 在我們給 你一串代碼。 而事實上,我帶來了明確的 注意這一點,因為特別是 對於那些不太舒服,這 問題集,至少第一眼看上去, 會感覺像 我們已經採取了一個檔次。 因為我們已經給你, 對於一些搜索的 而在PSET排序問題, 一幫我們寫的代碼, 和一對夫婦的意見 該說“做” 你必須填補空白。 所以不要太嚇人,但 這是第一次 我們交給你的代碼,你需要 先閱讀,理解,然後添加到 並完成它。 再與突破, 我們要做的是相同的, 給你幾十多行 的代碼,坦率地說,給你 很多框架的 本場比賽,但站短 在實施磚塊 和球和擋板, 但我們實現一些其他功能。 甚至,在乍看之下,再一次, 尤其是如果不舒服, 似乎特別艱鉅, 你認為有這麼多的新功能 你需要用你的頭腦 四周,這是真的。 但請記住,這是 很喜歡划痕。 奇怪的是,你並沒有使用所有的 在拼圖的划痕。 奇怪的是,你並不在乎包 周圍所有的人你的心 因為所有的花是 看一眼就明白了,呵呵, 這就是我能做的 與拼圖。 事實上,在問題設置 3規格,我們將向您 在文檔會 給你介紹一些新的功能, 最終編程 構建你使用。 條件,循環, 變量和函數 將是相同的,以 我們已經看到迄今。 所以事實上,我們會給 你的是一些示例代碼 讓您創建一個窗口 看起來沒有什麼不同這一點, 並最終把它變成 東西很喜歡這個。 所以要CS50的優勢, 討論上班時間多, 和安慰的事實, 代碼你寫的金額 其實並沒有那麼多。 第一個挑戰是只是為了適應 自己的一些代碼,我們已經寫了。 在pset3任何問題, Shellshock,或以其它方式? 聽眾:這似乎是 與突圍經歷 該代碼是幾乎 一種面向對象的風格, 但我認為C組的 面向對象的程序。 揚聲器1:一個很好的問題。 因此,在翻翻 分配代碼,代碼 我們寫了pset3, 對於那些熟悉的,它 看起來就像是一個 有點面向對象的。 簡短的回答是,這是。 這是如何的近似值 使用可能做的面向對象的代碼 如C語言,但它是 還是最終的程序。 有內部沒有方法 變量,你會看到的。 但是,讓人聯想到這一點。 我們將再次看到那個功能 當我們到PHP和JavaScript 朝結束學期。 但是現在,把它想成 一個什麼樣的暗示來。 這個問題問得好。 好吧。 所以,歸併排序是我們如何 左的東西最後一次。 和歸併排序是涼 某種意義上說,它是如此之快, 至少基於所述粗略測試 我們上週所做的,比說,泡 排序,選擇排序,插入排序。 什麼是整潔也是剛 如何簡潔和乾淨 你可以表達出來。 並沒有說什麼,這是一個上 勢必對合併的運行時間 排序? 是嗎? 聽眾:N日誌N? 揚聲器1:N日誌N吧。 Ñ​​日誌N。 我們會回來的是什麼 真正的意思或者是從何而來, 但是,這是更好的 比運行時間 我們看到了泡沫 選擇和插入排序? 因此n的平方。 Ñ​​平方 大於這個, 即使它不是很明顯, 知道日誌n是小於n, 因此,如果你做了N次 東西小於n, 這將是小於n的平方。 這是一個有點直覺的存在。 但是,我們為此付出了代價。 那是快,但一個主題,開始 上週出現了這種折衷。 我有更好的性能 一次明智的,但 我才不得不花費在其他 另一方面,為了實現呢? 聽眾:內存。 揚聲器1:再說一遍嗎? 聽眾:內存。 揚聲器1:記憶,或 空間比較一般。 而這是不是超 很明顯我們的人, 但記得,我們​​的志願者 是挺身而出,並加強 回來好像有一個數組 在這裡,與作為雖然有 在這裡,第二個陣列 他們可以使用的,因為我們 需要的地方可合併那些人。 我們不能只是交換他們的地方。 所以,歸併排序槓桿 是更多的空間,這 我們並不需要用 其它算法, 但好處是,它的速度更快。 坦率地說,在現實世界中的空間 這些days-- RAM,硬盤space-- 是價格相對便宜,所以這 並不一定是壞事。 因此,讓我們快速瀏覽一下,有點 更有條不紊,在我們所做的事情 為什麼我們說,這是N日誌ñ。 因此,這裡的8號和 8名志願者,我們有最後一次。 和合併的第一件事 排序叫我們做的是什麼? 聽眾:分兩種。 揚聲器1:再說一遍嗎? 聽眾:分兩種。 揚聲器1:分兩種,對吧。 這很容易讓人想起的 電話簿鴻溝, 征服更普遍。 因此,我們看了看左半邊。 再一次,我們說,排序 元件的左半 沒有什麼我們接下來說什麼? 排序左側的左半邊 一半,這使我們能夠, 兩分後, 專注於四個和兩個。 你如何排序的列表現在,在 大小二,使用合併排序的黃色,? 以及分成兩半, 和排序的左半部分。 這是哪裡的東西 有點愚蠢的簡要介紹。 你如何排序的列表是的 大小為一,像這樣的數字4在這裡? 它的排序。 你就大功告成了。 但是你怎麼排序的列表 尺寸之一,當它的兩個數? 那麼,同樣的事情,但現在究竟是什麼 第三和歸併排序的關鍵步驟? 你必須合併左 半部和右半部。 一旦我們這樣做,我們看 下午四,我們看著二人。 我們決定所有的權利, 明明2至上, 所以我們把兩個在其 的地方,後面跟著四個。 現在你有一種倒帶, 這就是那種特性 像合併的算法的 排序,快退在內存中。 什麼是故事的下一行? 我應該把重點放在下一個? 左的右半邊 一半,這是六,八。 所以,我只想通過這個步驟 無需操勞點太多。 六,八,然後六是 整理,八排序。 把它們合併起來那樣, 現在下一大步 是,當然,排序由右半 該算法的第一個步驟。 因此,我們專注於一,三,七,五。 然後,我們專注於左半部。 的該左半側,右半 即,然後合併在一個和三個。 然後右半邊,則左一半 的話,那麼它的右半邊。 合併它,現在哪一步依然? 合併大的左半邊和大 右半邊,所以一去那裡, 然後二,然後三天,4,然後 5,然後6,那麼7,然後8。 所以,現在這是為什麼最終揭示, 特別是如果n和對數多 一般而逃避你, 至少在最近的記憶? 好了,看到這個東西的高度。 我們有八個元素,而我們 除以它由兩個,用兩個,用兩個。 所以日誌基地二期八給了我們三種。 而且相信我,如果 一點點朦朧的說。 但是日誌基地二期八為三, 所以我們做了合併的三層。 而當我們合併 元素,有多少個元素 沒有我們看一下每個這些行嗎? 一共有n個,對不對? 因為合併的頂行 即使我們這樣做,是零碎的, 我們最終感動了每一個數字一次。 和第二行中,以 合併大小兩個的名單, 我們不得不接觸的每個元素一次。 然後在這裡真的 清楚的最後一行中, 我們必須相互接觸那些 元素一次,但只有一次, 所以就在這裡,那麼,我們的n logñ。 而現在只是為了讓事情變得 更正式的就一下,如果你 是目前分析這 在一種更高層次 並嘗試決定,以及如何 也許你去表達 該算法的運行時間 只是看著它,而不是 通過使用一個人為的例子嗎? 那麼,多少時間,你會說 步驟是這樣的黃色會採取, 如果n <2的回報? 這是一個什麼樣的大O? 所以,我看到一個,所以一步到位, 也許兩個步驟,因為它是,如果 然後返回,但它的 固定的時間,對不對? 所以我們說的O(1),這是 我以後怎麼表達這一點。 T,只是運行時間。 n是輸入的大小, 因此T(n)的,只是一種奇特的方式 的說法運行 大小為n的時間給定的輸入 將是在順序上 的恆定時間,在O(1)。 但除此之外,這個怎麼樣? 你會如何表達 運行這個黃線的時間呢? 什麼T' 有種你可以欺騙這裡 週期性地回答我的問題。 因此,如果在運行時間 一般我們只說是T(N)。 現在你種撐船這裡 他說,好了,只是排序的左半部分, 然後排序的右半​​部分。 怎麼可能,我們象徵性地代表 此黃色線的運行時間? 什麼T' 什麼是輸入的大小? Ñ​​了兩個。 為什麼不讓我說? 然後,這是另一個T(N / 2),然後 再次,如果我合併兩個排序的一半, 有多少個元素我要去 有觸摸總? ñ。 所以,我可以表達這一點, 僅僅是種幻想, 如在一般的運行時間。 T(n)為T(N / 2)的僅有的運行時間, 加T(N / 2),左半部和右半部, 加為O(n),這可能是n步, 但也許,如果我用兩個手指, 它的兩倍多 步,但它是線性的。 這步一定數目 這是n倍, 因此,我們可以表達這是這一點。 而這正是現在我們要踢的 回到我們的高中數學教科書 我們認為最終的復發 最終這等於n次日誌N, 如果你真的這樣做了 數學更正式。 所以,這只是兩種觀點。 一個數字用 硬編碼的有代表性的例子 用八個數字,更 總體來看,我們是如何到達那裡。 但是,什麼是真正有趣的在這裡 是再次循環這個概念。 我不使用for循環。 我有點確定 事情的本身而言, 不僅與此 數學函數, 而且在此偽代碼方面。 這個偽代碼是遞歸 在其兩個線 基本上是告訴它去 用自身來解決小 較小尺寸的問題, 然後連連 又一次,直到我們消減它 下降到這個所謂的基本情況。 因此,讓我們實際繪製一個更引人注目 外賣從這個如下。 讓我進入gedit的,並採取 看看今天的一些源代碼, 尤其是這個例子在這裡。 西格瑪0,這顯然增加了 數字1到n。 因此,讓我們看看有什麼熟悉的 和不熟悉的位置。 首先,我們有幾個 包括,所以沒有什麼新的存在。 原型。 我在一點點朦朧 這之後的幾天裡, 但沒有我們說什麼 樣機的功能是? 聽眾:[聽不清]。 揚聲器1:那是什麼? 聽眾:我們公佈。 揚聲器1:我們公佈。 那麼,你是教鏘,嘿嘿, 沒有真正落實這事, 但地方在這個文件中,據推測, 將要被調用什麼函數? 西格瑪。 而這僅僅是一個承諾, 它會是這樣的。 這將需要一個整數作為 input--,我可以更明確 說INTÑ - 並且它的 會返回一個int, 但分號手段,毫米,我會避開 要實現這一稍晚。 再次,鏘是啞巴。 它一定會知道 頂你告訴它底部, 所以我們需要至少給 是一個什麼樣的暗示來。 現在,讓我們來看看主這裡 讓我們在這裡向下滾動並 看到主在做什麼。 這並不是說很長的函數,而 其實這裡的結構很熟悉。 我宣布變量n,然後 我一再糾纏用戶 使用調用getInt正整數, 和唯一的出口退出此循環 一旦用戶已遵從。 這樣做雖然,我們已經用 糾纏以這種方式給用戶。 現在,這是有趣的。 我宣布所謂的int“的答案。” 我給它的返回值 一個所謂的功能“西格瑪”。 我不知道做什麼呢,但 我記得剛才宣布的。 然後我通過在 值,用戶在鍵入N, 然後我就報了答案。 那麼讓我們來回滾 只是一瞬間。 讓我們繼續在這個目錄中,使 適馬0,實際上運行該程序 看看會發生什麼。 所以,如果我繼續運行 這個程序,./sigma-0, 我輸入一個正 就像兩個整數,適馬, 作為希臘象徵意味,只是 要由添加了所有的數 零上最多兩個。 所以,0加1加2。 所以這應該有希望給我3。 這一切都在做。 同樣,如果我跑這又 我給這三個數, 這是3加2,所以這 5,加1應該給我6。 然後,如果我真的瘋了, 開始輸入更大的數字, 它應該給我 越來越大的款項。 因此,僅此而已。 那麼什麼是六西格瑪是什麼樣子? 嗯,這是非常簡單的。 這是我們如何可能實現 這在過去的幾個星期。 “INT”將是返回類型。 西格瑪是名字,它以 可變米替代N。 我頂改變了。 然後,這僅僅是一個全面的檢查。 我們會在某一時刻明白。 現在,我宣布另一個變量, 總之,初始化為零。 然後,我有這樣的For循環 迭代,顯然是為了清楚起見, 從i = 1上長達一個= M,這是 不管用戶輸入的,然後我 增加這樣的總和。 然後返回的總和。 於是幾個問題。 一,我要求我的意見,這 避免了一個無限循環的風險。 為什麼會傳遞一個負數 誘發潛在的,無限循環? 聽眾:你永遠也做不到米。 揚聲器1:永遠達不到米。 但米傳入,讓我們 考慮一個簡單的例子。 如果m是由通過在 用戶為負一。 無論主。 主要保護我們免受 這個也一樣,所以我只是 是真的有肛 適馬也確保 該輸入不能為負值。 因此,如果m是否定的, 像負一。 有什麼事情發生? 好吧,我是要 得到初始化為1, 然後我將是 小於或等於m? 支持。 這was--我們不要, 讓尼克斯這個故事。 我沒有問這個問題,因為 ,我影射的風險 是不會發生的,因為我是 總是會更大than--確定, 我收起了這個問題。 行。 讓我們只專注於這部分在這裡。 為什麼我的一些聲明 循環之外? 上線49我已經通知 í宣布在循環裡面, 但網上48我已經 宣布一些外部。 是啊。 聽眾:[聽不清]。 揚聲器1:當然。 所以,首先我當然不 要聲明和初始化總和 到的零內 環上的每個迭代中, 因為這顯然打敗 總結數的目的。 我會不斷變化 值回零。 還有,什麼是另一個更神秘的 原因是同樣的設計決定? 是啊。 聽眾:[聽不清]。 揚聲器1:沒錯。 我想外面訪問 中環過上什麼線? 53。 而根據我們的經驗法則 從一對夫婦的講座前, 變量的作用域,說真的,到 大括號,涵蓋他們。 所以,如果我不內聲明的總和 這些外花括號, 在第53行,我不能使用它。 換句話說,如果我宣布 在這裡,或者甚至在總和 For循環,我不能訪問它的53。 該變量將有效地去了。 所以有幾個原因在那裡。 但現在,讓我們回到 看看會發生什麼。 因此適馬被調用。 它增加了1加2或1加2 加3,然後將返回值, 它存儲在回答,這裡的printf 所以我看到在屏幕上。 所以,這就是我們稱之為迭代 方法,即迭代只 意味著使用一個循環。 for循環中,While循環中,DO WHILE 環路,只需再次做某事 一次又一次。 不過,西格瑪是一種整齊的功能 我可以有不同的實現它。 那麼這一點,這 僅僅是種很酷, 讓我真正擺脫 很多分心的 因為這個功能 是很簡單的。 讓我們來消減下來只 其四芯線 和擺脫所有的 意見及大括號。 這是怎樣的一個令人興奮的 另一種實現。 好吧,也許不是令人興奮的, 但它是一種性感,沒事的, 看看這如此多的更簡潔。 只有四行代碼, 我第一次有這種全面的檢查。 如果m小於或等於 為零,標準差是沒有意義的。 它不僅應該在 這種情況下為正數, 所以我只是要 返回零隨意 所以,我們至少有 某些所謂的基本情況。 但這裡的美景。 這種思想的全部,加上 從1數到n,m或在這種情況下, 可以通過一種推卸責任的完成。 那麼,什麼是1到m的總和? 那麼,你知道嗎? 這是相同的m的總和 加1〜m減1的總和。 嗯,你知道嗎? 什麼是m減1西格馬? 好吧,如果你種按照此 在邏輯上,這是一樣的m減1 加上m減2倍標準差。 所以,你可以種只是 - 這就好比,如果你只是 試圖惹惱朋友 他們問你一個問題, 你種一個問題作出回應, 種你可以保持互相推諉。 但是,什麼是關鍵的是,如果你繼續 使問題越來越小 小,你 不是問什麼是六西格瑪 n的什麼的西格瑪 N,什麼是n個西格瑪? 你問什麼 n個西格瑪,什麼是六西格瑪 正減1,什麼是正減去2倍標準差? 最終,你的問題 將會變成什麼樣? 什麼是一個或西格馬 零,一些非常小的值, 而只要你 得到,你的朋友, 你是不是要問 再次同樣的問題, 你只是會說,哦,這是零。 我們就大功告成了玩這種 愚蠢的循環遊戲。 因此,遞歸是編程的行為 函數調用自身。 這個程序,編譯和運行的時候,是 要表現完全相同的方式, 但什麼是關鍵的是,內 一個名為西格瑪功能, 有一行代碼,其中 我們調用我們自己, 一般來說,這是不好的。 舉例來說,如果我有什麼第一 編撰了這本,所以請sigma-- 使西格瑪1 ./sigma-1。 正整數,請50 1275。 那麼,什麼功能似乎 是基於一個試驗中,正確的。 但如果我得到一點點危險 和刪除所謂鹼的情況下, 而只是說,好吧,我只是做 這比它更複雜的。 讓我們只計算西格瑪 通過取米,然後加 在米減一西格瑪? 那麼,什麼會發生在這裡? 讓我們縮小。 讓我們重新編譯程序, 保存,重新編譯程序, 然後準備./sigma-1放大, 進入正整數,請50。 你們有多少人願意 以明說看到嗎? 行。 因此,這可能發生在 由於多種原因, 坦白地說,本週我們 約給你更多的人。 但在這種情況下,嘗試 向後推理 什麼可能在這裡發生了什麼? 分段錯誤,我們所說的最後 時間,是指內存的段。 壞事發生。 但究竟是什麼 機械的偏差去 在這裡,因為我的去除 的即所謂的鹼的情況下, 在我返回一個硬編碼的值? 你覺得哪裡出了問題? 是啊。 聽眾:[聽不清]。 揚聲器1:嗯。 這個問題問得好。 如此數量的大小 我是總結 有這麼大,它超過了 的存儲器空間的大小。 想法很好,但沒有從根本上 會導致崩潰。 這可能會導致整數溢出, 其中位剛剛空翻多 然後我們誤以為一個真正的大 像負數數, 但本身並不會導致崩潰。 因為底了 一天一個int仍然是32位。 你不會 不小心偷了第33位。 但一個好的想法。 是啊。 聽眾:[聽不清]。 揚聲器1:本方法 從來沒有停止運行, 而事實上它再次調用自身 一次又一次又一次 並且再次,與沒有 這些功能不斷 完成,因為他們唯一的行 碼一再呼籲自理 又一遍。 什麼是真正 這裡發生的,現在我們 種可以得出這樣的圖示方式。 讓我去了一個 圖片只是一瞬間。 這是一個圖片,那 最終將充實 在更多的細節,這是怎麼回事 在你的計算機內存。 而事實證明,在 這幅畫的底部 一種叫做堆棧。 這是一大塊 內存的RAM塊, 這只是用於任何時間 一個函數被調用。 任何時候你,程序員, 調用一個函數, 操作系統,如 的Mac OS,Windows或Linux中, 抓起一串字節,也許是 幾KB,也許幾兆 內存,遞上 給你,然後讓 您使用的是運行你的函數 任何變量,你需要的。 如果你再調用另一個 功能與其它功能, 你的內存另一片 和記憶另一片。 事實上,如果這些綠色托盤 從安嫩伯格代表內存, 這裡就是發生在第一 一次調用函數標準差。 這就像把一盤這樣的 什麼是最初一個空棧。 不過,如果該紙盤 自稱,可以這麼說, 調用另一個實例 適馬的,這是 像詢問操作系統, 哦,需要多一點的內存, 給我。 然後它就會在上面堆。 但是,什麼是這裡的關鍵是, 第一盤仍然存在, 因為他援引這第二盤。 現在同時,SIGMA適馬打電話, 這就像要求更多的內存。 被堆在了這裡。 適馬適馬稱,這是另一個 托盤被堆在這裡。 如果你繼續這樣做, 最終,種地圖這種視覺 該排行榜,什麼事情 發生與該堆托盤? 它是將超過的量 內存您的計算機。 而一旦這個綠色托盤 超過水平線 上面的堆棧和上面那個字堆, 我們會回來的,在未來, 這是一件壞事。 堆是不同的 內存部分, 如果你讓這些 盤樁與樁, 你要超越 你自己的部分記憶, 和程序確實要崩潰。 現在,順便說一句,這個想法 遞歸的,因此 可以清楚地導致的問題,但 它不一定是壞事。 由於考慮後, 總之,how--,也許 這需要一些時間來 - 如何以優雅的或者多​​麼簡單 在實施六西格瑪的了。 而且我們不打算使用 遞歸的CS50所有的東西, 但在CS51,真是任何類 在那裡你操作的數據結構 如樹或家譜, 有一些層級 這是超級,超級有用。 現在,作為一個一旁,讓你 作為有抱負的計算機科學家 熟悉一些谷歌的了 裡面的笑話,如果你去谷歌 你查查是什麼 中,定義說,遞歸,進入。 嗯。 順便說一句,我拉了幾下。 這是像10分鐘 拖沓今天早上。 如果你也是谷歌“歪”的通知 通過傾斜你的頭slightly-- 然後這個人是可能 最殘暴的是 既然有人喜歡花 他們一天執行本 幾年ago--來吧。 哦,wait--這是一個錯誤。 因此,對一個運行 世界上最大的網站 這些愚蠢的小彩蛋。 他們可能消耗 代碼的行數平凡 只是讓我們可以有 小樂這樣的事情。 但至少現在你 其中的一些內部笑話。 現在,讓我們來看看一些 善意的謊言,我們一直叫晚, 並開始剝離回 一些技術上層 讓你真正了解 什麼是怎麼回事 你能理解 一些威脅, 像Shellshock,那 現在已經開始成為 在每個人的前列 注意,至少在媒體。 因此,這裡是一個非常簡單的功能 不返回任何內容無效。 它的名字是交換。 它需要在兩個變量 它沒有返回值。 把A和B。 因此,一個快速演示。 我們把這些了。 我們不妨取一點 打破這裡只是一瞬間 並有一個小東西喝。 如果有人不介意加盟 我在這裡只是一瞬間。 你怎麼樣了棗紅色的襯衫? 上來吧。 只是一個今天。 謝謝你,雖然。 好吧,我們有 來了誰在這裡? 你叫什麼名字? 揚聲器4:勞拉。 揚聲器1:勞拉。 上來吧。 所以勞拉,今天很簡單的挑戰。 很高興見到喲。 好吧。 因此,我們有一些牛奶在這裡 我們有一些橙汁在這裡 有的杯子,我們 從安嫩伯格今天借來的。 揚聲器4:借來的。 揚聲器1:而且要繼續前進 給你的這半杯。 好吧。 我們會給你一半 一杯牛奶。 呵呵,只是這樣就可以 還記得這是什麼樣子, 我還記得帶 這和今天。 好。 如果你不介意的話,讓我們來看看,我們 可以把他們交給自己的眼鏡 如果你想。 這將是從勞拉眼中的世界。 好吧。 所以你的目標,考慮到兩杯 液體此處,牛奶和橙汁, 被交換兩個內容,這樣 橙汁進入牛奶杯 和牛奶進入 橙汁一杯。 揚聲器4:我得再來一杯? 揚聲器1:我很高興你問,但 這本來是更好的素材 如果你沒有問。 但是,是的,我們可以為您提供三分之一 杯那是當然的空白。 好吧。 因此,交換的內容在那裡。 很不錯。 挺好。 你這樣做非常仔細。 和第三步。 好吧。 優秀的。 熱烈的掌聲中 將是很好的勞拉。 好吧。 我們有一點點臨別禮物 你,但讓我把這些。 太謝謝你了。 因此,一個簡單的例子,不過, 證明,如果你做 想交換的內容 兩個容器中, 還是讓我們稱他們為變量, 你需要一些臨時存儲 在這樣階段的內容之一。 你實際上可以做交換。 所以事實上,這個源代碼在這裡在 C是代表正是中。 如果橙汁是和牛奶 是B,我們想交換兩個, 你可以嘗試一些創造性的工作 通過傾一方轉換成另一方, 但是這可能不會 結束特別好。 因此,我們採用了第三杯,通話 它TMP,T-M-P按照慣例, 放的內容 辛普森在那,然後換一個杯子, 然後把辛普森進入 原盅,從而 實現,正是因為 勞拉那樣,交換。 因此,讓我們這樣做。 讓我繼續前進,開 了一個例子,是 其實所謂的“無 交換,“因為這不是 因為只是照你的想像。 所以這個計劃,請注意 我使用的是stdio.h中,我們的老朋友。 我有原型 用於交換在那裡,這 指其實施的 可能向下跌破, 讓我們看看這個主 程序會為我做。 我第一次申報詮釋x變 之一,詮釋y得到兩張。 因此,認為那些是辛普森的 和牛奶分別。 然後,我只是有一個 printf的話說,x是該 和y是這樣的,只是讓我可以 直觀地看到發生了什麼事情。 然後,我的printf自稱 那我換了兩下, 然後我打印出 聲稱他們交換, 我再次打印出x和y。 這樣下來在這裡互換是 正是勞拉做了, 我們看到了什麼 剛才的畫面。 因此,讓我們繼續前進, 大失所望。 毫無互換,並運行沒有掉, 在輸出放大在這裡。 輸入x為1,y為2,交換交換。 x是靜止1,且y是靜止2。 因此,即使坦白地說,這看起來 一模一樣,雖然技術上更, 什麼勞拉一樣,似乎並沒有工作。 那麼,為什麼會這樣呢? 嗯,事實證明,當 我們寫這樣的程序 同時具有主,在這裡強調, 然後另外一個功能,如交換, 在這裡強調,這 它調用的世界 看起來有點像 這些托盤剛才。 當主第一次被調用, 這就像問操作系統 在任何地方一點點記憶 如x和y的主要有變量, 他們最終在那裡。 但是,如果主電話交換和主 通過交換兩個參數a和b, 橙汁和牛奶,不喜歡 遞給了橙汁和牛奶 勞拉。 什麼是電腦呢,就是它 經過橙汁的副本 牛奶勞拉和副本,從而使 什麼是最終這盤內 為值1和2,或OJ 以及它們的牛奶,但副本, 所以,在這一點 在故事中,有 是辛普森和牛奶中的每一個托盤。 有一個和兩 在每個這些托盤, 和交換功能確實工作。 它的內部交換他們 第二最上面的托盤的, 但該交換沒有任何影響。 並根據只是一些 我們已經基本原理 談到前,確實 短短的幾個小時前,有什麼 或許可以解釋為什麼改變 A和B交換內 對x和y的任何影響,即使 我通過x和y的調劑功能。 什麼是這裡的關鍵詞 可以簡單地解釋一下嗎? 我想我在這裡聽到了嗎? 聽眾:返回。 揚聲器1:回報? 不歸。 讓我們一起去另一個。 那是什麼? 聽眾:[聽不清]。 揚聲器1:好了,return--我們可以 做復出之作中的故事, 但還有一個更簡單的解釋。 聽眾:適用範圍。 揚聲器1:適用範圍。 我帶的範圍。 所以範圍,記得在哪裡 我們的x和y的聲明。 他們中聲明 的主力右在這裡。 a和b,同時,有 有效申報 掉在裡面,不是很 大括號,但仍 在交換的一般地區。 所以實際上,A和B 僅此托盤中存在 從安嫩伯格,這個 代碼的第二塊。 因此,我們確實改變了副本,但 這不是真的那麼有用。 因此,讓我們一起來看看 這個低一點的水平。 我要回去到 在源目錄, 而我要第一 放大這裡,只是 確認我在這 更大的終端窗口, 該程序的行為仍然這樣。 現在假設這 是不是故意的。 很明顯,我想互換 工作,所以感覺就像一個錯誤。 現在我可以開始添加 很多的printf的我的代碼, 這裡打印出倍過,Y在 在這裡,在這裡,B在這裡。 但坦率地說,這可能是什麼 你已經做了幾個星期的 現在,在辦公時間 而在家裡工作時, 在pset時試圖找到一些錯誤。 但是你會看到,如果你還沒有, 這個問題設置3為您介紹 一個叫做GDB命令, 其中GDB,GNU調試器, 有自己一大堆 的功能,實際上可以 讓我們了解的情況 像這樣的,但更令人信服, 解決問題和發現的bug。 所以,我要做到這一點。 相反./noswap的,我不是 要運行GDB ./noswap。 換句話說,我要執行我的 程序不是在Bash中,我們的新朋友 今天。 我要我跑 節目noswap內 這個所謂的其他程序 廣發行,這是一個調試器,它 是的,旨在幫助計劃 你們人類找到並刪除錯誤。 所以,如果我打在這裡運行,有 文字的殘暴量 你真的從來沒有閱讀。 它本質上是一種干擾 從提示, 我會打控制-L 起床,在那裡的頂部。 這是GDB的提示。 如果我想現在運行這個程序, 作為今天的這個小小抄 幻燈片顯示,潤是第一 命令,我們打算引進。 我只是要輸入 跑起來這裡的GDB內, 而事實上它跑了我的計劃。 現在有一些額外的 像這樣的屏幕的輸出 但是這GDB只是被肛 並告訴我們發生了什麼事情。 你真的不擔心 這些細節現在。 但是,什麼是真正酷的 GDB的,如果我這樣做again-- 控制-L清除screen--讓我走 進取,鍵入“破為主,”因此, 當我按下Enter鍵,設置什麼 所謂的noswap.c一個破發點, 線16,這是其中GDB 想通了,我的計劃實際上 是,我的功能實際上是。 為此,我們將忽略現在 但是這是地址 在存儲器具體的該功能。 所以,現在當我鍵入run, 發現什麼是酷在這裡。 我的程序違反的線I 對廣發行在暫停執行。 所以,我不必改變現在我的代碼, 加一些printf的年代,重新編譯,重新運行 它,改變,添加一些的printf的, 保存,重新編譯,運行它。 我可以走過我的程序 在人類的速度一步一步一個腳印, 不是在英特爾內部的那種速度。 所以,現在看到這條線 出現在這裡了,如果我回去 我在gedit中的程序, 請注意,這實際上是 的第一行代碼。 有gedit中第16行。 有16行GDB中,甚至 雖然這黑白界面 是不是幾乎一樣的用戶 友好的,這意味著 該線路16還沒有被執行 然而,但它即將被。 所以,如果我輸入打印的確 X,不是printf的,只是打印的x, 我得到了一些零假值出現, 因為X有沒有被初始化。 所以我打算接下來的輸入,或者,如果你 想成為幻想,只是n轉到下一個。 但是當我輸入下一個進入,現在 注意到它移動到第17行。 所以,從邏輯上講,如果我執行 第16行,我現在輸入打印X, 我應該怎麼看? 之一。 而現在,這是無可否認的混亂。 2美元是只是一種奇特的方式,如果你 希望以後參考該數值, 你可以說“美元簽兩個。” 這就像一個向後引用。 但是現在,就忽視它。 有趣的是什麼 等號右邊。 而現在,如果我明年再次鍵入 和打印Y,我看到2。 我也可以開始打印 點¯x再次,​​坦白說, 如果我開始有點困惑, 我在哪裡,我可以輸入清單列表 ,只是看到周圍的一些環境 點我其實在。 現在我可以鍵入 接下來,有x是1。 現在我輸入下一個。 哦,y為2。 再次,它是混亂的, 因為GDB的輸出 被混合用我自己的輸出。 但是,如果你要記住,通過 一眼來回你的代碼 或者鋪設了一面 並排也許,你會 看到真的我只是 步進通過我的節目。 但是請注意,接下來會發生什麼,從字面上。 這裡是第22行。 讓我過目一下,從而使上 23,如果我打印點¯x現在,依然之一。 如果我現在打印Y,依然之一。 所以,這不是一個有用的練習。 因此,讓我們重做了。 讓我回去到 頂部和類型來看一次。 和它說程序 這是正在調試 開始已經, 從頭開始。 是的,讓我們再次做到這一點。 而這一次,讓我們做下一個, 下一步,下一步,下一步,下一步, 但現在事情變得有趣。 現在我想踏入 掉,所以我不鍵入下一個。 我輸入的步驟,現在發現它 已經躍升我noswap.c線33。 如果我回去gedit的,什麼是33行? 這是第一個實際 代碼行互換的內部。 這是很好的,因為現在我可以 種閒逛,讓好奇的 至於什麼是真正打算在那裡。 讓我打印TMP。 哇。 為什麼TMP有一些 瘋了,假的垃圾的價值? 聽眾:它沒有被初始化。 揚聲器1:它沒有被初始化。 事實上,當你運行一個程序, 你給出一大堆的記憶 由操作系統,但你 未初始化的任何值, 所以你什麼位 看到這裡,即使它 這個瘋狂的大利空 數,只是表示 這些都是從殘存 一些以前使用的內存, 即使我有沒有 我需要它。 所以,現在我要繼續和類型 接下來,如果我現在輸入打印TMP, 我應該怎麼看? 無論a的值, a是第一個參數,只是 如x是第一 東西被傳遞, 所以A和X應該是相同的, 所以打印TMP應打印我一個。 所以,你會在問題集中看 三是各種各樣的GDB教程, 但要意識到,這是開始 看一個工具,它將真正 幫你解決問題 這樣更有效。 我們最終是什麼 要做到週三 在開始剝開幾層 並刪除了一些輔助輪。 這東西叫字符串 我們已經使用了一段時間, 我們要慢慢的把這種美麗 從你開始談論 更多的東西esoterically 被稱為字符*, 但我們要做到這一點不錯, 輕輕地在第一,即使指針 因為他們是所謂的,可以做一些 如果濫用非常糟糕的事情, 通過觀察從一個小粘土動畫 我們的朋友尼克Parlante斯坦福 大學計算機教授 學誰放在一起這個預覽 對什麼樣的來本週三。 [視頻回放] 嘿,賓基。 醒來。 現在是時候為指針樂趣。 - 什麼是什麼? 了解指針? 噢,好極了! [完視頻回放] 揚聲器1:那等著你在星期三。 我們會看到你呢。 [視頻回放] - 和現在,深層的思考, 通過Daven法納姆。 - 為什麼我們要學C? 為什麼不是A +? [笑] [完視頻回放]