<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          為什么編程第一課都要學(xué)Hello World?

          共 3649字,需瀏覽 8分鐘

           ·

          2022-11-03 22:47

          ??點(diǎn)擊“博文視點(diǎn)Broadview”,獲取更多書訊


          “Hello World”在編程的世界里是個(gè)“?!?,說(shuō)的是所有教編程的老師在第一節(jié)課都會(huì)讓學(xué)生們?cè)谟?jì)算機(jī)屏幕上輸出一個(gè)“Hello World!”。

          瑞問(wèn):“為什么第一節(jié)課都要學(xué)‘Hello World!’?”

          其實(shí),在計(jì)算機(jī)屏幕上輸出一個(gè)什么東西,并不是編程語(yǔ)言天然該有的功能。因?yàn)橛?jì)算機(jī)發(fā)明的最初目的,只是能夠快速運(yùn)算,所以,C 語(yǔ)言發(fā)明的時(shí)候,也將注意力放在如何運(yùn)算上。但很快,人們就發(fā)現(xiàn),計(jì)算機(jī)運(yùn)行了程序、做了運(yùn)算,卻不知道如何將結(jié)果告訴我們。這就意味著,無(wú)論運(yùn)算能力有多強(qiáng)大,如果不能把結(jié)果告訴我們,那么這個(gè)運(yùn)算都毫無(wú)意義。于是,讓計(jì)算機(jī)把運(yùn)行結(jié)果顯示出來(lái),就成了編程的首要任務(wù)。


          瑞問(wèn):“有道理!那么,計(jì)算機(jī)到底怎么在屏幕上顯示內(nèi)容呢?”

          計(jì)算機(jī)發(fā)展的早期,有過(guò)很多顯示方案,最終人們發(fā)現(xiàn),顯示器是最棒的輸出設(shè)備。然而,把內(nèi)容顯示到顯示器上,并不容易。顯示屏上密密麻麻地布滿了點(diǎn),我們稱其為像素點(diǎn)。這些像素點(diǎn)的亮與滅形成了顯示器上的圖案,比如,我們要顯示“5”,在顯示器上顯示的是 5 的圖像點(diǎn)陣。將 5 這個(gè)數(shù)字轉(zhuǎn)換成圖像點(diǎn)陣,是一個(gè)復(fù)雜的過(guò)程。

          然而,把要顯示的內(nèi)容傳輸?shù)斤@示器上,這個(gè)過(guò)程更復(fù)雜。我嘗試著將這個(gè)過(guò)程簡(jiǎn)單地描述出來(lái):顯示器上的像素點(diǎn),是和存儲(chǔ)器的某個(gè)區(qū)域?qū)?yīng)的。存儲(chǔ)器其實(shí)分為兩個(gè)類型,有一類存儲(chǔ)器處于計(jì)算機(jī)最核心的位置,稱為內(nèi)存。程序操作內(nèi)存很容易。將需要顯示的內(nèi)容放在內(nèi)存里,計(jì)算機(jī)里的一個(gè)硬件裝置叫顯卡,它負(fù)責(zé)將那段內(nèi)存區(qū)域的內(nèi)容轉(zhuǎn)移到顯示器對(duì)應(yīng)的像素點(diǎn)。

          在計(jì)算機(jī)發(fā)展的早期,人們要顯示的內(nèi)容比較簡(jiǎn)單,現(xiàn)在變得越來(lái)越復(fù)雜了,我們不僅要輸出給顯示器,還有打印機(jī)、耳機(jī),未來(lái)肯定會(huì)出現(xiàn)更多輸出設(shè)備。當(dāng)時(shí),每增加一個(gè)輸出設(shè)備,就要修改計(jì)算機(jī)硬件設(shè)計(jì),專門支持新設(shè)備,這太麻煩了,所以人們想到了更好的辦法。計(jì)算機(jī)只需將信息從內(nèi)存送到外邊,這個(gè)操作統(tǒng)稱為輸出。在設(shè)計(jì)計(jì)算機(jī)的時(shí)候,所有的輸出設(shè)備一視同仁,不針對(duì)具體設(shè)備進(jìn)行專門的設(shè)計(jì),新發(fā)明的輸出設(shè)備自己想辦法用合適的方式顯示,這樣計(jì)算機(jī)的設(shè)計(jì)就簡(jiǎn)化了下來(lái)。輸入設(shè)備也用了同樣的設(shè)計(jì)方案,組合在一起簡(jiǎn)稱 I/O(Input/Output)。

          瑞說(shuō):“聽起來(lái)相當(dāng)復(fù)雜,不好理解。”

          把東西顯示到屏幕上,很復(fù)雜,需要幾百行的程序,初學(xué)者根本不可能完成這樣的任務(wù)。好在有編程的前輩把那一大堆程序統(tǒng)一成一個(gè)叫 printf()的程序。我們只要在程序里寫“printf()”,就能將結(jié)果輸出到顯示器上。而至于這幾百行程序在處理什么,以及其間發(fā)生什么事情,我們不需要關(guān)心。

          瑞問(wèn):“printf 后面有兩個(gè)小括號(hào),那是干什么的?”

          printf 告訴計(jì)算機(jī)即將顯示東西,而括號(hào)中的信息就是我們需要顯示的內(nèi)容。小括號(hào)是個(gè)不錯(cuò)的設(shè)計(jì),看上去像是填空題,例如,運(yùn)行 printf("Hello World!"),就能在顯示器上顯示出“Hello World!”。另外,還有一點(diǎn)需要提醒,printf()不是C 語(yǔ)言自身的功能,所以你還需要再寫一句話“#include<stdio.h>”,告訴程序:我需要使用 stdio.h 里面的輸入輸出功能。

          還有一些細(xì)節(jié),我需要進(jìn)一步解釋一下。在 C 語(yǔ)言中,單詞拼寫正確、大小寫正確,十分重要。在嚴(yán)謹(jǐn)?shù)挠?jì)算機(jī)中,“A”和“a”是完全不同的東西。編程語(yǔ)言的初學(xué)者,常常會(huì)在大小寫上出錯(cuò)。為此,有些編程語(yǔ)言人性化地不區(qū)分大小寫,但是這個(gè)“人性化”會(huì)增加計(jì)算機(jī)的計(jì)算負(fù)擔(dān),在 C 語(yǔ)言被發(fā)明的年代,計(jì)算機(jī)硬件性能完全不足以提供這樣的“人性化”。

          瑞問(wèn):“stdio.h 是個(gè)名字嗎?”

          #include 可以解釋成“我需要使用別人的程序”。需要使用的程序放在<>中。stdio.h 僅僅是一個(gè)名字。但是你能看到一個(gè)優(yōu)秀的程序員在起名字的時(shí)候,會(huì)盡可能讓別人一眼看懂,如 std 是英文 Standard(標(biāo)準(zhǔn))的縮寫,i 和 o 分別代表 Input(輸入)和 Output(輸出)。

          還記得我前面解釋程序是什么的時(shí)候說(shuō)過(guò),給人一張紙,上面寫了很多命令,人會(huì)照著去做。人的習(xí)慣是從紙的第 1 行開始向下看,而計(jì)算機(jī)不是這樣的,它會(huì)尋找一個(gè)特定的位置執(zhí)行你所寫的程序。我們將這個(gè)位置稱為程序的入口。

          瑞問(wèn):“程序入口怎么寫?是規(guī)定好的嗎?”

          我們買回家的計(jì)算機(jī),本身已經(jīng)包含了一些程序,其中最重要的程序就是操作系統(tǒng)。我們使用計(jì)算機(jī)時(shí)下達(dá)的每條命令,都會(huì)被操作系統(tǒng)獲取并翻譯成由計(jì)算機(jī)硬件執(zhí)行的一系列動(dòng)作。而我們編寫的程序,也是運(yùn)行在操作系統(tǒng)這個(gè)程序之上的??梢赃@么理解:操作系統(tǒng)就是一個(gè)太空的空間站,我們所編寫的程序是要到達(dá)這個(gè)空間站的飛船;無(wú)論是哪個(gè)國(guó)家的飛船,無(wú)論是貨運(yùn)飛船還是客運(yùn)飛船,都需要和空間站連接在一起。

          要連接,就需要一個(gè)接口。C 語(yǔ)言所編寫的程序和操作系統(tǒng)之間的接口的名字叫作 int main(){},這是一個(gè)標(biāo)準(zhǔn)的寫法,因?yàn)榻涌诰褪沁@么定義的,你會(huì)看到其中也有一對(duì)小括號(hào)。隨著學(xué)習(xí)越來(lái)越深入,你會(huì)發(fā)現(xiàn) C 語(yǔ)言里有一些規(guī)則,有助于我們觸類旁通地去理解另外一個(gè)地方出現(xiàn)的相同符號(hào)。這里的小括號(hào)也是允許你填寫信息的?,F(xiàn)在我們并不需要填什么,但是即便什么都不填,小括號(hào)也必須寫。

          后面還有一對(duì)大括號(hào),你跟計(jì)算機(jī)說(shuō)的話、編寫的程序都放在這對(duì)大括號(hào)里。思考一下,如果由你來(lái)設(shè)計(jì) C 語(yǔ)言,是否有更好的方案?其他的編程語(yǔ)言確實(shí)也有不同的做法,不過(guò)不同的做法各有優(yōu)缺點(diǎn),{}的設(shè)計(jì)其實(shí)還不錯(cuò)。

          瑞說(shuō):“接口為什么要有小括號(hào)?我還是不明白?!?/span>

          這個(gè)目前先當(dāng)成固定寫法記住,時(shí)間久了才能理解。



          我們現(xiàn)在的任務(wù)就是在屏幕上顯示“Hello World!”,那么完整的程序是這個(gè)樣子的。

          #include <stdio.h> int main() {  printf("Hello World!"); }

          瑞問(wèn):“看起來(lái)怪怪的,一定要按照這樣的格式寫嗎?”

          這個(gè)程序?qū)懥撕芏嘈?。把它們?nèi)慷紝懺谝恍兄?,?jì)算機(jī)是認(rèn)識(shí)的,但是這樣看上去不夠優(yōu)雅。雖然對(duì)于計(jì)算機(jī)來(lái)說(shuō),優(yōu)雅并不重要,但是優(yōu)秀的程序員會(huì)遵循一些規(guī)則,努力地把自己的程序?qū)懙脙?yōu)雅。

          你會(huì)發(fā)現(xiàn),printf()后面有一個(gè)分號(hào),分號(hào)代表我們跟計(jì)算機(jī)說(shuō)的一句話結(jié)束了,這是必須寫的。其他幾行末尾沒有分號(hào),是因?yàn)槟切┬械恼Z(yǔ)句都是編寫這個(gè)程序的準(zhǔn)備動(dòng)作,而不是真正的指令。還記得編譯器嗎?分號(hào)對(duì)編譯器而言非常重要。編譯器在“翻譯”時(shí)是一句話一句話地處理的,分號(hào)是一句話結(jié)束的標(biāo)識(shí)符,是需要讓編譯器識(shí)別的。

          前面說(shuō)過(guò),printf 后邊的括號(hào)里放的是我要輸出的內(nèi)容,今天我要輸出的“Hello World!”對(duì)于 C 語(yǔ)言來(lái)說(shuō)是一句話。而一句話需要放在英文的雙引號(hào)里。放在雙引號(hào)里的內(nèi)容,稱為字符串。這樣就會(huì)讓編譯器處理成在顯示時(shí)將原文輸出。

          瑞問(wèn):“哦!我明白了,都不能寫錯(cuò),問(wèn)題是程序怎么能寫到計(jì)算機(jī)里呢?”

          現(xiàn)在,你需要想辦法將這段程序輸入計(jì)算機(jī)。所有的文本編輯器都可以用來(lái)輸入程序,計(jì)算機(jī)自帶的記事本就能完成這個(gè)工作。而 Word 并不是一個(gè)標(biāo)準(zhǔn)的文本編輯器,因?yàn)樗峁┝颂嗟墓δ堋?/span>程序輸入的“標(biāo)準(zhǔn)范式”,就是要使用純文本編輯器。

          瑞問(wèn):“我寫完了,前面說(shuō)過(guò)的編譯器,計(jì)算機(jī)里有嗎?”

          瑞說(shuō):“現(xiàn)在可以開始寫程序了,我寫的程序也應(yīng)該有個(gè)名字吧?”

          瑞問(wèn):“C 語(yǔ)言的擴(kuò)展名是什么?”

          瑞問(wèn):“控制臺(tái)又是什么?”

          瑞問(wèn):“編譯好了怎么運(yùn)行呢?

          。。。。。。

          以上來(lái)自一位從未接觸過(guò)計(jì)算機(jī)編程的小學(xué)生提問(wèn),作者嘗試站在編程語(yǔ)言發(fā)明者的角度來(lái)回答,提問(wèn)有趣活潑,從不懂計(jì)算機(jī)編程到能參加信息學(xué)奧林匹克比賽;回答清晰深刻,描述正確的編程思維并能學(xué)以致用!


          作者把孩子帶到發(fā)明C語(yǔ)言的年代,與孩子一起面對(duì)計(jì)算機(jī)科學(xué)發(fā)展道路上遇到的一個(gè)個(gè)難題和挑戰(zhàn),假設(shè)我們就是當(dāng)年的計(jì)算機(jī)科學(xué)家,思考我們會(huì)如何解決這些問(wèn)題;討論假如C語(yǔ)言是我發(fā)明的,我是否還會(huì)發(fā)明這些規(guī)則。

          這本書并沒有簡(jiǎn)單地迎合孩子想要的趣味案例,而是針對(duì)C語(yǔ)言和計(jì)算機(jī)科學(xué)進(jìn)行深入的探討,給孩子帶來(lái)好奇心的滿足和成就感,這樣的引導(dǎo)會(huì)讓孩子更高效、深入地理解C語(yǔ)言,為未來(lái)學(xué)習(xí)更加復(fù)雜的算法打下堅(jiān)實(shí)的基礎(chǔ),助力孩子攀登信息學(xué)奧林匹克競(jìng)賽高峰。

          每一個(gè)孩子都該學(xué)習(xí)編程,信息學(xué)奧林匹克競(jìng)賽是對(duì)學(xué)有余力孩子的智力挑戰(zhàn),孩子是否有這個(gè)方向的天賦,需要通過(guò)機(jī)會(huì)嘗試一下。

          這本書有非常好的可讀性,完全可以送給孩子享受駕馭計(jì)算機(jī)的快樂!

          贈(zèng)書規(guī)則

          活動(dòng)方式在本公眾號(hào)后臺(tái)文章留言累計(jì)300次(PS:一篇文章算留言一次,后臺(tái)有數(shù)據(jù)統(tǒng)計(jì)的,本號(hào)有1500余篇文章,歡迎留言支持),滿足留言次數(shù)也可以免費(fèi)獲得一本贈(zèng)書,包郵哦!

              活動(dòng)時(shí)間:截至11月2日20點(diǎn)(周三)不見不散。

              快快拉上你的小伙伴參與進(jìn)來(lái)吧~

          讓我知道你在看

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  三级片香港三级片久久久 | 日韩小穴| 做爱网站免费观看 | 麻豆回家视频区一区二 | 自拍影音先锋 |